タスク IAM ロール - Amazon Elastic Container Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

タスク IAM ロール

Amazon ECS タスクには IAM ロールを関連付けることができます。IAM ロールで付与される許可は、タスクで実行されているコンテナによって引き受けられます。Amazon ECS がコンテナイメージをプルしてタスクを実行するために必要な IAM 許可については、「Amazon ECS タスク実行IAM ロール」を参照してください。

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

次の内容は、タスクで IAM ロールを使用する利点について説明します。

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

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

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

注記

タスクの IAM ロールを指定すると、そのタスクのコンテナ内の AWS CLI または他の SDKs は、タスクロールによって提供される AWS 認証情報のみを使用し、実行中の Amazon EC2 または外部インスタンスから IAM アクセス許可を継承しなくなります。

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

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

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" }

Amazon EC2 インスタンスが 1.11.0コンテナエージェントのバージョン 以上と、サポートされているバージョンの AWS CLI または SDK を使用している場合、SDK クライアントは AWS_CONTAINER_CREDENTIALS_RELATIVE_URI変数が利用可能であることを認識し、提供された認証情報を使用して AWS APIs。 SDKs 詳細については、「Amazon EC2 または外部インスタンスでタスク IAM ロールを使用する」を参照してください。

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

Amazon EC2 インスタンスでホストされるタスクに関する考慮事項

Amazon EC2 インスタンスで実行されているタスクで IAM ロールを使用する場合、コンテナは、Amazon EC2 インスタンスプロファイル(Amazon EC2 インスタンスメタデータサーバーを介して)提供される認証情報にアクセスすることを妨げられません。コンテナインスタンスのロールの許可は、以下に提供されるマネージド型 AmazonEC2ContainerServiceforEC2Role IAM ポリシーの許可のミニマリストに制限することをお勧めします。詳細については、「Amazon ECS コンテナインスタンスの IAM ロール」を参照してください。

Amazon EC2 インスタンスでホストされるタスクにタスク IAM ロールを使用する場合は、次の点も考慮する必要があります。

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

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

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

    再起動後も有効にするには、Amazon EC2 インスタンスでこの iptables ルールを保存する必要があります。Amazon ECS に最適化された AMI を使用する場合は、次のコマンドを使用します。他のオペレーティングシステムの場合、そのオペレーティングシステムのドキュメントを参照してください。

    sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables

Amazon EC2 または外部インスタンスでタスク IAM ロールを使用する

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

コンテナインスタンスで Amazon ECS に最適化された 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 最適化以外の 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 ポリシーを作成するときは、そのポリシーはタスクのコンテナが引き受けるタスクの許可を含める必要があります。既存の AWS 管理ポリシーを使用することも、特定のニーズを満たすカスタムポリシーを最初から作成することもできます。詳細については、『IAM ユーザーガイド』の「IAM ポリシーの作成」を参照してください。

重要

Amazon ECS タスク (すべての起動タイプ) では、タスクに IAM ポリシーとロールを使用することをお勧めします。これらの認証情報により、 sts:AssumeRoleを呼び出してタスクに既に関連付けられているのと同じロールを引き受けることなく、タスクが AWS API リクエストを行うことができます。タスクでロールがそれ自体を引き受けることが必要な場合、そのロールがそれ自体を引き受けることを明示的に許可する信頼ポリシーを作成する必要があります。詳細については、「IAM ユーザーガイド」の「Modifying a role trust policy」(ロールの信頼ポリシーの変更) を参照してください。

IAM ポリシーを作成した後、Amazon ECS タスク定義で参照するポリシーを含む IAM ロールを作成できます。IAM コンソールで [Elastic Container Service Task] (Elastic Container Service タスク) ユースケースを使用してロールを作成できます。次に、タスク内のコンテナに必要なアクセス許可を付与するロールに、特定の IAM ポリシーをアタッチできます。次の手順では、これを行う方法について説明します。

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

リージョンのサービスエンドポイントの詳細については、「Amazon Web Services 全般のリファレンス リファレンスガイド」の「サービスエンドポイント」を参照してください。

