Terraform定义含any属性的list(object)变量报公共基类错误如何解决
报错根因
Terraform的list(object({...}))类型约束要求列表内所有对象必须拥有完全一致的属性集合,且每个属性的类型统一。你的配置存在两处不符合要求的点:
- 部分对象额外携带
property属性,其余对象无该属性,未提前声明为可选属性 - 虽然你指定了
operand = any,但Terraform推导列表公共类型时,无法为数字、字符串、对象类型的operand找到统一基类,最终触发类型校验失败
最优解决方案
根据你使用的Terraform版本选择对应方案即可:
方案1:兼容Terraform 0.14及以上版本(兼顾灵活性和校验能力)
直接将变量类型声明为list(any),通过自定义校验规则保证必填字段符合要求:
variable "settings" { type = list(any) validation { condition = alltrue([ for item in var.settings : alltrue([ can(item.type), can(item.operator), can(item.operand), tostring(item.type) != "", tostring(item.operator) != "" ]) ]) error_message = "所有settings元素必须包含type、operator、operand三个必填属性,且type和operator为非空字符串。" } }
如果需要对operand做更精细的类型校验,可以在validation块中补充对应判断逻辑,比如根据type字段校验operand的类型是否匹配预期。
方案2:Terraform 1.3及以上版本(更规范的类型声明)
Terraform 1.3开始支持原生的可选属性标记,你可以提前声明所有可能出现的非通用属性为可选,Terraform会自动将缺失的可选属性补全为null,统一所有对象的结构:
variable "settings" { type = list(object({ type = string operator = string operand = any # 声明所有可能出现的可选属性 property = optional(string) # 其他可能出现的可选属性可在此处补充声明 })) }
该方案无需额外写校验规则即可通过Terraform的类型校验,同时保留了必填属性的类型校验能力,是当前版本下的最优解。
内容的提问来源于stack exchange,提问作者user971741
相关产品推荐
相关产品推荐

