如何在Terraform中转换嵌套Map数据结构?
如何将Terraform嵌套Map转换为扁平的站点-用户映射结构
你可以通过Terraform的嵌套for表达式结合flatten函数实现这个转换,以下是完整的可运行代码:
locals { # 原始嵌套Map结构 clients = { "client1" = { sites = { site1 = { users = [ "user1", "user2", ] } } }, "client2" = { sites = { site2 = { users = [ "user3", "user4", ] }, site3 = { users = [ "user5", "user6", ] } } }, } # 转换后的目标结构 sites_per_client = { for site_entry in flatten([ # 第一层循环:遍历所有客户端 for client_key, client_val in local.clients : [ # 第二层循环:遍历当前客户端下的所有站点 for site_key, site_val in client_val.sites : { key = "${client_key}-${site_key}" users = site_val.users } ] ]) : site_entry.key => site_entry.users } }
代码逻辑拆解
- 内层循环:遍历单个客户端下的所有站点,生成包含
client-site组合键和对应用户列表的对象 - 中层循环:遍历所有客户端,将每个客户端的站点对象数组收集起来,形成一个嵌套数组
flatten函数:把嵌套数组转换成一维数组,方便后续处理- 外层循环:将一维数组中的每个对象转换成Map的键值对,最终得到你需要的扁平结构
验证结果
可以添加一个输出块来确认转换结果:
output "sites_per_client_result" { value = local.sites_per_client }
执行terraform plan或terraform apply后,输出结果会和你预期的结构完全一致。
内容的提问来源于stack exchange,提问作者Jose Peinado
相关产品推荐
相关产品推荐

