別の AWS アカウントで IAM ロールを引き受けるように Amazon ECS タスクを設定するにはどうすればよいですか?

最終更新日: 2022 年 3 月 21 日

別のアカウントで AWS Identity and Access Management (IAM) ロールを引き受けるように Amazon Elastic Container Service (Amazon ECS) タスクを設定したいと思っています。

簡単な説明

別のアカウントで IAM ロールを引き受けるように Amazon ECS タスクを設定し、次のいずれかを実行できます。

  • Amazon Simple Storage Service (Amazon S3) バケットなどのリソースにアクセスする。
  • API コールを使用して、リソースの記述やインスタンスの開始または停止などのタスクを実行する。

Amazon ECS タスクが別の AWS アカウントで IAM ロールを引き受けるようにするには、次の手順を実行します。

  1. ソースアカウントで IAM ロールを設定します。
  2. ソースアカウントの IAM ロールが宛先アカウントの IAM ロールを引き受けることができるように、宛先アカウントの IAM ロールの信頼ポリシーを変更します。
  3. ソースアカウントにタスク定義を作成し、ステップ 1 で作成した IAM ロールを Amazon ECS タスクロールとして定義します。

解決方法

この記事で使用されている例は、2 つの異なる AWS アカウントを参照しています。

  • Amazon ECS タスクをホストするソースアカウント (例: 1111222233334444)
  • Amazon ECS タスクが引き受ける IAM ロール (例: destination-account-role) を含む宛先アカウント (例: 5555666677778888)

ソースアカウントで IAM ロールを設定する

IAM アイデンティティの許可の追加および削除」の手順に従って、次のポリシーステートメントを Amazon ECS タスクロール (例: my-ECS-task-role) に追加します。これにより、ECS タスクロールは宛先アカウントの IAM ロールを引き受けることができます。

注:

  • 5555666677778888 は、タスクが引き受ける必要のあるクロスアカウントロールのアカウント ID に置き換えます。
  • destination-account-role は、引き受けるロールの名前に置き換えます。
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::5555666677778888:role/destination-account-role"
  }
}

移行先アカウントの IAM ロールの信頼ポリシーを変更する

ロールの信頼ポリシーの変更 (コンソール)」の手順に従って、次のポリシーステートメントを、宛先アカウントのクロスアカウント IAM ロール (destination-account-role) の信頼ポリシーに追加します。

注:

  • 1111222233334444 は、ECS タスク IAM ロールが存在するソースアカウントのアカウント ID に置き換えます。
  • my-ECS-task-role は、ECS IAM タスクロールの名前に置き換えます。
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::1111222233334444:role/my-ECS-task-role"
    },
    "Action": "sts:AssumeRole"
  }]
}

タスク定義を作成する

次のようなタスク定義ファイル (example-task-def.json) を作成し、ソースアカウントの IAM ロール (my-ECS-task-role) の ARN を taskRoleArn に使用します。

{
  "containerDefinitions": [
    {
      "name": "test",
      "image": "your-test-image",
      "cpu": 100,
      "memory": 200,
      "essential": true
    }
  ],
  "family": "verify-assume-cross-account-role",
  "taskRoleArn": "arn:aws:iam::1111222233334444:role/my-ECS-task-role"
}

次のコマンドを実行して、example-task-def.json ファイルを使用してタスク定義を登録します。

aws ecs register-task-definition —cli-input-json file://example-task-def.json

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

前のステップを完了すると、スタンドアロンタスクを実行して、AWS Command Line Interface (AWS CLI) を使用して宛先アカウントで IAM ロールを引き受けることができます。または、AWS CLI 設定ファイルの credential_source 設定を使用して、AWS CLI が、ECS コンテナにアタッチされた IAM ロールを引き受けるための認証情報を検索できる場所を指定することもできます。この設定により、新しい認証情報をエクスポートしなくても、タスクがロールを引き受けられるようになります。詳細については、「Assume role credentials (ロールの認証情報を引き受ける)」を参照してください。

タスク内のコンテナが宛先アカウントの IAM ロールを引き受け、リソースにアクセスできることを確認する

1.    作成したタスク定義を使用してタスクを実行します。

  • Amazon Elastic Compute Cloud (Amazon EC2) でタスクを実行している場合は、docker exec コマンドを使用してコンテナに入り、テストを実行します。
  • AWS Fargate でタスクを実行している場合は、ECS Exec 機能を使用してコンテナに入り、テストを実行します。

2.    AWS CLI 設定ファイルを設定し、タスクが宛先アカウントの IAM ロールを引き受けることを確認します。

Using the ECS exec command to access the container
$ aws ecs execute-command --cluster example-cluster --task example-taskID --container test --interactive --command "/bin/bash"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-064a40c5149cecc32

# Create AWS CLI config file
bash-4.2# mkdir /root/.aws
bash-4.2# cat <<EOF > /root/.aws/config
[profile cross-account]
role_arn = arn:aws:iam::5555666677778888:role/destination-account-role
credential_source = EcsContainer
EOF

# Check the current task IAM role
bash-4.2# aws sts get-caller-identity
{
  "UserId": "AROA4SHE6JAGEAYNUH6ST:8ee54a7f5c474a3f93ee28474486402f",
  "Account": "1111222233334444",
  "Arn": "arn:aws:sts::1111222233334444:assumed-role/my-ECS-task-role/8ee54a7f5c474a3f93ee28474486402f"
}

# Assume the cross-account IAM role
bash-4.2# aws sts get-caller-identity --profile cross-account
{
  "UserId": "AROA3A44JRHY6FFSMMJKN:botocore-session-1647426859",
  "Account": "5555666677778888",
  "Arn": "arn:aws:sts::5555666677778888:assumed-role/destination-account-role/botocore-session-1647426859"
}

# Verify that you can list the resources in cross-account in the task
bash-4.2# aws ecs list-clusters --profile cross-account
{
  "clusterArns": [
    "arn:aws:ecs:us-east-1:5555666677778888:cluster/default"
  ]
}

出力がここにリストされているものと類似している場合、アカウント 1111222233334444 の ECS タスクはアカウント 5555666677778888 の IAM ロールを引き受け、ECS クラスターリソースを一覧表示できます。