如何将地图的块地图转换为 Terraform 中的变量

How do I turn a block Map of Maps into a variable in Terraform

我正在使用 terraform-aws-eks 模块来部署 EKS 集群。我希望得到一些帮助,将 node_groups map of maps 转换为变量,以便我可以针对不同的环境修改变量文件。这是地图中的地图:

node_groups = {
    example = {
      desired_capacity = 1
      max_capacity     = 10
      min_capacity     = 1

      instance_types = ["m5.large"]
      capacity_type  = "ON_DEMAND"
      k8s_labels = {
        Environment = "test"
        GithubRepo  = "terraform-aws-eks"
        GithubOrg   = "terraform-aws-modules"
      }
      additional_tags = {
        ExtraTag = "example"
      }
    }
  }

我希望能够在 main.tf 中引用变量而不是映射,例如

node_groups = var.node_groups

我正在努力处理 variables.tf 中列表(对象)的各个级别。在此先感谢您的帮助。

我想您是在问什么 type constraint 适合接受这样的数据结构的变量。如果是这样,请尝试一下:

  type = map(object({
    desired_capacity = number
    max_capacity     = number
    min_capacity     = number

    instance_types  = set(string)
    capacity_type   = string
    k8s_labels      = map(string)
    additional_tags = map(string)
  }))

我在这里猜测了你的意图:

  • 我将 instance_types 设置为一组字符串而不是字符串列表,因为实例类型通常没有有意义的排序,而集合是无序集合的合适数据结构。但是,如果确实打算使用实例类型的设置顺序,那么您可以将其更改为 list(string)
  • 对于 k8s_labelsadditional_tags 来说,这些似乎只是调用者选择的任意 key/value 对,而不是模块指定的特定数据结构,所以我限制了它们作为 map(string) 而不是作为涵盖您在示例中显示的确切属性名称的特定对象类型。如果您打算在 k8s_labels 中精确地要求 EnvironmentGithubRepoGithubOrg 属性,而不是由调用者决定,那么您可以将其更改为对象类型而不是地图类型。