Amazon Elastic Container Service
開発者ガイド (API バージョン 2014-11-13)

タスク用の IAM ロール

Amazon ECS タスク用の IAM ロールを使用すると、タスクのコンテナで使用できる IAM ロールを指定できます。アプリケーションは AWS 認証情報で AWS API リクエストに署名する必要があります。この機能により、アプリケーションを使用するための認証情報を管理する戦略を利用できます。これは、Amazon EC2 インスタンスプロファイルが EC2 インスタンスに認証情報を提供する方法と似ています。AWS 認証情報を作成してコンテナに配布したり、EC2 インスタンスのロールを使用したりする代わりに、IAM ロールを ECS のタスク定義または RunTask API オペレーションに関連付けることができます。タスクのコンテナにあるアプリケーションは、AWS SDK または CLI を使用して権限付与された AWS のサービスへの API リクエストを実行できます。

重要

コンテナインスタンスで実行されているコンテナは (Amazon EC2 インスタンスメタデータサーバー経由で) コンテナインスタンスプロファイルに提供される認証情報にアクセスすることを防ぐことができません。コンテナインスタンスのロールのアクセス許可を、「Amazon ECS コンテナインスタンス IAM ロール」に示されているアクセス許可の最小リストに制限することをお勧めします。

awsvpc ネットワークモードを使用するタスク内のコンテナが、コンテナのインスタンスプロファイルに入力されている認証情報にアクセスできないように (タスクロールで指定されているアクセス権限は有効)、エージェントの設定ファイルで ECS_AWSVPC_BLOCK_IMDS エージェント設定変数を true に設定し、そのエージェントを再起動します。詳細については、「Amazon ECS コンテナエージェントの設定」を参照してください。

bridge ネットワークモードを使用するタスク内のコンテナが、コンテナのインスタンスプロファイルに入力されている認証情報にアクセスできないように (タスクロールで指定されているアクセス権限は有効)、コンテナのインスタンスで次の iptables コマンドを実行します。このコマンドによって、host または awsvpc ネットワークモードを使用するタスク内のコンテナに影響が及ぶことはありません。詳細については、「ネットワークモード」を参照してください。

sudo yum install -y iptables-services; sudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP

再起動後も有効にするには、コンテナインスタンスでこの iptables ルールを保存する必要があります。Amazon ECS-optimized AMI では以下のコマンドを使用します。他のオペレーティングシステムについては、その OS のドキュメントを参照してください。

  • Amazon ECS-optimized Amazon Linux 2 AMI の場合:

    sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
  • Amazon ECS-optimized Amazon Linux AMI の場合:

    sudo service iptables save

タスク定義で使用する IAM ロールを定義するか、RunTask API オペレーションでタスクを手動で実行するときに taskRoleArn の上書きを使用できます。Amazon ECS エージェントは、ロール認証情報を含む追加のフィールドを使用してタスクを開始するペイロードメッセージを受け取ります。Amazon ECS エージェントは、一意のタスク認証情報 ID を識別トークンとして設定し、内部認証情報のキャッシュを更新して、タスクの識別トークンがペイロードで受け取ったロールの認証情報を指すようにします。Amazon ECS エージェントでは、次の相対 URI を使用して、このタスクに属するすべてのコンテナの Env オブジェクト (docker inspect container_id コマンドで利用可能) に AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 環境変数を設定します。/credential_provider_version/credentials?id=task_credential_id

注記

タスク用の IAM ロールを指定すると、そのタスクのコンテナ内の AWS CLI または他の SDK は、タスクロールによって提供された AWS 認証情報を排他的に使用し、コンテナインスタンスから IAM アクセス権限を継承しなくなります。

コンテナ内から、以下のコマンドを使用して認証情報をクエリできます。

curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

出力:

{ "AccessKeyId": "ACCESS_KEY_ID", "Expiration": "EXPIRATION_DATE", "RoleArn": "TASK_ROLE_ARN", "SecretAccessKey": "SECRET_ACCESS_KEY", "Token": "SECURITY_TOKEN_STRING" }

コンテナインスタンスで、コンテナエージェントのバージョン 1.11.0 以降と、AWS CLI または SDK のサポートされているバージョンが使用されている場合、SDK クライアントによって、AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 変数が使用可能かどうかが確認され、提供された認証情報を使用して AWS API への呼び出しが実行されます。詳細については、「コンテナインスタンスでタスクの IAM ロールを有効にする」および「サポートされる AWS SDK の使用」を参照してください。

