如何在Terraform中引用JSON文件Regions下的IP数据?
问题
我有一个存储IP地址的JSON文件,结构如下:
{ "US": [ "30.30.30.85", "30.30.30.86" ], "All": [ "30.30.30.85", "30.30.30.86", "40.40.40.40", "40.40.40.41", "50.50.50.33", "50.50.50.34", "60.60.60.61", "60.60.60.62" ], "Regions": [ { "US_Central": [ "40.40.40.40", "40.40.40.41" ] }, { "US_Southeast": [ "50.50.50.33", "50.50.50.34" ] }, { "UK": [ "60.60.60.61", "60.60.60.62" ] } ] }
我用Terraform的jsondecode函数导入该文件:
locals { ip_list = jsondecode(file("${path.module}/../ip_list.json")) }
调用US和All对应的值正常,但引用Regions下的子区域值时遇到错误,尝试过以下几种方式均失败:
ips = local.ip_list.Regions[US_Central].value ips = local.ip_list.Regions.US_Central ips = local.ip_list.Regions[*].US_Central
请问正确的引用方式是什么?
解决方法
问题根源
你的JSON中Regions是对象数组,每个数组元素是仅包含单个键值对的独立对象(比如{"US_Central": [...]}),而非直接的键值对结构,因此之前的引用逻辑都不匹配该结构。
正确引用方式
方式1:按数组索引定位
如果确定子区域在数组中的固定位置,可以直接通过索引访问:
# 获取US_Central的IP列表 ips = local.ip_list.Regions[0].US_Central # 获取US_Southeast的IP列表 ips = local.ip_list.Regions[1].US_Southeast
方式2:动态匹配(不受索引顺序影响)
如果担心数组元素顺序变化,可通过遍历筛选目标键:
ips = [for region in local.ip_list.Regions : region.US_Central if contains(keys(region), "US_Central")][0]
优化建议(更易用的结构)
如果可以修改JSON文件,建议将Regions从数组改为普通对象结构,这样引用会更简洁直接:
{ "US": [...], "All": [...], "Regions": { "US_Central": [ "40.40.40.40", "40.40.40.41" ], "US_Southeast": [ "50.50.50.33", "50.50.50.34" ], "UK": [ "60.60.60.61", "60.60.60.62" ] } }
修改后直接通过键名引用即可:
ips = local.ip_list.Regions.US_Central
内容的提问来源于stack exchange,提问作者Tanous11
相关产品推荐
相关产品推荐

