我目前使用 CircleCI 作为我的 CI 工具来使用 Terraform 构建 AWS 基础设施
我的流程是,
- 使用 Terraform 创建 AWS 实例
- 安装 Docker 并在其上运行 Nginx 镜像
- 破坏基础设施
我的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 apply
或 terraform destroy
上,它将根据需要更新状态文件。
这将使您能够轻松地在同事之间以及 CI/CD 机器之间共享状态。您还应该考虑调查 state locking使用 DynamoDB 防止状态被多人同时修改状态破坏。同样,您还应该考虑在用于存储状态的 S3 存储桶上启用版本控制,以便在出现任何问题时始终可以返回到较早版本的状态。
关于Terraform 销毁在 CircleCI 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54233361/