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

Terraform Apply报错:安全组与子网分属不同网络排查

问题原因分析

这个错误的核心原因非常明确:你的EC2实例被部署到了AWS默认VPC的子网中,但你指定的安全组属于自己创建的自定义VPC,两者不属于同一个网络,因此AWS拒绝创建实例。

为什么会出现这种情况?因为在你的aws_instance.bastion资源定义里,只指定了availability_zone,但没有显式声明subnet_id。当Terraform创建EC2实例时,如果没有指定子网ID,AWS会自动把实例放到当前区域默认VPC的默认子网里——而这个默认子网和你自定义的ireland-dev-my_own_project-main_vpc是完全独立的两个网络,你的安全组又绑定在自定义VPC上,自然就触发了"不同网络"的报错。

解决方案

只需要在aws_instance.bastion资源中添加subnet_id参数,明确指定要使用你创建的公共子网即可:

修改后的实例资源代码如下:

resource "aws_instance" "bastion" {
  ami = "${data.aws_ami.ami_amazon.id}"
  instance_type = "t2.micro"
  # 新增subnet_id指定自定义子网
  subnet_id = "${aws_subnet.ireland-dev-my_own_project-sn-pub-1a.id}"
  availability_zone = "${aws_subnet.ireland-dev-my_own_project-sn-pub-1a.availability_zone}"
  vpc_security_group_ids = ["${aws_security_group.sg_local.id}","${aws_security_group.sg_bastion.id}"]
  key_name = "${var.default_kp}"
  associate_public_ip_address = true
  tags = {
    Name = "ireland-dev-my_own_project-ec2ins-bastion"
    env = "dev"
    application = "my_own_project-main"
    finality = "bastion"
  }
}
额外优化建议

其实你可以去掉availability_zone的指定,因为当你明确指定subnet_id后,AWS会自动从该子网对应的可用区部署实例,代码会更简洁:

resource "aws_instance" "bastion" {
  ami = "${data.aws_ami.ami_amazon.id}"
  instance_type = "t2.micro"
  subnet_id = "${aws_subnet.ireland-dev-my_own_project-sn-pub-1a.id}"
  vpc_security_group_ids = ["${aws_security_group.sg_local.id}","${aws_security_group.sg_bastion.id}"]
  key_name = "${var.default_kp}"
  associate_public_ip_address = true
  tags = {
    Name = "ireland-dev-my_own_project-ec2ins-bastion"
    env = "dev"
    application = "my_own_project-main"
    finality = "bastion"
  }
}

修改完成后,重新执行terraform apply就能正常创建实例了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:26:54