【问题标题】:Link a state file to a module in Terraform将状态文件链接到 Terraform 中的模块
【发布时间】:2022-06-11 02:05:21
【问题描述】:

我的环境太大/太复杂,无法使用单个 Terraform 状态文件进行管理 - 所以我们需要有多个状态文件。我们目前的想法是每个对象类型都有一个状态文件 - 有很好的理由像这样构造它,所以我正在寻找使用这种结构的解决方案,而不是建议不同结构的解决方案。

配置每种对象类型的逻辑都封装在其自己的模块中,即有一个用于创建 AWS S3 存储桶的独立模块,一个用于创建雪花存储集成对象的独立模块等。

还有更高级别的模块通过调用较低级别的模块来配置更复杂的基础架构,即,因为有一种常见的模式是先配置 S3 存储桶,然后再配置引用 S3 存储桶的雪花存储集成对象,因此会是一个调用S3模块,然后调用雪花存储集成模块的模块。

是否有可能在使用 S3 模块配置 S3 存储桶时,它始终使用相同的 S3 状态文件 - 无论是直接调用该 S3 模块还是从更高级别的模块调用它?

因此,如果调用更高级别的模块,则 S3 配置将使用 S3 状态文件,而存储集成配置将使用存储集成状态文件

【问题讨论】:

  • “我们目前的想法是每个对象类型都有一个状态文件 - 有很好的理由像这样构造它” 除了 Terraform 根本不是这样工作的,你根本不能以这种方式使用 Terraform,所以除了你所有的好理由,你根本不能这样做。我认为您是在尝试将 Terraform 融入您对它应该是什么的想法中,而不是先了解它是什么以及它是如何工作的,然后才考虑您的公司如何使用它。
  • 好的 - 感谢 cmets。我得出的结论是,不幸的是,Terraform 不会像我们想要的那样为我们工作。可能有一种方法可以通过将大量业务流程/逻辑从 Terraform 移到另一个与 Terraform 接口的系统中来使其工作
  • 就目前而言,您需要将 Terraform 拆分为许多不同的项目,每个项目都有自己的 Terraform 状态,而不是拥有一个单一的 Terraform 项目。但即便如此,这个问题和您之前的问题中仍有一些问题,会引发很多关于您如何尝试管理可能与任何 IaaS 产品不兼容的云基础设施的危险信号。

标签: terraform


【解决方案1】:

在 Terraform 中,状态文件属于整个配置而不是单个模块。

如果您在同一个配置中多次调用同一个模块,它每次都会声明单独的资源,并且每个资源都将在该配置的整体状态文件中单独跟踪。

同样,如果您在不同配置中多次调用同一个模块,则每个模块都会在每个模块引用的配置中跟踪一组单独的资源。

Terraform 中的模块封装对象的声明,而不是实际的对象本身。共享模块旨在作为一种方式重用相同的定义来声明许多结构相似的单独对象,而不是在多个位置重用相同的对象。


使用 Terraform 在多个位置使用同一个对象的典型方法是确定一个负责管理该对象的配置,然后让您的其他配置使用 data sources 来表示对所管理对象的外部依赖其他地方。

您的 data 块可能会直接引用外部对象(如果适用),或者您可能会引入间接方法,例如在通用数据存储(例如 AWS SSM 参数)中的特定键下发布有关对象的 ID 信息存储,然后让其他配置读取该密钥,以了解他们应该使用的 ID。

因此,数据源可作为一种方式,为在特定 Terraform 配置之外管理的对象创建一种桥梁,以便您可以在配置的其他地方以类似于您可能直接引用的方式使用有关它们的信息到在相同配置中声明的资源对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2018-03-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多