だいたいのチュートリアル読むと、アクセスキーとシークレットキーを設定しようと書かれているが、EC2の権限設定でカバーしたい場合は未指定でも問題ないんだよっていうメモ
環境
rails (5.2.0)
説明
S3などの設定をする config/storage.yml
の雛形にはこんな感じで書いてある
# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) # amazon: # service: S3 # access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> # secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> # region: us-east-1 # bucket: your_own_bucket
access_key_id
や secret_access_key
の記述項目がある。
Railsのクレデンシャルに入れる書き方があるが、まま踏襲しなくてもよく、むしろEC2にIAM Roleなどをつかって権限を付与する場合はキーなどの情報はもっていないので、文字列としてすらもっていない場合がある。
そういう場合は普通に記述を削っても、設定情報がしっかりとどこかしらにあれば使えます。
例:
amazon: service: S3 bucket: バケット名
あとがき
なんでこんな記述が成り立つかというと(Railsガイドにもありますが)単純にaws-sdkのgemに則ってるので、権限の利用優先度のルールもそこに依存してて、未指定だったらIAM Roleまで行くってだけなんですね。
▼rails/activestorage/lib/active_storage/service/s3_service.rb
# frozen_string_literal: true require "aws-sdk-s3" require "active_support/core_ext/numeric/bytes" module ActiveStorage # 以下略
なので、環境変数とかに仕込むとそれを勝手に読んでくれるはず(未検証)