如何基于变量列表在Terraform中创建EKS托管节点组
解决Terraform嵌套列表生成EKS托管节点组的问题
正确的嵌套For表达式写法
要基于var.clusters中的嵌套列表生成EKS托管节点组映射,需要使用双层嵌套for表达式,直接迭代每个集群下的节点组对象:
module "eks" { source = "terraform-aws-modules/eks/aws" # 配置集群名称、VPC等其他必填参数... eks_managed_node_groups = { for cluster in var.clusters : for worker in cluster.eks_workers : worker.name => { instance_type = worker.instance_type # 根据需求添加其他节点组配置,例如: # desired_size = 2 # min_size = 1 # max_size = 3 # subnet_ids = var.private_subnets } } }
之前写法的问题分析
第一种写法错误原因:
var.clusters[*].eks_workers会返回一个列表的列表(示例中为[[{name="nodes1",...}, {name="nodes2",...}]]),直接迭代时worker代表的是整个子列表,而非单个节点组对象,因此无法直接访问worker.name。第二种写法不符合需求:
使用worker_group_key(列表索引)生成的键是something-0、something-1这类格式,和你期望的用节点组名称(nodes1、nodes2)作为键的需求不匹配。
扩展:避免多集群下的键冲突
如果你的配置中有多个集群,不同集群的节点组名称可能重复,建议结合集群名称和节点组名称生成唯一键:
eks_managed_node_groups = { for cluster in var.clusters : for worker in cluster.eks_workers : "${cluster.name}-${worker.name}" => { instance_type = worker.instance_type # 其他配置... } }
最终生成的配置格式
对于你提供的变量,上述代码会生成符合预期的节点组配置:
eks_managed_node_groups = { "nodes1" = { instance_type = ["t3.micro"] # 其他配置项... } "nodes2" = { instance_type = ["t3.micro"] # 其他配置项... } }
内容的提问来源于stack exchange,提问作者David Villasmil
相关产品推荐
相关产品推荐

