You need to enable JavaScript to run this app. Terraform中按resource_app_id生成嵌套requiredResourceAccess配置
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 07:24:03