拆分 terraform tfstate 文件

mun*_*nch 5 terraform

我们从一个 tfstate 文件开始,随着时间的推移它增长了很多。

现在,计划真的很慢,我现在想分成几个 tfstate 文件(一个用于我们的开发环境,一个用于通用共享基础设施,一个用于每个生产环境)。

就像在https://charity.wtf/2016/03/30/terraform-vpc-and-why-you-want-a-tfstate-file-per-env/Terraform Multiple State Files Best Practice Examples 中的描述一样。

是否有任何现有工具(内置或非内置)可以帮助解决此问题?terraform state mv有点像,但在 tfstates 之间?

Dim*_*dis 5

terraform state mv-state-out标志,您可以在其中定义另一个状态以将资源移至其中。

但是,我无法让它与 0.11.14 版本一起工作,因此我手动从需要移动到另一个状态的状态文件中剪切和粘贴模块,效果非常好。

编辑:这是一个解决方法,基本上dwonloads两个状态文件,移动所需的状态,然后将它们重新上传到S3存储桶: https: //github.com/hashicorp/terraform/pull/15652#issuecomment-410754814


bit*_*ain 1

为基础设施和应用程序分别拥有一个单独的状态文件是有意义的。

是否有任何现有工具(内置或非内置)可以帮助解决此问题?有点像 terraform state mv 但在 tfstates 之间?

不,据我所知。将共享部分(例如 ECS 集群、ALB、网络配置、iam 角色等)移出到单独的项目/存储库中。

使用 S3 作为状态后端时,您可以为基础设施和应用程序状态定义不同的路径,例如:

  • /infrastructure/nonprod/terraform.tfstate
  • /infrastructure/prod/terraform.tfstate
  • /apps/app1/test/terraform.tfstate
  • /apps/app1/uat/terraform.tfstate
  • /apps/app1/prod/terraform.tfstate

当您想要将应用程序部署到 TEST 或 UAT 时,您只需在基础设施项目中调用terraform initbeforeterraform apply即可提供非产品 S3 状态的路径。然后terraform init通过提供 TEST 或 UAT 路径的路径来调用应用程序 terraform 配置。

理想情况下,您可以创建自己的 shell 脚本来配置和部署您的应用程序。然后,在您最喜欢的 CI 中,您可以创建一个管道来配置基础设施并根据需要部署应用程序。确保对这些脚本进行参数化,以便可以传递要配置的环境或要部署的应用程序,例如:

./my-shared-infrastructure/provision-infrastructure.sh nonprod

./my-app-1/deploy-application.sh uat v1.0