如何配置我的 Amazon ECS 任务以代入另一个 AWS 账户中的 IAM 角色?
我希望我的 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 角色,请完成以下步骤:
- 在源账户中配置 IAM 角色。
- 修改目标账户的 IAM 角色的信任策略,,以允许源账户的 IAM 角色代入目标账户的 IAM 角色。
- 在源账户中创建任务定义,并将步骤 1 中创建的 IAM 角色定义为 Amazon ECS 任务角色。
解决方法
本文中使用的示例引用了两个不同的 AWS 账户:
- 托管 Amazon ECS 任务的源账户: 1111222233334444
- 包含 Amazon ECS 任务代入的 IAM 角色(例如destination-account-role)的目标账户: 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 设置。指定 AWS CLI 可以在哪里找到代入连接到 ECS 容器的 IAM 角色的凭证。有关更多信息,请参阅 Assume role credential provider。
验证任务中的容器是否可以代入目标账户中的 IAM 角色并访问资源
- 然后,使用您创建的任务定义来运行任务:
如果您在 Amazon Elastic Compute Cloud(亚马逊 EC2)上运行任务,那么使用 docker exec 命令来执行测试。
如果您在 AWS Fargate 上运行任务,那么使用 ECS Exec 来执行测试。 - 配置 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 角色来列出 ECS 集群资源。
相关信息
IAM 教程: 使用 IAM 角色委托跨 AWS 账户的访问权限
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 7 个月前
- AWS 官方已更新 7 个月前
- AWS 官方已更新 2 年前