我对Terraform相当陌生,我试图在terraform配置中复制已经为生产而构建的堆栈(基本上是:Api网关-Lambda-DynamoDB)。
如果我先运行terraform init
,terraform plan
,然后再从本地主机运行terraform apply
,则将根据需要创建所有内容。
当我的Gitlab CI / CD管道出现问题时,由于Terraform抱怨现有资源(第一次运行正常,第二次抱怨并抛出错误)。
我的Terraform进入了我的.gitlab-ci.yml
文件:
plan:
stage: plan
image:
name: hashicorp/terraform:light
entrypoint:
- '/usr/bin/env'
- 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
script:
- cd terraform
- rm -rf .terraform
- terraform --version
- terraform init
- terraform plan
deploy:
stage: deploy
image:
name: hashicorp/terraform:light
entrypoint:
- '/usr/bin/env'
- 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
script:
- cd terraform
- terraform init
- terraform apply -auto-approve
dependencies:
- plan
when: manual
因此,经过一段时间的Google搜索后,我发现terraform import
命令可能会有所帮助。
然后将此import
命令添加到我的.gitlab-ci.yml中:
script:
- cd terraform
- terraform init
- terraform import aws_dynamodb_table.demo-dynamodb-table demo-dynamodb-table
- terraform apply -auto-approve
所以总结一下:我将需要知道如何以正确的方式使用Terraform,以便能够在我的Gitlab CI / CD管道中运行apply
命令,而不会与之前创建的资源冲突。运行相同的管道。
答案 0 :(得分:1)
正如其他人所说,您需要存储Terraform状态。
在我的GitLab项目中,我使用一个S3存储桶来存储Terraform状态。但是,通过设置TF_CLI_ARGS_init
环境变量,使CI管道根据GitLab项目的路径填写密钥。
terraform {
backend "s3" {
bucket = "bucket-name-here"
region = "us-west-2"
# key = $CI_PROJECT_PATH_SLUG
}
}
我还根据项目设置了Terraform工作区。可以对其进行修改以支持分支。我还将name
变量设置为项目名称,以用于Terraform配置。并且,将输入设置为false,以使CI作业不会挂在用户提示上。
variables:
TF_INPUT: "false"
TF_WORKSPACE: "$CI_PROJECT_NAME"
TF_VAR_name: "$CI_PROJECT_NAME"
TF_CLI_ARGS_init: "-upgrade=true"
对于销毁,我还确保删除工作空间,以免存储桶中没有东西。
.destroy:
extends: .terraform
stage: Cleanup
script:
- terraform init
- terraform destroy
-auto-approve
- export WORKSPACE=$TF_WORKSPACE
- export TF_WORKSPACE=default
- terraform workspace delete "$WORKSPACE"