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

AWS EKS节点组绑定启动模板时AMI类型报错排查

问题根因

你触发循环报错的核心原因是没搞清楚EKS托管节点组和启动模板搭配时的参数归属规则,两个关联资源的参数配置错位:

  1. 第一次报错是因为你在启动模板中显式指定了image_id,但节点组资源里的ami_type填了AL2_x86_64。AWS EKS的规则是:只要启动模板自定义了镜像ID,节点组的ami_type就必须设为CUSTOM,否则会和AWS托管的AMI类型冲突。
  2. 第二次报错是因为你把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),按如下方式修改配置:

  1. 启动模板中保留合法的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
  }
}
  1. 把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:30:54