aws-sdk-ruby でのクレデンシャルの扱い

EC2 で稼働する Rails アプリケーション上で aws-sdk-ruby にクレデンシャル情報を渡す話。

バージョン

aws-sdk-ruby (2.2.33)

クレデンシャルの設定には優劣がある

aws-sdk は暗黙的に以下の順序でクレデンシャル情報を探索する。

  • static_credentials

    • 直接設定された値
  • env_credentials

  • shared_credentials

    • $HOME/.aws/credentials に INI形式で記述されるもの
    • 上記のパスはデフォルトなだけでカスタマイズ可能な実装に見えるけど、できなそうな実装になっている(参考)
    • [default] セクションが優先使用される
    • これもカスタマイズ可能
    • 環境変数 AWS_PROFILE もしくは設定から指定ができる
  • instance_profile_credentials

    • EC2 インスタンスに割り当てた IAM ロールからクレデンシャル情報を取得する
    • 参考

実際にアプリケーションに対してクレデンシャル情報をどう渡すか

ステージング、プロダクションといった AWS 上で動くアプリケーションに関しては 上記4番目の instance_profile_credentials を利用すればよさそう。

なので

  • 開発環境(ローカル)

    • 各自のアカウントでトークンを発行
    • $HOME/.aws/credentials に記載
  • ステージング、プロダクション(EC2上で稼働するもの)

    • インスタンスに対してアクセス権を付与

という感じで、アプリケーションコードに対するクレデンシャルの記載を最小限にできたつもり。

悩み事

ただ、開発環境で AWS の API を叩きたい時なんかのために

  • $HOME/.aws/credentials
[hogehoge-development]
  aws_access_key_id = AWS_ACCESS_KEY_ID
  aws_secret_access_key = AWS_SECRET_ACCESS_KEY
  • config/initializers/aws\_sdk.rb
if Rails.env.development?
  Aws.config[:profile_name] = 'hogehoge-development'
end

ってしたけど、いい方法無いかな...