4
3

More than 3 years have passed since last update.

Fargate及びECSでコンテナからAWSのIAM認証を利用する

Last updated at Posted at 2020-01-04

概要

AWSでコンテナを利用する場合、FargateやECSが候補に上がると思います。
コンテナからAWSの各種サービスを利用する場合、IAMのCredentialsを利用する必要があります。
いつも意識せずに利用しているIAMですが、裏ではどういう構成になっているのか確認していきます。

確認方法

Fargateでsshできるようにして、コンテナ内でCredentialsを探します。

Fargateでsshするには以下の記事を参考にしてください

結果

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
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3