IAM タスクロールは、ecs-tasks.amazonaws.com サービスを特定する信頼ポリシーが必要です。sts:AssumeRole 許可は、Amazon EC2 インスタンスが使用するロールとは異なる IAM ロールをタスクに引き受けられるようにします。これにより、タスクは Amazon EC2 インスタンスに関連付けられたロールを継承しません。以下に示しているのは、信頼ポリシーの例です。リージョン識別子を置き換え、タスクを起動するときに使用する AWS アカウント番号を指定します。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ecs-tasks.amazonaws.com" ] }, "Action":"sts:AssumeRole", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333" } } } ] }
重要

タスク IAM ロールを作成するときは、信頼関係またはロールに関連付けられた IAM ポリシーで aws:SourceAccountまたは aws:SourceArn条件キーを使用して、混乱した代理のセキュリティ問題を防ぐために、アクセス許可の範囲をさらに絞り込むことをお勧めします。特定のクラスターを指定する aws:SourceArn 条件キーの使用は現在サポートされていません。ワイルドカードを使用してすべてのクラスターを指定する必要があります。混乱した代理問題と AWS アカウントを保護する方法の詳細については、IAM ユーザーガイドの「混乱した代理問題」を参照してください。

次の手順では、ポリシーの例を使用して、Amazon S3 からオブジェクトを取得するポリシーを作成する方法について説明します。すべてのユーザー入力を独自の値に置き換えます。

