如何在 Terraform 中重用变量*定义*?

Nei*_*eil 11 terraform

如果我创建一个像这样的变量定义:

variable "aws_ecs_config" {
  type = object({
    cpu               = number
    memory            = number
    ecs_image_address = string
  })
  logs = {
    type = object({
      group         = string
      region        = string
      stream_prefix = string
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

如何在多个地方重复使用该定义而无需复制粘贴?

Mar*_*ins 8

无法在 Terraform 中重复使用变量声明。如果不同模块中的变量具有相同的类型,则该类型必须在每个模块中重复。

Terraform 具有结构类型系统而不是名义类型系统,因此类型本身没有命名,而是由其形式匹配/约束。在模块之间传递值时,我们可以使用类型约束在一系列相关模块之间创建约定,但没有机制可以在一个地方定义类型(或声明变量)并在其他地方重用它。


Terraform 的类型约束机制认为任何至少具有类型约束中的属性的对象都是有效的,因此不必每次都定义详尽的对象类型。

例如,如果您定义一个具有以下类型的变量:

object({
  name = string
})
Run Code Online (Sandbox Code Playgroud)

以下对象值对于该类型约束是可接受的,因为它具有name正确类型的属性,而不管它定义的任何其他属性如何:

{
  name  = "foo"
  other = "bar"
}
Run Code Online (Sandbox Code Playgroud)

因此,最好将每个模块中的变量声明限制为特定模块实际需要的属性子集,从而减少模块之间的耦合:它们只需要在属性名称重叠的范围内兼容,并且不需要直接相互绑定。

  • 这个“功能”迫使任何想要一些漂亮的、严格定义的数据结构的人不断地重复自己。DRY的价值似乎很明显,那么WET的优势是什么? (4认同)