Terraform嵌套映射列表解析异常:仅生成group1资源怎么修复?
问题原因
你的var.team_namespace是嵌套结构:顶层以命名空间为键,值是该命名空间下的组列表。但模块调用时使用for_each = var.team_namespace,只会遍历两个命名空间条目,每个each.value对应一个组列表。此时each.value.group_name会默认取列表的第一个元素,导致每个命名空间只处理第一个组,最终只生成部分组的资源。
解决方案
需要先把嵌套结构扁平化,将每个「命名空间-组」的组合作为独立条目,再用这个扁平化后的集合作为for_each的遍历对象。
- 定义局部变量处理扁平化:
locals { flattened_team_policies = merge([ # 外层遍历每个命名空间 for namespace, groups in var.team_namespace : { # 内层遍历该命名空间下的每个组 for group in groups : # 生成唯一键:命名空间-组名,避免重复 "${namespace}-${group.group_name}" => { team_namespace = namespace group_name = group.group_name team_policy = group.team_policy } } ]...) }
- 修改模块调用的
for_each参数:
module "vault_policies" { for_each = local.flattened_team_policies source = "./../../modules/vault-policies" team_name = each.value.group_name team_namespace = each.value.team_namespace team_policy = file(format("./policies/%s", each.value.team_policy)) depends_on = [module.vault_namespace] }
这样for_each会遍历所有4个组条目,每个组都会生成对应的模块资源,实现每个命名空间下多个AD组分配对应策略的需求。
内容的提问来源于stack exchange,提问作者Parwinderjit Singh
相关产品推荐
相关产品推荐

