Amazon ECS タスクで別の AWS アカウントの IAM ロールを引き継ぐ方法を教えてください。

所要時間3分
0

Amazon Elastic Container Service (Amazon ECS) タスクで、別のアカウントの AWS Identity and Access Management (IAM) の役割を引き継ぎたいと考えています。

簡単な説明

Amazon ECS タスクが別のアカウントの IAM ロールを引き継ぐように設定すると、次のことが可能になります。

  • 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 タスクが引き継ぐ destination-account-role など、IAM ロールを含む宛先アカウント: 5555666677778888

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

Amazon ECSタスクロールに次のポリシーステートメントを追加 して、ロールが宛先アカウントの IAM ロールを引き継げるようにします。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::5555666677778888:role/destination-account-role"
  }
}

注:

  • 5555666677778888 は、タスクで引き継ぐ必要のあるクロスアカウントロールのアカウントIDに置き換えてください。
  • destination-account-roleは、引き継ぐロールの名前に置き換えてください。

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

宛先アカウントのクロスアカウント IAM ロール (destination-account-role) の信頼ポリシーに次のポリシーステートメントを追加します。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::1111222233334444:role/my-ECS-task-role"
    },
    "Action": "sts:AssumeRole"
  }]
}

注:

  • 1111222233334444は、ECS タスクの IAM ロールが存在するソースアカウントの ID に置き換えてください。
  • my-ECS-task-roleは、ECS の IAM タスクロールの名前に置き換えてください。

タスク定義を作成する

次のようなタスク定義ファイルを作成します。

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

注:****taskRoleArnには、ソースアカウントの IAM ロールの ARN を使用してください。

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

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

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、必ず AWS CLI の最新バージョンを使用してください。

前のステップが完了したら、AWS CLI を使用してスタンドアロンタスクを実行し、宛先アカウントで IAM ロールを引き継ぎます。または、設定ファイルで credential_source 設定を使用することもできます。ECS コンテナにアタッチされた IAM ロールを引き継ぐための認証情報を AWS CLI が検索できる場所を指定します。詳しくは、「Assume role credential provider」を参照してください。

タスク内のコンテナが宛先アカウントの 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 タスクは、ECS クラスターリソースを一覧表示するための IAM ロールを引き継ぐことができます。

関連情報

Amazon ECS タスクの IAM ロール

IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任

AWS SDKs and Tools Reference Guide

Use an IAM role in the AWS CLI

AWS公式
AWS公式更新しました 1年前
コメントはありません