You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中如何转置permissionScopes映射结构?

Terraform 实现权限范围与授权客户端的反向映射

原始配置结构

permissionScopes = {
  "All" = {
    description = "Access Al"
    type        = "Admin"
    value       = "All"
    pre_authorized_clients = [
      "demo.dev",
      "demo.sit"
    ]
  }
  "Test" = {
    description = "Access Al"
    type        = "Admin"
    value       = "All"
    pre_authorized_clients = [
      "demo.dev",
      "demo.sit"
    ]
  }
}

目标转换结构

{
  "demo.dev" = [
    "All",
    "Test"
  ],
  "demo.sit" = [
    "All",
    "Test"
  ]
}

当前尝试的代码及结果

尝试的代码:

pre_authorized_clients = {
  for scope, values in var.permissionScopes : scope => {
    for app_name in values.pre_authorized_clients : app_name => [
      scope
    ]
  }
}

得到的结果:

pre_authorized_clients = {
  "All" = {
    "demo.dev" = [
      "All",
    ]
    "demo.sit" = [
      "All",
    ]
  }
  "Test" = {
    "demo.dev" = [
      "Test",
    ]
    "demo.sit" = [
      "Test",
    ]
  }
}

解决方案

要实现目标的反向映射,需要先将客户端与权限范围的关联关系扁平化,再按客户端分组聚合,以下是两种可行实现方式:

方式一:合并嵌套映射

pre_authorized_clients = merge([
  for scope, values in var.permissionScopes : {
    for app in values.pre_authorized_clients : app => [scope]
  }
]..., {})

方式二:先扁平化再分组

# 第一步:生成所有客户端-权限范围的配对列表
flat_pairs = flatten([
  for scope, values in var.permissionScopes : [
    for app in values.pre_authorized_clients : {
      app = app
      scope = scope
    }
  ]
])

# 第二步:按客户端分组聚合权限范围
pre_authorized_clients = {
  for pair in flat_pairs : pair.app => concat(
    lookup(pre_authorized_clients, pair.app, []),
    [pair.scope]
  )
}

代码说明

  • 方式一:通过嵌套for表达式生成每个权限范围对应的「客户端-单权限范围」映射,再用merge(..., {})合并所有小映射,Terraform会自动将相同客户端对应的列表值合并。
  • 方式二:先将所有客户端与权限范围的关联展开为扁平列表,再遍历列表按客户端键聚合,用lookup获取已有权限范围列表(无对应值则用空列表),通过concat添加新的权限范围。

两种方式最终都能生成目标结构:以客户端为键,对应的所有权限范围组成的列表为值。

内容的提问来源于stack exchange,提问作者papanito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:08:36