CodeBuild配置Terraform S3后端遇权限拒绝及角色无法假设问题
问题解决:CodeBuild中Terraform S3后端的403和角色假设错误
核心问题分析
你遇到的两类错误根源在于两个关键冲突:
- Terraform S3后端配置中指定了
role_arn,导致它忽略了你在CodeBuild中已导出的临时凭据,尝试自行扮演角色,引发角色假设失败或权限不足。 - 跨账号场景下,仅给CodeBuild角色附加S3FullAccess无法生效,必须给S3桶配置资源策略授权目标角色访问。
具体修复步骤
1. 调整Terraform后端配置
移除后端配置里的role_arn和session_name参数,因为你已经通过CodeBuild脚本获取了临时凭据并导出为环境变量,Terraform会自动读取这些环境变量:
terraform { backend "s3" { bucket = "kcr-cs-bucket-xxxxxxxx-bucket-name" encrypt = true key = "terraform.tfstate" } }
2. 配置S3桶资源策略(跨账号必做)
如果S3桶与你假设的角色不在同一AWS账号,需要给桶添加资源策略,允许目标角色执行必要的S3操作。示例策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::xxxxxx:role/role-name" }, "Action": [ "s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::kcr-cs-bucket-xxxxxxxx-bucket-name", "arn:aws:s3:::kcr-cs-bucket-xxxxxxxx-bucket-name/terraform.tfstate" ] } ] }
3. 验证角色权限
确保你通过aws sts assume-role获取的目标角色(arn:aws:iam::xxxxxx:role/role-name)本身拥有上述S3操作的权限(可通过IAM策略直接附加,或结合桶资源策略实现)。注意:CodeBuild角色的S3FullAccess仅对同账号桶生效,跨账号场景必须依赖桶资源策略授权。
4. 调试验证
- 在
terraform init前,确认aws sts get-caller-identity返回的是你假设的角色ARN,确保环境变量已正确加载。 - 可以在CodeBuild脚本中添加以下命令,验证临时凭据是否能直接访问S3桶:
aws s3 ls s3://kcr-cs-bucket-xxxxxxxx-bucket-name # 如果tfstate文件已存在,尝试下载验证 aws s3 cp s3://kcr-cs-bucket-xxxxxxxx-bucket-name/terraform.tfstate /tmp/test.tfstate
内容的提问来源于stack exchange,提问作者Jatin Mehrotra
相关产品推荐
相关产品推荐

