Terraform配置未改动却提示EKS节点组需变更的问题排查
问题:Terraform反复触发EKS节点组与启动模板的无意义更新
尽管启动模板和EKS节点组的配置未做任何改动,但每次执行terraform plan或apply时,Terraform都会认为启动模板版本已变更,触发节点组的更新操作。
相关配置
EKS节点组配置
resource "aws_eks_node_group" "test" { depends_on = [aws_launch_template.test] ...other settings launch_template { name = aws_launch_template.test.name version = aws_launch_template.test.latest_version } }
启动模板配置
resource "aws_launch_template" "test" { name = "test" instance_type = var.instance image_id = data.aws_ssm_parameter.eks-ami.value user_data = base64encode(local.eks-node-userdata) tag_specifications { resource_type = "instance" tags = { Name = "test" } } lifecycle { create_before_destroy = true } }
执行terraform apply的输出
# aws_launch_template.test will be updated in-place ~ resource "aws_launch_template" "test" { id = "xxx" ~ image_id = (sensitive) ~ latest_version = 3 -> (known after apply) name = "test" tags = {} # (16 unchanged attributes hidden) # (1 unchanged block hidden) } # aws_eks_node_group.test will be updated in-place ~ resource "aws_eks_node_group" "general" { ...other settings ~ launch_template { id = "xxx" name = "test" ~ version = "3" -> (known after apply) } }
原因分析
- 动态版本属性的误判:
aws_launch_template.test.latest_version是动态计算属性,Terraform在plan阶段无法提前确定其最终值,会标记为(known after apply),进而触发变更检测。 - SSM参数敏感属性干扰:启动模板的
image_id使用了SSM参数,该参数被标记为敏感属性后,Terraform无法准确对比实际值,误判image_id有变化,导致启动模板版本递增。 - 生命周期配置的影响:
create_before_destroy = true会让Terraform优先创建新资源再销毁旧资源,结合动态版本属性,加剧了无意义的变更触发。
解决方案
1. 改用固定的启动模板版本
将节点组配置中启动模板的version从latest_version改为default_version,default_version是固定可预测的值,不会每次plan都触发变更:
resource "aws_eks_node_group" "test" { depends_on = [aws_launch_template.test] ...other settings launch_template { name = aws_launch_template.test.name version = aws_launch_template.test.default_version } }
如果需要手动控制版本,也可以直接指定具体的版本号(如"1")。
2. 锁定AMI值(可选)
如果不需要自动更新AMI,可以将SSM参数对应的AMI ID硬编码到配置中,或者使用data "aws_ami"筛选特定条件的AMI并锁定,避免动态参数带来的不确定性:
data "aws_ami" "eks-ami" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amazon-eks-node-1.29-v*"] } } # 启动模板中改用该data源的image_id resource "aws_launch_template" "test" { # ...其他配置 image_id = data.aws_ami.eks-ami.id }
3. 调整生命周期配置(可选)
如果不需要create_before_destroy的替换逻辑,可以移除该生命周期配置,减少不必要的资源创建操作:
resource "aws_launch_template" "test" { # ...其他配置 # 移除以下块 # lifecycle { # create_before_destroy = true # } }
内容的提问来源于stack exchange,提问作者Murakami
相关产品推荐
相关产品推荐

