Terraci销毁在CircleCI中失败

时间:2019-01-17 10:02:14

标签: 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

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

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

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

1 个答案:

答案 0 :(得分:1)

您应该使用remote state

仅当您始终在同一台计算机上运行并且不关心意外删除某些内容等情况时丢失状态文件时,本地状态才有用。

您可以混合并匹配任何可用的状态后端,但是当您使用AWS时,使用S3 backend可能是最有意义的。

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

作为示例,在要在其中运行Terraform的每个目录中都应有类似此块的内容:

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机器之间共享状态。您还应该考虑使用DynamoDB调查state locking,以防止状态被多个人同时修改状态所破坏。同样,您还应该考虑在用于存储状态的S3存储桶上启用版本控制,以便在出现任何问题时始终可以返回到状态的早期版本。