声明Terraform变量报错:所有Map元素类型需一致,求正确声明方式
解决Terraform Map元素类型不一致的报错问题
报错原因是你定义的var.subnets为map(any),但实际赋值中,部分子网的delegation是空对象{},另一部分是包含具体结构的对象,Terraform会将这两种delegation视为不同类型,导致Map元素类型不统一。要解决这个问题,需要明确约束变量的类型结构,让所有子网元素都符合统一的类型定义,以下是两种可行方案:
方案一:将delegation定义为可选的结构化对象
通过optional()函数标记delegation为可选字段,并指定其结构,同时设置默认值为空对象,这样既可以省略该字段,也可以传入空对象或结构化内容:
variable "subnets" { type = map(object({ name = string address_prefixes = list(string) # 定义delegation的结构,设为可选,默认值为空对象 delegation = optional(object({ name = string service_delegation = object({ name = string }) }), {}) })) }
你的赋值可以保持不变,subnet1/subnet2的空delegation会匹配默认值,subnet3的结构化delegation也符合类型约束。
方案二:允许delegation为null或结构化对象
如果更倾向于用null表示无委托配置,可以将delegation的类型设为结构化对象与null的联合类型:
variable "subnets" { type = map(object({ name = string address_prefixes = list(string) delegation = object({ name = string service_delegation = object({ name = string }) }) | null })) }
对应的赋值需要将空delegation改为null:
subnets = { subnet1 = { name = "subnet1" address_prefixes = ["10.0.0.0/24"] delegation = null }, subnet2 = { name = "subnet2" address_prefixes = ["10.0.1.0/24"] delegation = null }, subnet3 = { name = "subnet3" address_prefixes = ["10.0.2.0/24"] delegation = { name = "delegation1" service_delegation = { name = "Microsoft.Web/serverFarms" } } } }
两种方案都能让所有Map元素的类型统一,解决报错问题。推荐方案一,因为它保留了你原本的赋值写法,无需修改现有配置的赋值部分。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

