Railsの開発環境でAWSサービスを使うとminioの設定とAws.configの競合が発生する


まとめ

ローカルの開発環境でminioを使いながらAWSのcredentialを同時に扱うことは難しそう

なので、各サービスのクライアント生成時にcredential情報を渡すことになるかも

config/initializers/aws.rb

creds = Aws::Credentials.new(
  Rails.application.credentials[:aws][:access_key_id],
  Rails.application.credentials[:aws][:secret_access_key]
)

region = Rails.application.credentials[:aws][:region]

Aws.config.update(
  region: region,
  credentials: creds
)

と宣言しておき

    def client
      conf = Aws.config
      access_key_id_sym = Rails.env.development? ? :cog_access_key_id : :access_key_id
      secret_access_key_sym = Rails.env.development? ? :cog_secret_access_key : :secret_access_key

      @cognito_client ||= Aws::CognitoIdentityProvider::Client.new(
        access_key_id: Rails.application.credentials[:aws][access_key_id_sym],
        secret_access_key: Rails.application.credentials[:aws][secret_access_key_sym],
        region: conf[:region],
        http_wire_trace: Rails.env.development?
      )
    end

こんな感じ?

credentials.yml.enc とかで、 cog_access_key_id などを宣言しておき、それを直接クライアント生成時に突っ込むと言う流れ

もっといい方法があるかもしれない

何が起きた?

storage.yml で設定していた minioを利用するための設定、特にcredentials部分がうまく動作しなかった。

minio:
  service: S3
  access_key_id: minio
  secret_access_key: minio123
  endpoint: "http://minio:9000"
  region: ap-northeast-1
  bucket: test
  force_path_style: true

access_key_idを直接設定していたはずなのに、なぜか Rails.application.credentials[:aws][:access_key_id] を参照して、minioに接続ができない。

docker-compose.yml でminioのcredentialsを設定しているので、そちらを変更することも考えたが、キーを平文で入れることになるため断念。

仕方なく、それぞれのAWSクライアント側で開発環境は対応することとした。

これしか思いつかなかったなぁ
minioのクライアント生成部分に手を加える方法があるなら、それが一番簡単かもしれないのだけどね。