我已经为我们在AWS中构建虚拟数据中心所需的所有资源创建了一个terraform堆栈。VPC、子网、安全组等。
这一切都很好:)。我经常与网络工程师争论,他们想要有一个完全独立的网络状态等等。因此,我们必须管理多个状态文件,它需要10到15个terraform计划/应用命令才能到达数据中心。不仅仅是我们必须多次运行这些命令,我们不能在创建ec2实例等时引用模块输出变量,所以现在变量文件中出现了“神奇”变量。我希望将创建ec2实例、els等的脚本放在与“数据中心”配置相同的目录中,这样我们就可以管理一个状态文件(使用dynamodb锁在s3中加密),并且我们的git与我们的基础设施有一对一的关系。另外,单一的terraform计划/应用程序将在一个命令中构建整个数据中心,这也带来了额外的好处。
问题是,在单个状态文件中管理数据中心资源(vpc、子网、安全组)和计算资源是个好主意吗?有什么问题我可能会遇到吗?有人有用这种方式管理AWS环境的经验吗?
你好,大卫
发布于 2017-09-20 20:32:34
首先,让我们访问其他状态文件中的输出变量,这样您就不必使用神奇的变量了。剩下的只是你的风格问题。你经常把整个数据中心的基础设施都拿上来吗?如果是这样的话,你可以考虑在一个项目中进行。另一方面,如果您只改变了一些东西,您可能想要使它更加模块化,依赖于其他项目的输出。保持它们的分离使得规划更快,并且避免了代价非常高的terraform destroy错误。
发布于 2022-02-02 18:49:24
在过去的几年里,有很多关于Terraform项目布局的讨论。
随着Terraform1.0的出现,时代也发生了变化,所以我认为这个问题值得我们去关注。
因此,我们必须管理多个状态文件,它需要10到15个terraform计划/应用命令才能到达数据中心。
使用模块可以维护分离状态,而不需要对每个状态执行命令。
不仅仅是我们必须多次运行命令,我们不能引用模块输出变量。
Terraform支持输出值。利用Terraform或Terraform远程状态可以在状态之间引入依赖关系。
在我看来,进入多个Terraform状态的先决条件是使用状态锁定 (OP指的是使用AWS DynamoDB锁机制,但其他存储后端也支持这种机制)。
通常,在单一状态下拥有所有东西并不是最好的解决方案,可能会被认为是反模式。
具有多个状态称为状态隔离。
你为什么要孤立国家?
原因是多方面的,好处是明确的:
隔离状态的另一个好处是文件布局可能有助于代码所有权(跨团队或项目)。
如何隔离状态?
主要有三种方式:
关于如何做到这一点,没有达成广泛的共识,只能作进一步的阅读:
一个值得一看的工具可能是Terragrunt来自Gruntwork。
https://stackoverflow.com/questions/46330036
复制相似问题