認証情報プロバイダーを使用するたびに、リクエストがローカルでホストコンテナインスタンスの /var/log/ecs/audit.log.YYYY-MM-DD-HH.詳細については、「タスク認証情報の監査ログ用の IAM ロール」を参照してください。

タスク用の IAM ロールの利点

  • 認証情報の分離: コンテナは、コンテナが属するタスク定義で定義された IAM ロールの認証情報のみを取得できます。コンテナは、別のタスクに属する別のコンテナを対象にした認証情報にアクセスすることはありません。

  • 許可: 許可のないコンテナは別のタスク用に定義されている IAM ロール認証情報にアクセスできません。

  • 監査性: 遡及的な監査を確実に行うため、CloudTrail を介してアクセスとイベントのロギングを利用できます。タスクの認証情報には、セッションにアタッチされている taskArn のコンテキストがあるため、CloudTrail ログではどのタスクがどのロールを使用しているかを表示できます。

コンテナインスタンスでタスクの IAM ロールを有効にする

Amazon ECS コンテナインスタンスでは、タスクの IAM ロールを有効にするために、コンテナエージェントのバージョン 1.11.0 以上が必要ですが、最新のコンテナエージェントのバージョンを使用することをお勧めします。エージェントのバージョンの確認と最新バージョンへの更新については、「Amazon ECS コンテナエージェントの更新」を参照してください。Amazon ECS-optimized AMI を使用している場合、インスタンスでは、ecs-init パッケージの 1.11.0-1 以上が必要です。コンテナインスタンスがバージョン 2016.03.e 以降から起動される場合、コンテナエージェントおよび ecs-init の必要なバージョンが含まれます。詳細については、「Amazon ECS-optimized AMI」を参照してください。

コンテナインスタンスで Amazon ECS-optimized AMI を使用していない場合、必ず --net=host オプションを、エージェントを開始する docker run コマンドと、必要な構成に適切なエージェント設定変数に追加してください (詳細については、「Amazon ECS コンテナエージェントの設定」を参照してください):

ECS_ENABLE_TASK_IAM_ROLE=true

bridge および default ネットワークモードを使ったコンテナのタスクの IAM ロールを有効にします。

ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true

host ネットワークモードを使ったコンテナのタスクの IAM ロールを有効にします。この変数はエージェントバージョン 1.12.0 以降でのみサポートされています。

実行コマンドの例の詳細については、「Amazon ECS コンテナエージェントの手動更新 (Amazon ECS-Optimized AMI 以外の場合)」を参照してください。また、タスクのコンテナが AWS 認証情報を取得できるよう、次のネットワーキングコマンドをコンテナインスタンスで設定する必要があります。

sudo sysctl -w net.ipv4.conf.all.route_localnet=1 sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679

再起動後も有効にするには、コンテナインスタンスにこれらの iptables ルールを保存する必要があります。iptables-save および iptables-restore コマンドを使用して、iptables ルールを保存し、起動時にそのルールを復元します。詳細については、特定のオペレーティングシステムのドキュメントを参照してください。

タスク用の IAM ロールとポリシーの作成

タスクで使用する IAM ポリシーを作成して、タスクのコンテナに含めるアクセス許可を指定する必要があります。IAM の新しい権限ポリシーを作成する方法は複数あります。目的の操作のいくつかをすでに実行できる完全な AWS 管理ポリシーをコピーし、特定の要件に応じてカスタマイズできます。詳細については、IAM ユーザーガイド の「新しいポリシーの作成」を参照してください。

また、タスク定義で指定する前に、使用するタスク用のロールを作成する必要があります。IAM コンソールで [Amazon Elastic Container Service Task Role (Amazon Elastic Container Service タスクロール)] サービスロールを使用して、ロールを作成できます。それから、タスクのコンテナに必要なアクセス許可を付与するロールに特定の IAM ポリシーをアタッチできます。次の手順では、これを行う方法について説明します。

注記

このロールの信頼関係を確認するには、「Amazon ECS Task Role ( タスクロール)」を参照してください。

IAM のアクセス許可を必要とする複数のタスク定義またはサービスがある場合は、各タスクに提供するアクセスを最小限に抑えるために、タスクを操作するために必要な最小限のアクセス許可で特定のタスク定義またはサービスごとにロールを作成することを検討してください。

タスク用の IAM ポリシーを作成するには

