Terraform 销毁在 CircleCI 中失败

标签 terraform circleci

我目前使用 CircleCI 作为我的 CI 工具来使用 Terraform 构建 AWS 基础设施

我的流程是,

  1. 使用 Terraform 创建 AWS 实例
  2. 安装 Docker 并在其上运行 Nginx 镜像
  3. 破坏基础设施

我的CircleCI配置如下,

version: 2
jobs:
  terraform_apply:
    working_directory: ~/tmp
    docker:
            - image: hashicorp/terraform:light
            - image: ubuntu:16.04

    steps:
      - checkout
      - run:
          name: terraform apply
          command: |
            terraform init
            terraform apply -auto-approve
      - store_artifacts:
          path: terraform.tfstate

  terraform_destroy:
    working_directory: ~/tmp
    docker:
            - image: hashicorp/terraform:light
            - image: ubuntu:16.04
    steps:
      - checkout
      - run:
          name: terraform destroy
          command: |
            terraform init
            terraform destroy -auto-approve

workflows:
  version: 2
  terraform:
    jobs:
      - terraform_apply
      - click_here_to_delete:
          type: approval
          requires:
            - terraform_apply
      - terraform_destroy:
          requires:
            - click_here_to_delete

这里我使用了 2 个作业,一个用于在 CircleCI 工作流中创建,一个用于删除。

我的第一份工作运行成功,但当我开始第二份工作时,它从头开始,所以我无法获得以前的terraform 应用状态,因此 terraform 无法破坏我已经创建的基础设施。

我正在寻找一些解决方案,我可以以某种方式保存状态文件并将其复制到下一个 terraform 可以破坏我以前的架构的工作

最佳答案

你应该使用 remote state .

本地状态只有在你总是在同一台机器上运行并且不关心你的状态文件丢失时才有用,如果你不小心删除了一些东西等等。

您可以混合和匹配任何可用的状态后端,但由于您已经在使用 AWS,使用 S3 backend 可能最有意义.

您需要为每个位置定义状态配置,这可以在配置中完全硬编码,完全通过命令行标志或部分通过两者。

作为示例,您应该在每个要运行 Terraform 的目录中包含类似此 block 的内容:

terraform {
  backend "s3" {}
}

然后你可以finish configuring这期间 terraform init :

terraform init -backend-config="bucket=uniquely-named-terraform-state-bucket" \
               -backend-config="key=state-key/terraform.tfstate"

运行 terraform init 后,Terraform 将从 S3 获取任何计划的状态。然后在 terraform applyterraform destroy 上,它将根据需要更新状态文件。

这将使您能够轻松地在同事之间以及 CI/CD 机器之间共享状态。您还应该考虑调查 state locking使用 DynamoDB 防止状态被多人同时修改状态破坏。同样,您还应该考虑在用于存储状态的 S3 存储桶上启用版本控制,以便在出现任何问题时始终可以返回到较早版本的状态。

关于Terraform 销毁在 CircleCI 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54233361/

相关文章:

terraform - GKE 节点池状态停留在“PROVISIONING”状态

google-cloud-platform - Terraform - 在创建存储桶的同时将多个文件复制到存储桶

continuous-integration - 如何使用 2.1 配置和管道通过 API 触发 Circleci 作业

go - 同一网络中的应用程序和服务器之间的通信

github - circleCI - 如何在特定目录发生变化时运行作业

terraform - 如何使用 Terraform 将多个自定义操作添加到 Azure 逻辑应用程序?

terraform - 我可以在 Terraform 中为自动生成的资源选择名称吗?

amazon-web-services - Terraform:如何从一个资源 block 创建多个 aws 子网?

circleci - Circle CI CLI 在结账步骤中挂起

node.js - Observable.fromPromise 仅在 CircleCI 上构建时不存在