Terraform CircleCI中的地形破坏失败
我目前使用CircleCI作为我的CI工具,使用Terraform构建AWS基础设施 我的流程是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
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"