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
相关产品推荐
相关产品推荐

