Terraform 变量定义

Terraform variable definition

我想创建一个部署输入并基于该变量驱动我的部署。 这是一个示例部署输入,

deployments = {
    dev-1 = {
        dev-api-us = {
            hosts = ["dev-api-us.lm.com", "dev-api-us.lm1.com"]
        }
        region = "us-east1"
    }
    dev-2 = {
        dev-api-uk = {
            hosts = ["dev-api-uk.lm.com", "dev-api-uk.lm1.com"]
        }
        region = "europe-west2"
    }
}

如果输入有效,那么相应的变量定义是什么样的?

我试过了,但它说语法不正确

variable "deployments" {
  description = "A map of deployment"
  type = map(map(object({
        hosts = list(string)
      })
    region = string
    ))
}

感谢任何帮助。

这个数据结构有点混乱,因为第二层似乎是预定义属性 (region) 和任意映射键(如 dev-api-usdev-api-uk)的混合体。

我认为这里进行的最好方法是更改​​此结构,以便地图的第二级与其嵌入的对象分开。您没有在问题中提及名词来引用 dev-api-usdev-api-uk 是示例,因此我将称它们为“主机前缀”,以便可以称呼它们:

{
  dev-1 = {
    host_prefixes = {
      dev-api-us = {
        hosts = ["dev-api-us.lm.com", "dev-api-us.lm1.com"]
      }
    }
    region = "us-east1"
  }
  dev-2 = {
    host_prefixes = {
      dev-api-uk = {
        hosts = ["dev-api-uk.lm.com", "dev-api-uk.lm1.com"]
      }
    }
    region = "europe-west2"
  }
}

此调整后的数据结构的合适类型约束可以是:

variable "deployments" {
  type = map(object({
    host_prefixes = map(object({
      hosts = set(string)
    }))
    region = string
  }))
}

这种改变后的结构适用于 Terraform 的类型系统,因为它将对象类型部分与地图类型部分分开。 Terraform 语言没有任何允许将映射和对象行为合并为单个值的类型约束。