Terraform中按resource_app_id生成嵌套requiredResourceAccess配置
Terraform 扁平列表按字段分组转换为嵌套驼峰结构实现方案
前置处理:解决输入字段大小写不统一问题
原始input_data存在字段名大小写混杂的问题,直接按固定字段名取值会触发空引用错误,需要先对所有记录做标准化映射,统一匹配不同写法的字段:
locals { normalized_records = [ for record in var.input_data : { # 逐层匹配不同大小写的字段名,兼容所有输入变种 resource_app_id = lower( try(record.resource_app_id, record.RESOURCE_APP_ID, record.ResourceAppId, record["resource-app-id"], "") ) id = lower(try(record.id, record.ID, record.Id, "")) type = lower(try(record.type, record.TYPE, record.Type, "")) } # 跳过无有效resource_app_id的无效记录 if try(record.resource_app_id, record.RESOURCE_APP_ID, record.ResourceAppId, null) != null ] }
说明:使用
try()函数代替多层空值判断,可降低代码冗余,匹配的字段变种可根据实际输入的命名习惯扩展。
核心分组逻辑
不需要编写复杂的过滤判断循环,借助Terraform for表达式的内置聚合语法,可直接按resource_app_id的取值完成分组:
locals { # 按resource_app_id聚合,同键值的记录自动归集为列表 grouped_resources = { for record in local.normalized_records : record.resource_app_id => { id = record.id type = record.type }... } # 转换为目标要求的驼峰命名嵌套结构 requiredResourceAccess = [ for app_id, access_list in local.grouped_resources : { resourceAppId = app_id resourceAccess = access_list } ] }
关键实现要点
- 核心分组能力:for表达式末尾追加
...修饰符,是Terraform内置的同键聚合语法,引擎会自动将相同键值对应的所有元素归集为数组,避免自行编写全表扫描过滤逻辑带来的性能损耗和逻辑错误 - 可选去重:如果聚合后的
resourceAccess子数组存在重复的id+type组合,可在构造子数组时通过distinct()函数做清洗,写法为resourceAccess = distinct(access_list) - 空值兼容:所有字段取值环节建议配合
try()函数,避免因个别记录缺字段导致整个terraform plan阶段报错
输入输出效果示例
示例输入input_data:
var.input_data = [ { resource_app_id = "App-1", id = "Scope.Read", type = "Role" }, { RESOURCE_APP_ID = "app-1", id = "Scope.Write", type = "Permission" }, { Resource_App_Id = "App-2", id = "User.Read", type = "Role" } ]
最终输出requiredResourceAccess结构:
[ { resourceAppId = "app-1" resourceAccess = [ { id = "scope.read", type = "role" }, { id = "scope.write", type = "permission" } ] }, { resourceAppId = "app-2" resourceAccess = [ { id = "user.read", type = "role" } ] } ]
内容的提问来源于stack exchange,提问作者Mukesh Santhanam
相关产品推荐
相关产品推荐

