コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

ActiveStorageでS3を使う場合、storage.ymlの認証情報は必須項目ではない

だいたいのチュートリアル読むと、アクセスキーとシークレットキーを設定しようと書かれているが、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_idsecret_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
# 以下略

なので、環境変数とかに仕込むとそれを勝手に読んでくれるはず(未検証)

関連リンク