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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:17:42