Terraform嵌套变量结构下for/for_each实现求助(规避count)
基于嵌套Terraform变量创建IAM绑定(无count)
你的变量结构是三层嵌套的map(map(list(string))),要不用count实现资源创建,核心是先扁平化嵌套结构,再用for_each遍历每个独立的绑定条目。
步骤1:扁平化变量结构
先通过局部值(locals)把三层嵌套的变量拆成单层的对象集合,每个对象对应一个"容器-角色-成员"的绑定关系:
locals { registry_iam_bindings = flatten([ # 遍历外层的容器名和对应的角色映射 for container_name, roles in var.registry : [ # 遍历每个容器下的角色和成员列表 for role, members in roles : [ # 遍历每个成员,生成独立的绑定对象 for member in members : { container = container_name role = role member = member } ] ] ]) }
步骤2:用for_each创建IAM绑定资源
以GCP的Artifact Registry IAM绑定为例,用for_each遍历扁平化后的集合,通过容器名-角色-成员的组合生成唯一键,确保每个绑定都是独立资源:
resource "google_artifact_registry_repository_iam_member" "registry_binding" { # 生成唯一的for_each键,替换Terraform不允许的特殊字符 for_each = { for binding in local.registry_iam_bindings : "${binding.container}-${replace(binding.role, "/", "-")}-${replace(binding.member, ":", "-")}" => binding } # 从each.value中提取对应字段 repository = each.value.container role = each.value.role member = each.value.member }
关键说明
- 扁平化的核心是
flatten函数配合三层嵌套for循环,把每个成员级别的绑定单独提取出来,让for_each可以直接遍历。 - 生成
for_each键时替换了/和:这些Terraform不允许出现在资源键里的字符,避免语法报错。 - 这种方式完全不需要
count,每个绑定都是独立管理的资源,增减变量中的成员时,Terraform会精准创建/销毁对应的资源,不会出现索引偏移问题。
内容的提问来源于stack exchange,提问作者carrotcakeslayer
相关产品推荐
相关产品推荐

