我正在尝试使用 GitLab CI/CD 运行 Terraform 和 AWS 提供商。我使用后端作为 S3 来存储 tf.state 文件,一切运行正常。
作为研究的一部分,我想尝试使用 GitLab 管理的 Terraform tf.state。文档可以在以下位置找到:https://gitlab.mvtest-harbor.live/help/user/infrastructure/iac/terraform_state.md
我按照文档中说的步骤操作。我的后端文件如下所示:
后端.tf
data "terraform_remote_state" "gitlab-terraform-remote-state" {
backend = "http"
config = {
address = "https://XXXXXX.com/api/v4/projects/32/terraform/state/gitlab-terraform.tfstate"
username = "arjun"
password = "password"
}
}
我还将以下内容作为环境变量添加到 GitLab 服务器的 CI/CD 中。
PROJECT_ID="" TF_USERNAME=""
TF_PASSWORD=""
TF_ADDRESS="https://gitlab.com/api/v4/projects/${PROJECT_ID}/terraform/state/old-state-name"
在 .gitlab.ci.yaml 中,我是这样描述我的工作的:
.gitlab-ci.yaml
terraform plan:
stage: terraform-plan
dependencies:
- lambda package build
variables:
PLAN: plan.tfplan
JSON_PLAN_FILE: tfplan.json
STATE: dbrest.tfstate
cache:
paths:
- .terraform
before_script:
- alias convert_report="jq -r '([.resource_changes[]?.change.actions?]|flatten)|{\"create\":(map(select(.==\"create\"))|length),\"update\":(map(select(.==\"update\"))|length),\"delete\":(map(select(.==\"delete\"))|length)}'"
- cd terraform
- terraform --version
- terraform init -backend-config=address=${TF_ADDRESS} -backend-config=lock_address=${TF_ADDRESS}/lock -backend-config=unlock_address=${TF_ADDRESS}/lock -backend-config=username=${TF_USERNAME} -backend-config=password=${TF_PASSWORD} -backend-config=lock_method=POST -backend-config=unlock_method=DELETE -backend-config=retry_wait_min=5
script:
- cp ../artifacts/$CI_PIPELINE_ID.zip ./
- terraform plan -out=plan_file
- terraform show --json plan_file > plan.json
artifacts:
paths:
- plan.json
expire_in: 2 weeks
when: on_success
reports:
terraform: plan.json
only:
- main
allow_failure: false
needs: ['lambda package build']
管道运行后,terraform init
从 before_script 执行后,出现此错误:
│ 错误:无法 在 backend.tf 第 1 行的数据“terraform_remote_state”“gitlab-terraform-remote-state”中通过 data.terraform_remote_state.gitlab-terraform-remote-state找到
远程状态: │ 1:数据“terraform_remote_state”“gitlab-terraform-remote-state”{ │ │ 在给定的后端中未找到给定工作区的存储状态。
有人知道为什么会发生这种情况吗?
有人知道如何解决这个问题吗?
答案1
将 Terraform 后端从 local 更新为 http。如下所示:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
**backend "http" {}**
}