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

