Terraform:模块的名称可以动态解析吗?

Joh*_*ohn 2 terraform

给定一系列名称遵循一定模式的模块:

module "mod-a" {
  // ...
}

module "mod-b" {
  // ...
}

module "mod-b" {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

假设每个模块定义了一个名为 的输出my_output,我可以根据动态解析名称引用特定模块吗?

例如

...
// some_module = "mod-a"
some_value = module[some_module].my_output
...
Run Code Online (Sandbox Code Playgroud)

上面的语法给出了错误:

The "module" object cannot be accessed directly. Instead, access one of its
attributes.
Run Code Online (Sandbox Code Playgroud)

是否有另一种方法来访问其名称仅在运行时才知道的模块?

Mar*_*ins 6

要在当今的 Terraform(Terraform 0.12.13)中实现此目的,您需要显式构造一个合适的地图作为本地值,然后对该地图建立索引:

locals {
  modules = {
    mod_a = module.mod_a
    mod_b = module.mod_b
    mod_c = module.mod_c
  }
}
Run Code Online (Sandbox Code Playgroud)

在配置的其他地方,您可以使用类似 的表达式local.modules[local.dynamic_module_key],从地图中选择所需的对象。

Terraform 需要对此类对象的静态引用,以便它可以正确构建依赖关系图。在这种情况下,Terraform 推断 取决于local.modules所有这三个模块的所有输出,因此任何引用都local.modules必须等到所有这些模块的所有输出准备就绪,以确保最终索引操作具有完整的结果合作价值。