如何配置 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 任务角色

解决方法

本文中使用的示例引用了两个不同的 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 角色。使用此设置,任务可以代入角色,而无需导出新凭证。有关更多信息,请参阅代入角色凭证

验证任务中的容器是否可以在目标账户中代入 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 集群资源。


相关信息

任务的 IAM 角色

IAM 教程:使用 IAM 角色委托跨 AWS 账户的访问权限

使用共享配置和凭证文件的 AWS SDK 和工具

凭证文件设置

AWS 官方
AWS 官方已更新 2 年前