この例では、Amazon S3 バケットへの読み取り専用アクセスを許可するポリシーを作成します。データベース認証情報または他の秘密情報をバケットに保存し、タスクのコンテナによってバケットからの認証情報の読み取りとアプリケーションへのロードを実行できます。

  1. https://console.aws.amazon.com/iam/ にある IAM コンソールを開きます。

  2. ナビゲーションペインで、[Policies (ポリシー)] を選択し、[Create Policy (ポリシーの作成)] を選択します。

  3. 次のいずれかのタブの手順に従って、ビジュアルのエディタまたは JSON エディタの使用方法を示します。

Using the visual editorUsing the JSON editor
Using the visual editor
  1. [Service] で、[S3] を選択します。

  2. [アクション] の [Read (読み取り)] オプションを展開し、[GetObject] を選択します。

  3. [リソース] で、[Add ARN (ARN の追加)] を選択し、Amazon S3 バケットの完全な ARN を入力します。

  4. [ポリシーの確認] を選択します。

  5. [Review policy (ポリシーの確認)] セクションで、[名前] には AmazonECSTaskS3BucketPolicy などの独自の一意の名前を入力します。

  6. [Create policy (ポリシーの作成)] を選択して終了します。

Using the JSON editor
  1. [Policy Document] フィールドに、タスクに適用するポリシーを貼り付けます。以下の例では、my-task-secrets-bucket Amazon S3 バケットにアクセス許可を付与します。ポリシードキュメントを特定のニーズに応じて変更できます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-task-secrets-bucket/*" ] } ] }
  2. [Create Policy] を選択します。

タスク用の IAM ロールを作成するには

  1. https://console.aws.amazon.com/iam/ にある IAM コンソールを開きます。

  2. ナビゲーションペインで [Roles]、[Create New Role] の順に選択します。

  3. [ロールタイプの選択] セクションの [Amazon Elastic Container Service タスクロール] サービスロールで [選択] を選択します。

    注記

    このロールの信頼関係を確認するには、「Amazon ECS Task Role ( タスクロール)」を参照してください。

  4. [ポリシーのアタッチ] セクションで、タスクで使用するポリシーを選択します (この例では AmazonECSTaskS3BucketPolicy を選択し、[次のステップ] を選択します)。

  5. [ロール名] に、ロールの名前を入力します。この例では、ロールの名前を AmazonECSTaskS3BucketRole と入力し、[ロールの作成] を選択して完了します。

サポートされる AWS SDK の使用

タスクの IAM ロールのサポートは 2016 年 7 月 13 日に、AWS SDK に追加されました。タスクのコンテナは、その日付以降に作成されたバージョンの AWS SDK を使用する必要があります。Linux ディストリビューションのパッケージマネージャーに含まれている AWS SDK は、この機能をサポートするのに十分なほど新しくない可能性があります。

サポートされている SDK を使用していることを確認するには、コンテナを構築して最新バージョンを取得する際に、「アマゾン ウェブ サービスのツール」で、希望する SDK のインストール手順に従ってください。

タスク用の IAM ロールを指定する

ロールを作成し、そのロールにポリシーをアタッチした後、そのロールを引き受けるタスクを実行できます。これには複数の方法があります。

  • タスク定義でタスク用の IAM ロールを指定します。新しいタスク定義または既存のタスク定義の新しいリビジョンを作成して、前に作成したロールを指定できます。コンソールを使用してタスク定義を作成する場合、[Task Role (タスクロール)] フィールドで IAM ロールを選択します。AWS CLI または SDK を使用する場合、taskRoleArn パラメータを使用してタスクロールの ARN を指定します。詳細については、「タスク定義の作成」を参照してください。

    注記

    このオプションは、Amazon ECS サービスで IAM のタスクロールを使用する場合に必要です。

  • タスクを実行する際に、IAM タスクロールの上書きを指定します。タスクを実行する際に IAM タスクロールの上書きを指定できます。コンソールを使用してタスクを実行する場合、[詳細オプション] を選択し、[Task Role (タスクロール)] フィールドで IAM ロールを選択します。AWS CLI または SDK を使用する場合、overrides JSON オブジェクトの taskRoleArn パラメータを使用してタスクロールの ARN を指定します。詳細については、「タスクの実行」を参照してください。

注記

タスクおよびサービスを実行するために必要な標準の Amazon ECS アクセス権限を付与するだけでなく、IAM ユーザーにはタスクの IAM ロールを使用する iam:PassRole アクセス権限も必要です。