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
相关产品推荐
相关产品推荐

