AWS EKS节点组绑定启动模板时AMI类型报错排查
问题根因
你触发循环报错的核心原因是没搞清楚EKS托管节点组和启动模板搭配时的参数归属规则,两个关联资源的参数配置错位:
- 第一次报错是因为你在启动模板中显式指定了
image_id,但节点组资源里的ami_type填了AL2_x86_64。AWS EKS的规则是:只要启动模板自定义了镜像ID,节点组的ami_type就必须设为CUSTOM,否则会和AWS托管的AMI类型冲突。 - 第二次报错是因为你把
CUSTOM错填到了启动模板的image_id字段里。image_id字段只接受ami-开头的合法镜像ID字符串,CUSTOM是节点组ami_type字段的合法枚举值,根本不是镜像ID,当然会报格式错误。
额外配置问题
你的现有配置还有一个会导致后续部署失败的隐藏问题:
user_data = base64encode("node_userdata.tpl")写法错误,这行代码只会把字符串node_userdata.tpl做base64编码,不会读取实际的模板文件内容,后续节点会因为缺少集群引导配置无法加入EKS集群。
修正方案
方案1:保留自定义镜像ID配置
如果你确实要使用指定的AMI(比如你提到的ami-098e42ae54c764c35),按如下方式修改配置:
- 启动模板中保留合法的
ami-开头镜像ID,不要填CUSTOM,同时修正user_data的渲染逻辑:
resource "aws_launch_template" "node" { image_id = var.image_id # 保留你指定的AMI ID instance_type = var.instance_type key_name = var.key_name instance_initiated_shutdown_behavior = "terminate" name = var.name # 修正user_data,读取本地模板文件并传入集群引导所需参数 user_data = base64encode(templatefile("${path.module}/node_userdata.tpl", { cluster_name = aws_eks_cluster.eks.name cluster_endpoint = aws_eks_cluster.eks.endpoint cluster_ca_cert = aws_eks_cluster.eks.certificate_authority[0].data })) block_device_mappings { device_name = "/dev/sda1" ebs { volume_size = 20 } } iam_instance_profile { name = aws_iam_instance_profile.node.name } monitoring { enabled = true } }
- 把EKS节点组的
ami_type改为CUSTOM:
resource "aws_eks_node_group" "nodes_eks" { cluster_name = aws_eks_cluster.eks.name node_group_name = "eks-node-group" node_role_arn = aws_iam_role.eks_nodes.arn subnet_ids = module.vpc.private_subnets scaling_config { desired_size = 3 max_size = 6 min_size = 3 } ami_type = "CUSTOM" # 因为启动模板已指定镜像,这里必须设为CUSTOM capacity_type = "ON_DEMAND" force_update_version = false instance_types = [var.instance_type] labels = { role = "nodes-pool-1" } launch_template { id = aws_launch_template.node.id version = "$Default" } depends_on = [ aws_iam_role_policy_attachment.amazon_eks_worker_node_policy, aws_iam_role_policy_attachment.amazon_eks_cni_policy, aws_iam_role_policy_attachment.amazon_ec2_container_registry_read_only, ] }
方案2:使用AWS托管EKS优化AMI(更省心)
如果你不需要自定义AMI,完全可以删掉启动模板里的image_id字段,节点组的ami_type保留AL2_x86_64即可,AWS会自动根据你的EKS集群版本匹配对应最新的EKS优化版Amazon Linux 2镜像,不需要手动找AMI ID、跟进镜像版本更新。
内容的提问来源于stack exchange,提问作者user19457124
相关产品推荐
相关产品推荐