AWS Management Console
JSON ポリシーエディタでポリシーを作成するには
  1. にサインイン AWS Management Console し、https://console.aws.amazon.com/iam/ で IAM コンソールを開きます。

  2. 左側のナビゲーションペインで、[ポリシー] を選択します。

    初めて [ポリシー] を選択する場合には、[管理ポリシーにようこそ] ページが表示されます。[今すぐ始める] を選択します。

  3. ページの上部で、[ポリシーを作成] を選択します。

  4. [ポリシーエディタ] セクションで、[JSON] オプションを選択します。

  5. 次の JSON ポリシードキュメントを入力します。

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::my-task-secrets-bucket/*" ], "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:region:123456789012:*" }, "StringEquals":{ "aws:SourceAccount":"123456789012" } } } ] }
  6. [次へ] をクリックします。

    注記

    いつでも [Visual] と [JSON] エディタオプションを切り替えることができます。ただし、[Visual] エディタで [] に変更または選択した場合、IAM はポリシーを再構成して visual エディタに合わせて最適化することがあります。詳細については、「IAM ユーザーガイド」の「ポリシーの再構成」を参照してください。

  7. [確認と作成] ページで、作成するポリシーの [ポリシー名][説明] (オプション) を入力します。[このポリシーで定義されているアクセス許可] を確認して、ポリシーによって付与されたアクセス許可を確認します。

  8. [ポリシーの作成] をクリックして、新しいポリシーを保存します。

AWS CLI

すべてのユーザー入力を独自の値に置き換えます。

  1. s3-policy.json というファイルを次の内容で作成します。

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::my-task-secrets-bucket/*" ], "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:region:123456789012:*" }, "StringEquals":{ "aws:SourceAccount":"123456789012" } } } ] }
  2. JSON ポリシードキュメントファイルを使用して IAM ポリシーを作成するには、次のコマンドを使用します。

    aws iam create-policy \ --policy-name taskRolePolicy \ --policy-document file://s3-policy.json

次の手順では、作成した IAM ポリシーをアタッチしてタスク IAM ロールを作成する方法について説明します。

AWS Management Console
Elastic Container Service のサービスロールを作成するには (IAM コンソール)
  1. にサインイン AWS Management Console し、https://console.aws.amazon.com/iam/ で IAM コンソールを開きます。

  2. IAM コンソールのナビゲーションペインで、[ロール]、[ロールを作成] を選択します。

  3. 信頼できるエンティティタイプ で、AWS のサービス を選択します。

  4. サービスまたはユースケース で、Elastic Container Service を選択し、Elastic Container Service タスクのユースケースを選択します。

  5. [次へ] を選択します。

  6. アクセス許可の追加 で、作成したポリシーを検索して選択します。

  7. (オプション) アクセス許可の境界を設定します。このアドバンスド機能は、サービスロールで使用できますが、サービスにリンクされたロールではありません。

    1. [アクセス許可の境界の設定] セクションを開き、[アクセス許可の境界を使用してロールのアクセス許可の上限を設定する] を選択します。

      IAM には、アカウントの AWS 管理ポリシーとカスタマー管理ポリシーのリストが含まれます。

    2. アクセス許可の境界として使用するポリシーを選択します。

  8. [次へ] を選択します。

  9. このロールの目的を識別しやすいロール名またはロール名サフィックスを入力します。

    重要

    ロールに名前を付けるときは、次のことに注意してください。

    • ロール名は 内で一意である必要があり AWS アカウント、大文字と小文字を区別して一意にすることはできません。

      例えば、PRODROLEprodrole の両方の名前でロールを作成することはできません。ロール名がポリシーまたは ARN の一部として使用される場合、ロール名は大文字と小文字が区別されます。ただし、サインインプロセスなど、コンソールにロール名がユーザーに表示される場合、ロール名は大文字と小文字が区別されません。

    • 他のエンティティがロールを参照する可能性があるため、ロールを作成した後にロール名を編集することはできません。

  10. (オプション) [説明] にロールの説明を入力します。

  11. (オプション) ロールのユースケースとアクセス許可を編集するには、[ステップ 1: 信頼されたエンティティを選択] または [ステップ 2: アクセス権限を追加] のセクションで [編集] を選択します。

  12. (オプション) ロールの識別、整理、検索を簡単にするには、キーと値のペアとしてタグを追加します。IAM でのタグの使用に関する詳細については、『IAM ユーザーガイド』の「IAM リソースにタグを付ける」を参照してください。

  13. ロールを確認したら、[Create role] (ロールを作成) を選択します。

AWS CLI

すべてのユーザー入力を独自の値に置き換えます。

  1. タスク IAM ロールに使用する信頼ポリシーecs-tasks-trust-policy.jsonを含む という名前のファイルを作成します。ファイルには、以下が含まれている必要があります。リージョン識別子を置き換え、タスクを起動するときに使用する AWS アカウント番号を指定します。

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ecs-tasks.amazonaws.com" ] }, "Action":"sts:AssumeRole", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333" } } } ] }
  2. 前のステップで作成した信頼ポリシーを使用した ecsTaskRole という名前の IAM ロールを作成します。

    aws iam create-role \ --role-name ecsTaskRole \ --assume-role-policy-document file://ecs-tasks-trust-policy.json
  3. 次のコマンドを使用して、作成した IAM ポリシーの ARN を取得します。を、作成したポリシーの名前taskRolePolicyに置き換えます。

    aws iam list-policies --scope Local --query 'Policies[?PolicyName==`taskRolePolicy`].Arn'
  4. 作成した IAM ポリシーをecsTaskRoleロールにアタッチします。を、作成したポリシーの ARN policy-arnに置き換えます。

    aws iam attach-role-policy \ --role-name ecsTaskRole \ --policy-arn arn:aws:iam:111122223333:aws:policy/taskRolePolicy

ECS Exec に必要な IAM アクセス許可

ECS Exec 機能には、マネージド SSM エージェント (execute-command エージェント) と SSM サービス間の通信に必要なアクセス許可をコンテナに付与するためのタスク IAM ロールが必要です。次のアクセス許可をタスク IAM ロールに追加し、タスク定義にタスク IAM ロールを含める必要があります。詳細については、IAM ユーザーガイドIAM ポリシーの追加と削除を参照してください。

タスク IAM ロールに次のポリシーを使用して、必要な SSM アクセス許可を追加します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }

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

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

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

    AWS CLI または SDKsを使用する場合は、 taskRoleArnパラメータを使用してタスクロールの Amazon リソースネーム (ARN) を指定します。詳細については、TaskDefinition「Amazon ECS API リファレンス」の「」および「」を参照してくださいタスク定義パラメータ

    注記

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

  • タスクを実行する際に、IAM タスクロールの上書きを指定します。タスクを実行する際に IAM タスクロールの上書きを指定できます。 AWS CLI または SDKsを使用する場合は、JSON オブジェクトの taskRoleArnパラメータを使用してタスクロール ARN overrides を指定します。パラメータの詳細については、「Amazon ECS API リファレンス」のTaskOverrideRunTask「」およびoverrides「」を参照してください。コンソールを使用した上書きの詳細については、「」を参照してくださいスタンドアロンタスクの作成

注記

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