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

AWS CodeBuild执行Terraform init报错:S3后端无有效凭证

解决CodeBuild中Terraform S3后端凭证无效问题

问题场景

  • 使用Terraform 1.2.7,AWS CodeBuild配置为扮演devops角色(已配置CodeBuild信任关系,且角色拥有管理员权限)
  • 本地执行terraform init/plan/apply完全正常
  • CodeBuild中执行时先报no valid credential sources for S3 Backend found.,移除Terraform后端及provider配置中的role_arn后问题依旧
  • 手动在CodeBuild环境通过CLI获取devops角色凭证,导出为环境变量后执行terraform init,仍提示InvalidClientTokenId: 安全令牌无效

原因分析

  1. 凭证冲突:CodeBuild会自动注入任务角色的临时凭证,手动获取并导出的凭证会和内置凭证冲突,导致Terraform读取到无效的凭证
  2. Terraform凭证优先级问题:即使移除配置中的role_arn,Terraform可能优先读取缓存的旧凭证或错误的环境变量
  3. 手动获取凭证的上下文问题:手动执行sts assume-role获取的凭证没有和CodeBuild的环境上下文正确关联,导致令牌无效

解决方案

1. 完全依赖CodeBuild内置凭证

不要手动在BuildSpec中执行aws sts assume-role来获取凭证,CodeBuild会自动将devops角色的临时凭证注入到环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN)。

示例BuildSpec配置:

version: 0.2
env:
  shell: bash
phases:
  install:
    commands:
      # 安装指定版本的Terraform
      - wget https://releases.hashicorp.com/terraform/1.2.7/terraform_1.2.7_linux_amd64.zip
      - unzip terraform_1.2.7_linux_amd64.zip
      - mv terraform /usr/local/bin/
      - terraform --version
  pre_build:
    commands:
      # 清理可能存在的旧凭证
      - rm -rf ~/.aws/credentials ~/.aws/config
      - unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
      # 验证当前凭证身份
      - aws sts get-caller-identity
  build:
    commands:
      - terraform init -input=false
      - terraform plan -input=false
      - terraform apply -input=false -auto-approve

2. 简化Terraform配置

移除后端和provider配置中的role_arn,让Terraform自动使用环境变量中的凭证:

后端配置:

terraform {
  backend "s3" {
    bucket = "your-terraform-state-bucket"
    key    = "infra/prod/state.tfstate"
    region = "cn-north-1" # 替换为你的区域
  }
}

AWS Provider配置:

provider "aws" {
  region = "cn-north-1" # 替换为你的区域
}

3. 确认角色信任关系

检查devops角色的信任策略,确保允许CodeBuild服务扮演该角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "codebuild.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

4. 禁用CodeBuild缓存

如果之前有配置CodeBuild的缓存,可能会残留旧凭证数据,建议临时禁用缓存测试,或者在BuildSpec中添加清理缓存的步骤。

验证步骤

执行CodeBuild任务后,观察pre_build阶段的aws sts get-caller-identity输出,如果返回的是devops角色的ARN,说明凭证正常,Terraform后续的init操作应该能成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:36:20