在Gitlab管道中运行两次并且已经创建资源时,Terraform apply命令失败

时间:2019-03-01 12:04:50

标签: gitlab terraform

我对Terraform相当陌生,我试图在terraform配置中复制已经为生产而构建的堆栈(基本上是:Api网关-Lambda-DynamoDB)。

如果我先运行terraform initterraform 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

我在管道控制台中看到以下错误: enter image description here

因此,经过一段时间的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

并且Gitlab控制台中的错误是: enter image description here

同时,我也在本地尝试了最后一次更改,错误是: enter image description here

所以总结一下:我将需要知道如何以正确的方式使用Terraform,以便能够在我的Gitlab CI / CD管道中运行apply命令,而不会与之前创建的资源冲突。运行相同的管道。

1 个答案:

答案 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"