【问题标题】:Terraform - one centralized state or multiple modular statesTerraform - 一种集中状态或多种模块化状态
【发布时间】:2018-03-01 23:39:51
【问题描述】:

我已经为我们在 AWS 中构建虚拟数据中心所需的所有资源创建了一个 terraform 堆栈。 VPC、子网、安全组等。

这一切都很好:)。我一直在与网络工程师争论,他们希望拥有一个完全独立的网络状态等。因此,我们必须管理多个状态文件,并且需要 10 到 15 个 terraform plan/apply 命令来启动数据中心.不仅我们必须多次运行命令,我们不能在创建 ec2 实例时引用模块输出变量等,所以现在变量文件中出现了“魔术”变量。我想将创建 ec2 实例、els 等的脚本放在与“数据中心”配置相同的目录中,以便我们管理一个状态文件(在 s3 中使用 dynamodb 锁加密)并且我们的 git 存储库具有一对一的关系与我们的基础设施的关系。还有一个额外的好处是,单个 terraform 计划/应用将在单个命令中构建整个数据中心。

问题真的是,在单个状态文件中管理数据中心资源(vpc、子网、安全组)和计算资源是个好主意吗?有没有我可能会遇到的问题?有没有人以这种方式使用 terraform 管理 AWS 环境?

问候, 大卫

【问题讨论】:

    标签: amazon-web-services stack terraform


    【解决方案1】:

    Terraform provider 开始,让我们访问来自其他状态文件的输出变量,这样您就不必使用魔法变量。其余的只是你的风格问题。您是否经常启动整个数据中心基础设施?如果是这样,您可以考虑在一个项目中进行。另一方面,如果您只更改某些内容,您可能希望依靠其他项目的输出使其更加模块化。将它们分开可以加快规划速度并避免代价高昂的terraform destroy 错误。

    【讨论】:

      【解决方案2】:

      在过去几年中,关于 Terraform 项目的布局进行了很多讨论。

      Terraform 1.0 时代也发生了变化,所以我认为这个问题值得关注。

      因此,我们必须管理多个状态文件,并且需要 10 到 15 个 terraform plan/apply 命令才能启动数据中心。

      使用模块可以维护分离的状态,而无需为每个状态执行命令。

      不仅我们必须多次运行命令,我们无法引用模块输出变量

      Terraform 支持output values。利用 Terraform Cloud 或 Terraform remote states 可以在状态之间引入依赖关系。

      在我看来,冒险进入多个 Terraform 状态的先决条件是使用state locking(OP 是指使用 AWS DynamoDB 锁定机制,但其他存储后端也支持这一点)。

      通常将所有内容置于单一状态并不是最佳解决方案,可能会被视为反模式

      拥有多个状态称为状态隔离

      为什么要隔离状态?

      原因很多,好处很明显:

      • 虫子爆炸半径。如果您在代码中的某处引入错误,并且在最糟糕的情况下为整个数据中心应用 all 代码,那么一切都会受到影响。另一方面,如果在最坏的情况下将网络分离,则该错误只会影响网络(在 DC 中这将是一个非常严重的问题,但仍然比一切都好)。
      • 状态(写入)锁定。如果您使用状态锁,Terraform 将为任何可能写入状态的操作锁定状态。这意味着,在单个状态下,在不同区域工作的多个团队无法同时写入状态,因此更新网络会阻止实例配置。
      • 秘密。秘密以纯文本形式写入状态。单一状态意味着所有团队的机密最终都将处于相同的状态(您必须加密,OP 正确地这样做了)。与任何具有安全性的东西一样,将所有鸡蛋放在同一个篮子里都是一种风险。

      隔离状态的另一个好处是文件布局可能有助于代码所有权(跨团队或项目)。

      如何隔离状态?

      主要有3种方式:

      1. 通过文件布局(带或不带模块)
      2. 通过工作区(不要与 Terraform 云工作区混淆)
      3. 混合以上方式(Here be dragons!)

      关于如何做到这一点没有广泛的共识,但有待进一步阅读:

      值得一看的工具可能是来自 Gruntwork 的 Terragrunt

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        相关资源
        最近更新 更多