如何通过 Amazon ECS 任务访问其他账户中的资源?
我希望我的 Amazon Elastic Container Service (Amazon ECS) 任务访问其他 AWS 账户中的资源。
解决方案
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
要为 Amazon ECS 任务设置跨账户访问权限,请使用 AWS Identity and Access Management (IAM) 角色和跨账户角色假设。
此解决方法使用以下配置:
- 账户 A 是资源所有者账户。
- 账户 B 是执行 Amazon ECS 任务的账户。
**先决条件:**账户 B 中的 Amazon ECS 任务定义必须具有 IAM 任务角色。创建 IAM 任务角色后,更新 Amazon ECS 任务定义以包括任务角色 ARN。
配置账户 A
完成以下步骤:
- 创建 IAM 角色以访问资源,然后为自定义信任策略输入以下信任关系:
**注意:**将 Account_B_ID 替换为账户 B 的账户 ID,将 ECS_Task_Role_Name 替换为账户 B 的 Amazon ECS 任务角色的名称。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Account_B_ID:role/ECS_Task_Role_Name" }, "Action": "sts:AssumeRole" } ] } - 将内联策略附加到具有访问资源所需权限的新 IAM 角色。以下示例策略允许 IAM 角色向 Amazon Simple Queue Service (Amazon SQS) 队列发送消息:
**注意:**如果您的任务在 AWS Fargate 上运行,请确保 IAM 角色具有 ECS 执行权限。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:SendMessage" ], "Resource": "arn:aws:sqs:region:Account_A_ID:QueueName" } ] }
配置账户 B
将内联策略附加到任务定义中的 Amazon ECS 任务角色,允许该任务代入账户 A 中的 IAM 角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::Account_A_ID:role/cross-account-role" } ] }
**注意:**请将 Account_A_ID 替换为账户 A 的账户 ID。
确保账户 B 中的任务容器可以访问账户 A 中的资源
完成以下步骤:
-
如果您在 Amazon Elastic Compute Cloud (Amazon EC2) 上运行任务,请在任务的容器实例中使用 docker exec 命令。有关详细信息,请参阅 Docker 文档网站上的在正在运行的容器上运行 docker exec。然后,继续执行第 3 步。
如果您在 Fargate 上运行任务,请为您的独立任务或服务启用 ECS Exec。
**注意:**在以下命令中,将 cluster-name 替换为您的集群名称,将 your-task-definition 替换为账户 B 中的任务定义,将 region-name 替换为您的 AWS 区域。另外,将 FARGATE 替换为您的启动类型。
对于独立任务,请运行以下 run-task 命令:aws ecs run-task --cluster cluster-name --task-definition your-task-definition:revision --enable-execute-command --network-configuration "awsvpcConfiguration={subnets=[subnet-12345678],securityGroups=[sg-12345678]}" --launch-type FARGATE对于服务,请运行以下 update-service 命令:
aws ecs update-service --service service-name --cluster cluster-name --enable-execute-command --region region-name --force-new-deployment -
要使用 ECS Exec 远程连接容器实例,请运行以下 execute-command 命令:
aws ecs execute-command --cluster cluster-name --task taskID --container container-name --interactive --command "/bin/bash"**注意:**将 cluster-name 替换为您的集群名称,将 taskID 替换为您的任务 ID,将 container-name 替换为您的容器名称。
-
在容器内部,运行以下命令以在配置文件中创建跨账户配置文件:
bash-4.2# mkdir /root/.aws bash-4.2# cat <<EOF > /root/.aws/config [profile cross-account] role_arn = arn:aws:iam::Account_A_ID:role/cross-account-role credential_source = EcsContainer EOF**注意:**请将 Account_A_ID 替换为账户 A 的账户 ID。
-
要检查容器代入的角色,请运行以下命令:
bash-4.2# aws sts get-caller-identity在输出中,验证该角色是否为账户 B 中的任务角色。
输出示例:{ "Account": "Account_B_ID", "UserId": "AROATCLZDNI7EB3PZGY56:8db9330e660542b7b55595b06fef82cd", "Arn": "arn:aws:sts::Account_B_ID:assumed-role/task-role/8db9330e660542b7b55595b06fef82cd" } -
要确认容器是否可以代入跨账户角色,请运行以下命令:
bash-4.2# aws sts get-caller-identity --profile cross-account输出示例:
{ "Account": "Account_A_ID", "UserId": "AROA4T5UFR272UVSKSA2Y:botocore-session-1736260779", "Arn": "arn:aws:sts::Account_A_ID:assumed-role/cross-account-role/botocore-session-1736260779" } -
检查您是否可以从账户 B 访问账户 A 中的资源。以下示例命令访问 SQS 队列:
bash-4.2# aws sqs send-message --queue-url https://sqs.region.amazonaws.com/Account_A_ID/QueueName --message-body "Test message from ECS Task in Account B" --profile cross-account**注意:**将 region 替换为您的区域,将 Account_A_ID 替换为账户 A 的账户 ID,将 QueueName 替换为您的 SQS 队列的名称。
输出示例:{ "MD5OfMessageBody": "2b9297ac831d0f8aa655f41e6782898d", "MessageId": "4d5baf64-abb0-4f06-af95-d602a45326d2" }输出确认账户 B 中的 Amazon ECS 任务可以向账户 A 中的 SQS 队列发送消息。
相关信息
如何配置我的 Amazon ECS 任务以代入其他 AWS 账户中的 IAM 角色?
- 语言
- 中文 (简体)

相关内容
AWS 官方已更新 3 年前