You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ECS任务跨2个AWS账户访问的IAM权限配置疑难

跨AWS账户ECS任务权限访问解决方案

场景说明

我有一个需要访问两个AWS账户的ECS任务,要求访问不中断——因此无法为该ECS任务分配IAM角色作为任务执行角色,根据AWS文档说明:

用户拥有永久长期凭证,但角色提供临时凭证

已尝试步骤

  • 在账户A创建具备访问账户A所需服务全部权限的IAM角色
  • 账户A的角色配置了信任策略,允许账户A上ECS任务的容器扮演该角色并执行所需操作
  • 在账户B创建具备访问账户B所需服务全部权限的IAM角色
  • 账户B的角色配置了信任关系,允许被账户A的角色扮演

遇到的问题

  1. 账户A的容器使用的是已扮演的角色,而步骤4的信任关系是针对账户A的角色本身配置的。尝试指定如下信任配置,但role-session-name是随时间变化的UUID,且用Terraform无法获取容器已扮演角色的ARN:
"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }
  1. 即便解决上述问题,凭证仍是临时的。如何使用具备永久凭证的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的永久凭证方案

若必须使用永久凭证,按以下步骤操作:

  1. 在账户A创建IAM用户,生成永久Access Key和Secret Key
  2. 为该用户配置权限:
    • 访问账户A所需服务的全部权限
    • 允许其扮演账户B角色的sts:AssumeRole权限
  3. 在账户B的角色信任策略中,将该IAM用户的ARN作为Principal:
    "Principal": {
      "AWS": "arn:aws:iam::ACCOUNT_A_ID:user/USER_NAME"
    }
    
  4. 在ECS任务中,通过AWS Secrets Manager或Systems Manager Parameter Store加密存储该用户的凭证,容器启动后读取凭证:
    • 直接用凭证访问账户A的服务
    • 调用sts:AssumeRole获取账户B的临时凭证,用于访问账户B的服务

注意:永久凭证存在泄露风险,务必通过加密存储方式管理,禁止硬编码到镜像或任务定义中。

内容的提问来源于stack exchange,提问作者Niko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:35:34