Terraform如何动态查询jsondecode加载JSON的指定路径取值
Terraform 动态路径查询嵌套JSON值方案
无需硬编码最大嵌套深度,也无需开发自定义Provider,使用Terraform内置的reduce函数即可实现任意层级的动态取值,适配Terraform 0.15及以上所有版本(含1.x全系列稳定版)。
实现代码
locals { # 修正原示例的写法问题:jsondecode接收JSON格式字符串,需要先用file()读取目标文件内容 tree = jsondecode(file("${path.module}/file.json")) # 动态查询路径,支持任意长度:对象属性传字符串key,数组下标传数字索引即可 query_path = ["some1", "path1", "key1"] # 核心取值逻辑 value = reduce( local.query_path, local.tree, (curr, seg) -> try(curr[seg], null) ) }
逻辑说明
reduce函数会遍历传入的路径数组,将完整解码后的JSON结构作为初始迭代值- 每轮迭代以当前所在节点为基础,取下一段路径对应的子节点;通过
try做容错处理,任意一段路径不存在时直接返回null,不会触发执行错误 - 该方案没有深度限制,无论JSON嵌套多少层都可以正常取值,同时兼容对象和数组结构:例如路径写为
["list_key", 2, "attr"]时,可以直接取到数组索引为2的元素的attr属性值。
低版本适配
如果使用0.15以前没有reduce函数的Terraform版本,除了你提到的硬编码层级方案外,没有原生的无深度限制实现方式,优先建议升级Terraform版本使用上述方案。硬编码方案需要提前预估业务场景的最大嵌套深度,冗余度高且容易出现超出预设深度的取值失败问题。
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

