Terraform条件表达式中空映射的隐式转换问题咨询
Terraform lookup函数在条件表达式生成的map上报错的原因
核心问题:类型推断的差异
- 示例1:直接定义的嵌套map让Terraform推断
outer_map类型为map(map(string))。因为inner_map实际存在,lookup的默认值{}根本不会被用到,所以Terraform没做严格的类型校验,代码正常运行。 - 示例2:直接写空map
{},Terraform默认把它推断为map(any)类型,lookup的默认值{}也会被识别为map(any),和元素类型匹配,自然没问题。 - 示例3:条件表达式的两个分支,一个是明确的
map(map(string)),另一个是空map。Terraform会强制统一条件表达式的结果类型,把空map转换成map(map(string))(也就是元素必须是map(string)类型的空map)。这时候lookup的默认值{}会被Terraform当成map(any)或者空对象,和要求的map(string)类型不匹配,所以报错。
结论:这是预期行为,不是bug
Terraform的类型系统要求条件表达式的两个分支必须是同一类型,空map会被自动转换为和另一个分支一致的类型。而lookup函数对默认值的类型要求严格,必须和map的元素类型完全匹配,直接传{}无法被推断为正确的map(string)类型,才会触发错误。
修复方案
- 显式把默认值指定为
map(string)类型,用tomap({}):length = lookup(local.outer_map, "inner_map", tomap({})) != {} ? 4 : 2 - 或者换用
try函数,它的类型兼容性更宽松:length = try(local.outer_map.inner_map, {}) != {} ? 4 : 2
内容的提问来源于stack exchange,提问作者cyuanli
相关产品推荐
相关产品推荐

