我对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我在管道控制台中看到以下错误:

因此,在谷歌搜索之后,我发现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-approveGitlab控制台中的错误是:

同时,我还在本地尝试了最后一个更改,错误是:

因此,总结一下:我需要知道如何正确地使用Terraform,以便能够在我的Gitlab /CD管道中运行apply命令,而不会与该管道上一次运行时创建的资源发生冲突。
发布于 2019-03-01 23:23:40
正如其他人所述,您需要存储Terraform状态。
在我的GitLab项目中,我使用一个S3桶来存储Terraform状态。但是,通过设置GitLab环境变量,让CI管道根据TF_CLI_ARGS_init项目的路径填充密钥。
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"https://stackoverflow.com/questions/54944314
复制相似问题