概要
AWSでコンテナを利用する場合、FargateやECSが候補に上がると思います。
コンテナからAWSの各種サービスを利用する場合、IAMのCredentialsを利用する必要があります。
いつも意識せずに利用しているIAMですが、裏ではどういう構成になっているのか確認していきます。
確認方法
Fargateでsshできるようにして、コンテナ内でCredentialsを探します。
Fargateでsshするには以下の記事を参考にしてください
- https://qiita.com/pocari/items/3f3d77c80893f9f1e132
- https://qiita.com/ryurock/items/fa18b25b1b38c9a0f113
- https://qiita.com/fnaoto/items/c980efa39c2b1597331e
結果
FargateではAWS_CONTAINER_CREDENTIALS_RELATIVE_URI
という環境変数にCredentialsへのファイルファイルパスが入っているようです。
- 詳細はこの記事を参考にしてください
rootユーザでコンテナにログインしても環境変数が設定されていない
実は、この環境変数はPIDが1のプロセスに設定されているようです
確認方法
$ strings /proc/1/environ
例えば、Dockerfileで以下のようになっている場合。
この場合、環境変数はPIDが1の/bin/sh
に設定されます。
そして、bundle exec rails s
には親プロセスの/bin/sh
から環境変数が引き継がれます。
CMD ["/bin/sh", "-c", "bundle exec rails s"]
ちなみに、以下のようにデーモンプロセスを動かす場合。
この場合は起動するデーモンの親プロセスは/bin/sh
にはならないので環境変数は引き継がれません。
CMD ["/bin/sh", "-c", "service ssh start"]
環境変数に設定されているIAMはどこから設定するのか
このIAMはTask Roleを参照しているようです。
なので、taskRoleArn
に設定しているIAMから権限を変更可能です。
RubyライブラリでIAM認証を使う場合
aws-sdk-rubyでは以下のように、AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
があればECSCredentials.new
するようにしているみたいです。
ちなみに、instance_profile_credentialsはprivateなので外から呼び出しはできないみたいです。
普段、ライブラリを使う場合は特に意識することなくことなく、Credentialsが使われているようですね。
# https://github.com/aws/aws-sdk-ruby/blob/704c4a2afbee1bb20a6c47545305684a92771f7e/gems/aws-sdk-core/lib/aws-sdk-core/credential_provider_chain.rb#L110
def instance_profile_credentials(options)
if ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"]
ECSCredentials.new(options)
else
InstanceProfileCredentials.new(options)
end
end