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

Terraform EKS模块嵌套Map中Addon配置值JSON编码问题

Terraform EKS Addon配置JSON编码问题解决

问题场景

变量文件中定义了包含多个集群及其Addon配置的嵌套Map:

clusters = {
  cluster1 = {
      cluster_addons = {
        first_addon = {
          addon_version = "1.2.3"
          configuration_value = {...} # 需要运行时JSON编码
        },
        second_addon = {
          addon_version = "1.5.2"
          configuration_value = {...} # 同样需要JSON编码
        }
      }
  }
  cluster2 = {
    ...
  }
}

期望输出是保持原有集群和Addon层级,同时将每个Addon的configuration_value转为JSON编码后的结构:

addons = {
  cluster1 = {
        first_addon = {
          addon_version = "1.2.3"
          configuration_value = "..." # 已完成JSON编码的字符串
        },
        second_addon = {
          addon_version = "1.5.2"
          configuration_value = "..." # 已完成JSON编码的字符串
        }
  }
  cluster2 = {
      ... # 其他集群配置
  }
}

原有代码问题

之前编写的代码会导致同一集群下的Addon被覆盖,仅保留最后一个:

eks_addons = merge(flatten([
  for cluster_name, cluster in var.eks_clusters : [
    for addon_name, addon in cluster.cluster_addons : {
      "${cluster_name}" = { 
        "${addon_name}" = {
          addon_version        = lookup(addon, "addon_version", "")
          configuration_values = jsonencode(lookup(addon, "configuration_values", {}))
        }
      }
    }
  ]
])...)

问题出在循环逻辑:每个Addon都生成一个单独的{cluster_name = {addon_name = ...}}结构,merge操作时,同一集群名的条目会被后续循环生成的条目覆盖,最终每个集群只保留最后一个Addon。

解决方案

使用双层for表达式直接构建目标结构,避免拆分后merge的覆盖问题:

eks_addons = {
  for cluster_name, cluster in var.eks_clusters : cluster_name => {
    for addon_name, addon in cluster.cluster_addons : addon_name => {
      addon_version        = lookup(addon, "addon_version", "")
      configuration_values = jsonencode(lookup(addon, "configuration_values", {}))
    }
  }
}

逻辑说明

  • 外层for遍历集群,以集群名为键,值为该集群下所有Addon处理后的Map
  • 内层for遍历当前集群的所有Addon,对每个Addon执行jsonencode处理配置值,生成单个Addon的结构
  • 最终直接生成符合预期的嵌套Map,无需额外merge或flatten操作,自然避免覆盖问题

内容的提问来源于stack exchange,提问作者RamenOps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:35:09