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
相关产品推荐
相关产品推荐

