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

Terraform无变更执行Apply时强制替换EC2实例问题求助

解决Terraform Bastion实例无变更重复重建问题

问题场景

使用terraform-aws-modules/vpc/aws(版本4.0.1)构建VPC后创建Bastion实例,连续两次执行terraform apply无代码变更的情况下,因security_groups字段触发实例销毁重建,且新旧实例使用同一安全组。

解决方案

1. 修正安全组的VPC关联

确保SSH安全组明确关联到创建的VPC,避免依赖关系模糊导致Terraform无法提前确定安全组ID:

resource "aws_security_group" "allow_ssh" {
  name        = "allow_ssh"
  description = "Allow SSH inbound traffic"
  vpc_id      = module.vpc.vpc_id # 关键:绑定到自定义VPC

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # 建议根据实际需求限制来源IP段
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "allow_ssh"
  }
}

2. 替换security_groups为vpc_security_group_ids

在自定义VPC中,Terraform推荐使用vpc_security_group_ids而非security_groups,前者支持安全组的原地更新,不会触发实例重建:

#Bastion
resource "aws_instance" "bastion" {
  depends_on = [module.vpc, aws_security_group.allow_ssh]
  ami                    = var.ami_id
  instance_type          = "t2.micro"
  subnet_id              = module.vpc.public_subnets[0]
  associate_public_ip_address = true # 布尔值无需加引号
  vpc_security_group_ids = [aws_security_group.allow_ssh.id] # 替换原security_groups
  key_name               = aws_key_pair.k8_ssh.key_name
  tags = {
    Name = "Bastion"
  }
}

原因说明

  • security_groups是EC2-Classic或默认VPC的遗留参数,在自定义VPC环境中使用时,任何值的变动(哪怕是依赖导致的计划阶段ID不确定性)都会触发实例销毁重建;而vpc_security_group_ids是专为VPC设计的参数,支持安全组的原地修改,不会重建实例。
  • 安全组未明确绑定到自定义VPC时,Terraform在计划阶段可能无法提前解析安全组ID,导致误判为需要变更,明确vpc_id后可消除这种不确定性。

内容的提问来源于stack exchange,提问作者user1601716

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:12:45