求助:无法通过公网IP或SSH连接自定义VPC内的EC2实例
问题诊断与修复方案
核心问题分析
你的Terraform代码存在3个关键网络配置错误,直接导致EC2实例无法通过公网访问:
1. EC2实例未关联自定义子网与安全组
aws_instance.my-server资源未指定subnet_id,AWS会自动将实例部署到账户的默认VPC子网,而非你创建的prod-subnet。同时,实例未关联你配置好的allow_web安全组,默认使用AWS默认安全组(仅允许同组内实例通信,拒绝外部SSH/HTTP流量)。
2. 弹性网卡配置存在循环依赖与冗余
你创建的aws_network_interface.server-nic尝试附加到实例,但存在两个问题:
- 循环依赖:网卡资源引用实例ID,实例资源未指定子网时又可能依赖网卡,Terraform虽能处理依赖,但实例主网卡仍来自默认VPC,附加网卡不影响公网访问的主配置。
- 冗余设计:直接在实例中指定子网和安全组是更简洁的实现方式,无需单独创建附加网卡。
3. IPv6规则无实际作用
你配置了IPv6路由和安全组规则,但VPC与子网未启用IPv6支持,这些规则不会生效,不过不影响IPv4访问。
修复后的完整代码
resource "aws_vpc" "prod-vpc" { cidr_block = "10.0.0.0/16" tags = { Name = "Production" } } resource "aws_internet_gateway" "prod-gateway" { vpc_id = aws_vpc.prod-vpc.id tags = { Name = "prod-gateway" } } resource "aws_route_table" "prod-routetable" { vpc_id = aws_vpc.prod-vpc.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.prod-gateway.id } tags = { Name = "prod" } } resource "aws_subnet" "prod-subnet" { vpc_id = aws_vpc.prod-vpc.id cidr_block = "10.0.1.0/24" availability_zone = "us-east-1a" map_public_ip_on_launch = true tags = { Name = "prod-subnet" } } resource "aws_route_table_association" "rt-1" { subnet_id = aws_subnet.prod-subnet.id route_table_id = aws_route_table.prod-routetable.id } resource "aws_security_group" "allow_web" { name = "allow_Web" description = "Allow web inbound traffic and all outbound traffic" vpc_id = aws_vpc.prod-vpc.id ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "allow_web" } } resource "aws_instance" "my-server" { ami = "ami-04e5276ebb8451442" # us-east-1区域Ubuntu 22.04 AMI instance_type = "t2.micro" subnet_id = aws_subnet.prod-subnet.id # 指定自定义子网 key_name = "my-key" # 关联开放端口的安全组 vpc_security_group_ids = [aws_security_group.allow_web.id] user_data = <<-EOF #!/bin/bash sudo apt update -y sudo apt install apache2 -y sudo systemctl start apache2 sudo systemctl enable apache2 EOF tags = { Name = "my-server" } }
关键修复说明
- 为
aws_instance.my-server添加subnet_id,确保实例部署到你创建的自动分配公网IP的子网中。 - 添加
vpc_security_group_ids,将实例关联到开放22/80端口的安全组。 - 移除冗余的弹性网卡资源,直接在实例中配置网络参数,避免循环依赖。
- 简化安全组规则写法(也可保留单独的ingress/egress rule资源,效果一致)。
- 移除无用的IPv6规则(若需IPv6支持,需给VPC和子网开启IPv6 CIDR)。
验证步骤
- 执行
terraform apply部署修正后的资源。 - 在AWS控制台获取EC2实例的公网IP。
- 使用SSH连接:
ssh -i my-key.pem ubuntu@<公网IP>(Ubuntu实例默认用户为ubuntu)。 - 访问
http://<公网IP>验证Apache服务是否正常运行。
内容的提问来源于stack exchange,提问作者Neel P
相关产品推荐
相关产品推荐

