Terraform HCP动态凭证跨AWS账户AssumeRole失败求助
解决HCP Terraform动态凭证跨账户AssumeRole的403权限问题
问题核心
你当前的配置中,沙箱账户的sandbox_admin角色已经信任主账户的tfc_role,但主账户的tfc_role本身没有被允许执行sts:AssumeRole操作去获取沙箱角色的权限,导致Terraform使用动态凭证生成的临时会话(arn:aws:sts::MainAccount:assumed-role/tfc-role/terraform-run-xxx)被拒绝。
解决方案
1. 为主账户tfc_role添加AssumeRole权限
编辑主账户中tfc_role的权限策略,添加允许其假定沙箱账户sandbox_admin角色的规则:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::SandboxAccount:role/sandbox_admin" } ] }
注意替换
SandboxAccount为你的沙箱账户ID,确保角色ARN完全匹配。
2. 验证沙箱角色信任关系的准确性
确认沙箱账户sandbox_admin的信任关系中,主账户tfc_role的ARN拼写正确(包括账户ID、角色名、大小写):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::MainAccount:role/tfc-role" }, "Action": "sts:AssumeRole" } ] }
3. 手动验证权限(排查用)
用主账户的tfc_role临时凭证手动执行AssumeRole操作,确认权限是否生效:
aws sts assume-role \ --role-arn arn:aws:iam::SandboxAccount:role/sandbox_admin \ --role-session-name test-tfc-assume
如果这个命令成功返回临时凭证,说明AWS权限配置没问题,再检查Terraform provider配置。
4. 确认Terraform Provider配置
确保你的AWS provider配置中,assume_role块的role_arn完全正确,不需要额外的source_profile(HCP动态凭证会自动注入主账户tfc_role的凭证):
provider "aws" { region = "us-east-1" assume_role { role_arn = "arn:aws:iam::SandboxAccount:role/sandbox_admin" } }
关键说明
跨账户AssumeRole需要满足两个条件:
- 信任方(沙箱角色):允许发起方(主账户tfc_role)访问
- 发起方(主账户tfc_role):被允许执行
sts:AssumeRole操作到目标角色
你之前只配置了前者,缺少后者的权限,这是导致403的核心原因。
内容的提问来源于stack exchange,提问作者Salvador Lopez
相关产品推荐
相关产品推荐

