ECS任务跨2个AWS账户访问的IAM权限配置疑难
跨AWS账户ECS任务权限访问解决方案
场景说明
我有一个需要访问两个AWS账户的ECS任务,要求访问不中断——因此无法为该ECS任务分配IAM角色作为任务执行角色,根据AWS文档说明:
用户拥有永久长期凭证,但角色提供临时凭证
已尝试步骤
- 在账户A创建具备访问账户A所需服务全部权限的IAM角色
- 账户A的角色配置了信任策略,允许账户A上ECS任务的容器扮演该角色并执行所需操作
- 在账户B创建具备访问账户B所需服务全部权限的IAM角色
- 账户B的角色配置了信任关系,允许被账户A的角色扮演
遇到的问题
- 账户A的容器使用的是已扮演的角色,而步骤4的信任关系是针对账户A的角色本身配置的。尝试指定如下信任配置,但
role-session-name是随时间变化的UUID,且用Terraform无法获取容器已扮演角色的ARN:
"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }
- 即便解决上述问题,凭证仍是临时的。如何使用具备永久凭证的IAM User来解决这个问题?
解决方案
问题1:跨账户角色信任的正确配置方式
不需要针对assumed-role的session配置信任关系,正确操作如下:
- 账户B的角色信任策略中,直接将账户A角色的ARN作为Principal,而非assumed-role的session ARN:
"Principal": { "AWS": "arn:aws:iam::ACCOUNT_A_ID:role/ACCOUNT_A_ROLE_NAME" } - 同时在账户A的角色权限策略中,添加允许其扮演账户B角色的权限:
{ "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::ACCOUNT_B_ID:role/ACCOUNT_B_ROLE_NAME" } - Terraform配置时,直接引用账户A角色的ARN即可,示例代码:
resource "aws_iam_role_policy" "account_a_assume_account_b" { name = "assume-account-b-role" role = aws_iam_role.account_a_role.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Resource = aws_iam_role.account_b_role.arn } ] }) } resource "aws_iam_policy" "account_b_trust_policy" { name = "trust-account-a-role" description = "Allow account A role to assume this role" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Principal = { AWS = aws_iam_role.account_a_role.arn } Action = "sts:AssumeRole" } ] }) } resource "aws_iam_role_policy_attachment" "account_b_trust_account_a" { role = aws_iam_role.account_b_role.name policy_arn = aws_iam_policy.account_b_trust_policy.arn }
容器中使用账户A的角色凭证调用sts:AssumeRole,即可获取账户B的临时凭证,无需依赖动态变化的session name。
问题2:使用IAM User的永久凭证方案
若必须使用永久凭证,按以下步骤操作:
- 在账户A创建IAM用户,生成永久Access Key和Secret Key
- 为该用户配置权限:
- 访问账户A所需服务的全部权限
- 允许其扮演账户B角色的
sts:AssumeRole权限
- 在账户B的角色信任策略中,将该IAM用户的ARN作为Principal:
"Principal": { "AWS": "arn:aws:iam::ACCOUNT_A_ID:user/USER_NAME" } - 在ECS任务中,通过AWS Secrets Manager或Systems Manager Parameter Store加密存储该用户的凭证,容器启动后读取凭证:
- 直接用凭证访问账户A的服务
- 调用
sts:AssumeRole获取账户B的临时凭证,用于访问账户B的服务
注意:永久凭证存在泄露风险,务必通过加密存储方式管理,禁止硬编码到镜像或任务定义中。
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

