Terraform CircleCI中的地形破坏失败

Terraform CircleCI中的地形破坏失败,terraform,circleci,Terraform,Circleci,我目前使用CircleCI作为我的CI工具,使用Terraform构建AWS基础设施 我的流程是 使用Terraform创建AWS实例 安装Docker并在其上运行Nginx映像 破坏基础设施 我的电路配置如下: version: 2 jobs: terraform_apply: working_directory: ~/tmp docker: - image: hashicorp/terraform:light - image

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

我的流程是

  • 使用Terraform创建AWS实例
  • 安装Docker并在其上运行Nginx映像
  • 破坏基础设施
  • 我的电路配置如下:

    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工作流

    我的第一个作业正在成功运行,但当我启动第二个作业时,它将从头开始,因此我无法获得上一个terraform应用状态,因此terraform无法破坏我已经创建的基础结构

    我正在寻找某种解决方案,在那里我可以以某种方式保存状态文件并将其复制到下一个工作中,terraform可以破坏我以前的体系结构,您应该使用它

    只有当您总是在同一台机器上运行,并且不关心在意外删除某些内容时丢失状态文件时,本地状态才有用

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

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

    例如,在运行Terraform的每个目录中都应该有类似于此块的内容:

    terraform {
      backend "s3" {}
    }
    
    然后,您可以在以下过程中执行此操作:

    一旦运行了
    terraforminit
    ,terraform将从S3获取任何计划的状态。然后在
    地形应用
    地形销毁
    上,它将根据需要更新状态文件


    这将允许您在同事之间以及CI/CD机器之间轻松共享状态。您还应该考虑使用DyNoDB来防止多个人同时修改状态而损坏状态。同样地,您也应该考虑在存储状态的S3桶上启用版本化,这样您就可以在任何问题的情况下回到状态的早期版本。

    我在MIN .tf文件中添加了以下代码,<代码>数据“TrRAFrFixReleTeX状态”“网络”{Be后端=“S3”配置}{Buff=“terraform state产品测试”key=“network/terraform.tfstate”region=“ap-south-1”shared\u credentials\u file=“credentials”}和我的“terraform init-backend=true-backend config=“bucket=terraform state产品测试”-backend config=“key=network/terraform.tfstate”“在circleci配置文件中,它仍然不工作不,这是您从存储在S3中的地形状态文件访问数据的方式,而不是您配置状态后端的方式。看看我答案中的代码,同时阅读关于远程后端的链接,你会发现其中的区别。我添加了以下代码
    资源“aws_s3_bucket_object”“object”{bucket=“terraform state prod test”key=“terraform.tfstate”source=“/root/tmp/terraform.tfstate”}
    ,它成功地上传了我的s3上的“terraform.tfstate”文件我还将
    数据“terraform\u remote\u state”“network”{backend=“s3”config{bucket=“terraform state prod test”key=“terraform.tfstate”region=“ap-south-1”shared\u credentials\u file=“credentials”}
    代码添加到main.tf(1/2)中在config.yml中,我添加了以下内容
    terraforminit-backend=true-backend config=“bucket=terraform state prod test”-backend config=“key=terraform.tfstate”-force copy-get=true-input=false
    ,但当我运行时,它显示0已销毁(2/2)
    terraform init -backend-config="bucket=uniquely-named-terraform-state-bucket" \
                   -backend-config="key=state-key/terraform.tfstate"