如何在Terraform中从JSON数据提取id属性值到列表变量
Terraform 提取JSON文件所有id属性值的实现方案
原有代码问题说明
- 根因1:
jsondecode解析当前JSON得到的是对象类型而非列表,根节点下字段类型不统一:包含对象数组类型的c字段、单对象类型的l/m/n/s/ss/in/b字段,以及无id属性的字符串类型od字段,直接用[*]展开不符合数据结构逻辑 - 根因2:原有逻辑仅遍历
local.sections[0],既没有覆盖所有顶层节点,也没有处理数组类型字段、过滤无id属性的无效字段,自然无法拿到全量id值
正确实现代码
locals { # 解析JSON源文件,无需提前做展开操作 raw_data = jsondecode(file("./data.json")) # 提取全量id值,自动兼容不同字段类型、过滤无id的无效字段 all_ids = flatten([ for _, val in local.raw_data : [ # 字段值为列表/数组时,遍历内部元素取id;字段为带id属性的对象时直接取id;其余字段返回空列表跳过 can(type(val), list) ? [for item in val : item.id] : (can(val.id) ? [val.id] : []) ] ]) } output "ids" { value = local.all_ids type = list(string) }
实现逻辑说明
- 遍历JSON根节点所有键值对时,不需要硬编码字段名,适配后续JSON字段增减的场景
- 用
can()函数做类型校验、属性存在性校验,避免因字段类型不匹配(比如字符串类型的od字段无id属性)触发运行报错 - 用
flatten()函数把嵌套的列表结构拍平为一维字符串列表,兼容c字段是数组的特殊结构 - 输出块显式指定
type = list(string)做类型约束,确保最终返回结果是符合要求的列表类型变量
运行后输出的ids结果为:["6", "7", "8", "5", "9", "1", "65", "2"],和JSON内所有id值完全匹配。
内容的提问来源于stack exchange,提问作者vrledu
相关产品推荐
相关产品推荐

