Terraform创建父子标签资源时each对象不支持操作报错如何解决
你遇到的报错有两个核心原因:
- 你构造的
local.helper_list是双重嵌套列表:外层遍历每个父标签,每个迭代返回setproduct生成的当前父标签与子标签的组合列表,最终得到的结构类似[ [["parent1","child1"],["parent1","child2"]], [["parent2","child2"],...] ],不符合for_each的传入要求。 - Terraform的
each对象只有each.key和each.value两个属性,不支持each.0这种索引式访问。 - 额外注意:
for_each只能传入键唯一的map或者字符串集合,直接传入列表会用索引作为资源标识,后续变量变更很容易导致资源误删重建。
解决方案
第一步:调整局部变量,构造合法的扁平化map
locals { # 先把所有父子标签组合压平为单层对象列表 flattened_tag_pairs = flatten([ for parent_name, children in var.tags : [ for child_name in children : { parent_tag = parent_name child_tag = child_name } ] ]) # 转换为键唯一的map,供for_each使用,键格式为"父标签名/子标签名" child_resource_map = { for pair in local.flattened_tag_pairs : "${pair.parent_tag}/${pair.child_tag}" => pair } }
第二步:调整Child资源配置
resource "google_tags_tag_value" "child" { for_each = local.child_resource_map parent = "tagKeys/${google_tags_tag_key.parent[each.value.parent_tag].id}" short_name = each.value.child_tag description = "" }
方案说明
- 用
flatten消除嵌套结构,每个元素都明确包含父、子标签的名称 - 构造map时用
父标签/子标签作为唯一键,后续修改var.tags时Terraform可以精准匹配要增删的资源,不会出现索引偏移问题 - 通过
each.value直接取预设的parent_tag和child_tag属性,符合Terraform语法规范
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

