Bitbucket Pipeline运行Terraform访问S3后端初始化报错问题咨询
问题根因
- Bitbucket Pipelines 的每个step都是独立运行的隔离容器,前序step的工作目录切换、生成的临时文件不会自动传递到后续step,你的现有配置存在两个路径问题:
- 第一步执行的
cd terraform/environments/dev仅对当前step生效,第二步执行terraform init时实际处于仓库根目录,没有读取到dev路径下的provider.tf配置 - 第三步执行
terraform workspace select同样在根目录运行,找不到terraform init生成的.terraform缓存目录,就触发了需要重新初始化的报错
- 第一步执行的
- 你推测的AWS/S3访问权限问题也需要同步处理,初始化S3后端、调用AWS资源都需要有效鉴权凭证
解决方案
你不需要主动在bitbucket-pipelines.yml中引用provider.tf,terraform执行命令时会自动读取当前工作目录下的所有.tf配置文件,按以下步骤调整即可:
1. 调整流水线配置
推荐直接将关联操作合并为同一个step,避免多step的文件传递开销,修正后的bitbucket-pipelines.yml参考如下:
image: hashicorp/terraform pipelines: branches: test: - step: name: 'Terraform Dev Environment Operations' script: # 先切换到dev环境目录,所有后续命令都在该目录下执行 - cd terraform/environments/dev - terraform init - terraform workspace select default condition: changesets: includePaths: - "terraform/modules" - "terraform/environments/dev"
如果你需要保留多step拆分的结构,需要给初始化step配置artifacts传递缓存目录,同时每个step都先切换工作目录:
image: hashicorp/terraform pipelines: branches: test: - step: name: 'Initialize Terraform' script: - cd terraform/environments/dev - terraform init artifacts: # 将init生成的缓存目录传递给后续step - terraform/environments/dev/.terraform/** condition: changesets: includePaths: - "terraform/modules" - "terraform/environments/dev" - step: name: 'Select workspace' script: - cd terraform/environments/dev - terraform workspace select default
2. 配置AWS鉴权凭证
进入对应Bitbucket仓库的 Repository settings → Repository variables 页面,添加两个变量:
AWS_ACCESS_KEY_ID:有权限assume你配置的arn:aws:iam::123:role/terraform-access角色的访问密钥IDAWS_SECRET_ACCESS_KEY:对应访问密钥的Secret
terraform的AWS provider会自动读取这两个环境变量完成鉴权,顺利访问S3后端。
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

