Terraform中如何处理空VPC列表的条件赋值与子模块传递问题
解决方案
核心思路是让local.pub和local.pri的vpc字段类型完全匹配,同时满足子模块对vpc元素结构的要求,分两种场景处理:
场景1:子模块接受空vpc列表
通过显式类型转换,将local.pub的空列表转换为与local.pri一致的类型,既通过Terraform的类型检查,又传递符合子模块要求的空列表:
locals { pub = { (var.zname) = { comment = var.zname # 显式声明空列表类型为包含id字段的对象列表,与pri的vpc类型对齐 vpc = list(object({ id = string }))([]) } } pri = { (var.zname) = { comment = var.zname vpc = [{ id = var.ids }] } } fvar = length(var.ids) != 0 ? local.pri : local.pub }
场景2:子模块要求vpc列表必须包含元素(且每个元素需有id字段)
如果子模块不允许空列表,可让local.pub的vpc列表包含一个符合结构的空值对象,确保类型匹配,子模块通常会忽略无效的id值:
用null作为id值(如果子模块接受null)
locals { pub = { (var.zname) = { comment = var.zname vpc = [{ id = null }] } } pri = { (var.zname) = { comment = var.zname vpc = [{ id = var.ids }] } } fvar = length(var.ids) != 0 ? local.pri : local.pub }
用空字符串作为id值(如果子模块要求id为非null字符串)
locals { pub = { (var.zname) = { comment = var.zname vpc = [{ id = "" }] } } pri = { (var.zname) = { comment = var.zname vpc = [{ id = var.ids }] } } fvar = length(var.ids) != 0 ? local.pri : local.pub }
内容的提问来源于stack exchange,提问作者nmakb
相关产品推荐
相关产品推荐

