Terraform中如何定义嵌套map本地变量、正确引用并设置默认值
问题根因
你遇到的cg_ip_address返回null的问题,核心是lookup函数的参数传参错误:lookup的标准语法为lookup(待查询的Map对象, 目标键名, 键不存在时的返回默认值),你之前的写法中,第二个参数传入的是嵌套Map里的具体属性值(比如local.region_map["mumbai"]["cg_ip_address"]实际是字符串"ip.add.re.ss"),而非顶层Map的键名,相当于在region_map顶层查找名为"ip.add.re.ss"的键,自然找不到匹配项,返回结果不符合预期。
实现方案
要同时解决现有参数取值错误、新增区域无需写入Map即可自动应用默认值的需求,按以下逻辑调整即可:
- 提前在本地变量中定义所有区域通用的默认配置,作为未配置区域的兜底值
- 引用配置时,先查找对应区域的自定义配置,不存在则返回空对象,再和默认配置合并,自动补全所有参数
调整后的本地变量配置
locals { # 全局通用默认配置,所有未在region_map中单独配置的区域都使用这组值 default_region_config = { is_second_execution = false cg_ip_address = "" } region_map = { mumbai = { is_second_execution = true cg_ip_address = "ip.add.re.ss" } # 后续需要自定义配置的区域直接追加到这里即可,不需要自定义的区域无需添加 } }
模块引用写法
- 已在
region_map中配置的mumbai模块:
module "mumbai" { source = "./site-to-site-vpn-setup" providers = { aws = aws.mumbai } # 合并默认配置和当前区域的自定义配置,自定义配置优先级高于默认值 region_config = merge( local.default_region_config, lookup(local.region_map, "mumbai", {}) ) is_second_execution = region_config.is_second_execution cg_ip_address = region_config.cg_ip_address }
- 不需要添加到
region_map的saopaulo模块,直接在lookup中传入区域名即可自动应用默认配置,无需修改region_map内容:
module "saopaulo" { source = "./site-to-site-vpn-setup" providers = { aws = aws.saopaulo } region_config = merge( local.default_region_config, lookup(local.region_map, "saopaulo", {}) ) is_second_execution = region_config.is_second_execution # 自动取默认值false cg_ip_address = region_config.cg_ip_address # 自动取默认值"" }
这种写法的可维护性更好,后续如果要给区域配置新增字段,只需要在
default_region_config里加默认值,再给需要自定义的区域单独配置即可,不需要逐个修改模块的传参逻辑。
内容的提问来源于stack exchange,提问作者Gautam
相关产品推荐
相关产品推荐

