You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:25:13