向已成功 运行 的现有 Terraform 代码添加条件

Adding condition to existing Terraform code that was successfully run

由于我正在使用已 运行 成功对抗 AWS 的现有 Terraform 代码,我发现我想在不同区域重用代码,而不必拥有第二组相同的代码。一些代码影响全球服务,这意味着我不需要它在其他地区重新 运行,所以我想在一些 terraform 模块中包含 count = "${var.alreadyrun}" == "yes" ? 1 : 0

但是,当我将以上行添加到特定模块的现有代码时,当我针对同一区域进行 运行 terraform 规划时,它已经 运行 进行了规划,它告诉我它正在运行销毁并重新添加这些模块。我不想破坏和重新创建模块,我只想跳过它并继续进行下一个。我有办法做到这一点吗?

count 添加到 module 块会导致 Terraform 跟踪该块的多个实例,因此模块的地址将从 module.example 变为 module.example[0] 而不是,因此默认情况下,Terraform 将假设您要销毁没有实例密钥的旧模块实例,并创建一个实例密钥为零的新模块实例。

但是,如果您使用的是 Terraform v1.1 或更高版本,您可以添加一个额外的声明来告诉 Terraform 您想要将现有模块实例“移动”到新地址。对于 module "example" 块,它看起来像这样:

module "example" {
  source = "./modules/example"
  count  = var.enable_example ? 1 : 0

  # ...
}

moved {
  from = module.example
  to   = module.example[0]
}

Terraform 文档部分 Refactoring 中有关于 moved 块的更多详细信息。


作为旁注,当像这样基于 n 输入变量声明条件模块或资源时,更典型的是将其命名为 enable_example 之类的名称,如我上面所示,而不是像“已经运行",因为 Terraform 配置通常应声明所需状态,而不是描述如何达到该状态。

您可能还希望研究将 Terraform 配置拆分为多个部分的可能性,以便有一个只使用一次的“全局”配置,然后有一个用于每个区域的“区域”配置。这将避免需要将其中一个区域视为“特殊区域”,同时负责全球基础设施,从而在所有配置之间创建更清晰的依赖关系图,供未来维护者理解。

不过,这两个建议都与您的直接问题无关;我上面描述的 moved 块是更直接的答案。