Terraform中for_each无法访问合并后本地变量的问题
问题分析与解决方案
错误原因
你用merge(var.apps, var.acl)的方式完全错误——Terraform的merge函数是合并两个Map的键集合,如果两个Map存在相同键,后面的Map(var.acl)会直接覆盖前面Map(var.apps)对应键的值。这导致遍历merged_vars时,要么拿到没有ACL属性的应用对象,要么拿到被覆盖后丢失应用属性(比如app_name)的ACL对象,自然会触发属性不存在的错误。
正确的合并方式
假设var.apps和var.acl的键是一一对应的(比如用应用ID作为键,每个应用都有匹配的ACL规则),你需要遍历应用Map的键,将每个应用的对象与对应ACL对象合并成新的对象:
locals { merged_vars = { for app_key, app_info in var.apps : app_key => merge(app_info, var.acl[app_key]) } }
如果存在无对应ACL规则的应用,可通过以下两种方式处理:
方式1:保留所有应用,无ACL的用空对象填充
locals { merged_vars = { for app_key, app_info in var.apps : app_key => merge(app_info, lookup(var.acl, app_key, {})) } }
方式2:仅保留有对应ACL规则的应用
locals { merged_vars = { for app_key, app_info in var.apps : app_key => merge(app_info, var.acl[app_key]) if contains(keys(var.acl), app_key) } }
修改后的资源配置
此时local.merged_vars的每个元素都是应用信息+对应ACL规则的合并对象,可正常访问所有属性:
resource "kubernetes_network_policy" "acl" { for_each = local.merged_vars metadata { name = "${each.value.labels.name}-pod" namespace = each.value.app_name } spec { # 根据你的ACL规则结构填写,示例引用合并后的ACL属性 pod_selector { match_labels = each.value.pod_selector_labels } policy_types = ["Ingress", "Egress"] # 其他Ingress/Egress规则配置... } }
内容的提问来源于stack exchange,提问作者zolo
相关产品推荐
相关产品推荐

