Terraform引用嵌套map不存在键时如何为字段设置默认值
报错根因
你当前的写法有两个问题:
- 直接访问
local.region_map中不存在的顶层keysaopaulo时,Terraform会在属性解析阶段直接抛出不存在的错误,根本不会执行到后续字段的默认值逻辑 - 你对
lookup函数的参数使用错误,lookup的语法为lookup(目标map, 查询的key, 默认值),你之前把嵌套取值的结果当成了key参数传入,逻辑本身不成立。
解决方案
兼容所有Terraform版本的写法
用两层嵌套lookup实现,第一层先判断顶层的region key是否存在,不存在则返回空map作为兜底,第二层再从兜底结果中取对应字段,匹配不到就返回你预设的默认值:
module "saopaulo" { source = "./site-to-site-vpn-setup" providers = { aws = aws.saopaulo } is_second_execution = lookup(lookup(local.region_map, "saopaulo", {}), "is_second_execution", false) cg_ip_address = lookup(lookup(local.region_map, "saopaulo", {}), "cg_ip_address", "") }
Terraform 0.14+ 更简洁的写法
0.14及以上版本支持安全取值符和空值合并操作符,写法更直观,不需要嵌套函数:
module "saopaulo" { source = "./site-to-site-vpn-setup" providers = { aws = aws.saopaulo } is_second_execution = local.region_map["saopaulo"]?.is_second_execution ?? false cg_ip_address = local.region_map["saopaulo"]?.cg_ip_address ?? "" }
语法说明:
?.为安全属性访问符:如果左侧的local.region_map["saopaulo"]不存在,会直接返回null,不会触发属性不存在的报错??为空值合并操作符:如果左侧返回值为null,就直接返回右侧设置的默认值
两种写法都不需要你在region_map中提前新增saopaulo条目,匹配不到配置时会自动使用你设置的false和空字符串作为默认值。
内容的提问来源于stack exchange,提问作者Gautam
相关产品推荐
相关产品推荐

