首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Gitlab管道中运行两次并已创建资源时,Terraform命令将失败

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

Stack Overflow用户
提问于 2019-03-01 12:04:50
回答 1查看 1.7K关注 0票数 1

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

如果我从本地主机运行terraform initterraform planterraform apply,那么一切都是我想要创建的。

当涉及到我的Gitlab CI/CD管道时,问题就出现了,因为Terraform抱怨现有资源(第一次正常运行,第二次抱怨并抛出错误)。

我的Terraform步骤在我的.gitlab-ci.yml文件中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
 script:
 - cd terraform
 - terraform init
 - terraform import aws_dynamodb_table.demo-dynamodb-table demo-dynamodb-table
 - terraform apply -auto-approve

Gitlab控制台中的错误是:

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

因此,总结一下:我需要知道如何正确地使用Terraform,以便能够在我的Gitlab /CD管道中运行apply命令,而不会与该管道上一次运行时创建的资源发生冲突。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 23:23:40

正如其他人所述,您需要存储Terraform状态。

在我的GitLab项目中,我使用一个S3桶来存储Terraform状态。但是,通过设置GitLab环境变量,让CI管道根据TF_CLI_ARGS_init项目的路径填充密钥。

代码语言:javascript
复制
terraform {
  backend "s3" {
    bucket = "bucket-name-here"
    region = "us-west-2"
    # key = $CI_PROJECT_PATH_SLUG
  }
}

我还根据项目设置Terraform工作区。这可以修改为支持分支。我还将name变量设置为项目名称,用于Terraform配置。并且,将输入设置为false,以便CI作业不会在用户提示下挂起。

代码语言:javascript
复制
variables:
  TF_INPUT: "false"
  TF_WORKSPACE: "$CI_PROJECT_NAME"
  TF_VAR_name: "$CI_PROJECT_NAME"
  TF_CLI_ARGS_init: "-upgrade=true"

对于破坏,我还确保删除工作区,这样桶中就没有剩余的东西了。

代码语言:javascript
复制
.destroy:
  extends: .terraform
  stage: Cleanup
  script:
    - terraform init
    - terraform destroy
      -auto-approve
    - export WORKSPACE=$TF_WORKSPACE
    - export TF_WORKSPACE=default
    - terraform workspace delete "$WORKSPACE"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54944314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档