我目前正在使用CircleCI作为CI工具,以使用Terraform构建AWS基础架构
我的流程是
我的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可以破坏我以前的体系结构
答案 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 apply
或terraform destroy
上,它将根据需要更新状态文件。
然后,您可以轻松地在同事之间以及CI / CD机器之间共享状态。您还应该考虑使用DynamoDB调查state locking,以防止状态被多个人同时修改状态所破坏。同样,您还应该考虑在用于存储状态的S3存储桶上启用版本控制,以便在出现任何问题时始终可以返回到状态的早期版本。