拆分terraform tfstate文件

拆分terraform tfstate文件,terraform,Terraform,我们从一个tfstate文件开始,随着时间的推移,它增长了很多 现在,计划起来真的很慢,我现在想分成几个tfstate文件(一个用于开发环境,一个用于通用共享基础架构,每个生产环境一个) 就像在和中描述的那样 是否有任何现有的工具(内置或不内置)来帮助这一点?有点像地形状态mv,但在TF状态之间?为基础设施和应用程序分别提供一个单独的状态文件是有意义的 是否有任何现有的工具(内置或不内置)来帮助这一点?有点像地形状态mv,但在两个状态之间 不,据我所知。将共享部件(例如ECS群集、ALB、网络配

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

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

就像在和中描述的那样


是否有任何现有的工具(内置或不内置)来帮助这一点?有点像地形状态mv,但在TF状态之间?

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

是否有任何现有的工具(内置或不内置)来帮助这一点?有点像地形状态mv,但在两个状态之间

不,据我所知。将共享部件(例如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
当您想将应用程序部署到测试或UAT时,只需在基础设施项目中的
terraform apply
之前调用
terraform init
,方法是提供非产品S3状态的路径。然后通过提供测试路径或UAT路径,在应用程序terraform config上调用
terraform init

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

/my shared infrastructure/provision-infrastructure.sh


/my-app-1/deploy-application.shuat v1.0

在一个复杂的世界中,从我所处的环境来看,我们走得更远。经过共同努力,我们不仅成功地隔离了环境,而且成功地隔离了作为基础架构一部分的所有组件

深入挖掘,组件我指的是每个组件的一组模块/输出,配置中没有额外的资源,但当然出现了依赖性问题。。。没有什么不能用一些对微小状态的数据{}引用和一些脚本来解决的

结果真是太棒了。我们用不同的参数实例化了相同的组件,每个环境都很干净,易于维护和操作


我不建议在现有笨重基础设施的情况下采用这种方法,如果您厌倦了单个单一的单一状态文件,则需要一些额外的与转换相关的活动,但它可以在绿地项目中实现大量加速。

地形状态mv
具有
-state out
标志,您可以在其中定义要将资源移动到的另一个状态

但是,我无法让它与版本0.11.14一起工作,因此我手动剪切并粘贴了状态文件中的模块,以移动到另一个状态,这非常有效


编辑:这里有一个解决方法,它基本上会加载两个状态文件,移动所需的状态,然后将它们重新加载到S3存储桶:

如果有,我会对该工具感兴趣。我倾向于使用terraform rm和terraform导入到另一个状态文件中。或者复制状态文件并删除不需要的内容。取决于您在这里管理的资源数量,嗯,我想编写脚本并没有那么糟糕,我们将
地形状态列表
,然后使用
rm
+
import
…还不错,但我想gotcha是无法导入的资源,例如路由表中的单个路由(上次我检查时,你无论如何也不能)Terraform文档示例:。我无法解释为什么它对@dimitris不起作用,但对我来说效果很好。(可能是因为TF现在又成熟了5年?)可能是因为我尝试了s3支持的后端。没有在两个状态都在本地可用的情况下进行测试。哦,说得好。我只是想要一个快速的POC,所以我使用了本地tfstate文件。