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

求助:无法通过公网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)。

验证步骤

  1. 执行terraform apply部署修正后的资源。
  2. 在AWS控制台获取EC2实例的公网IP。
  3. 使用SSH连接:ssh -i my-key.pem ubuntu@<公网IP>(Ubuntu实例默认用户为ubuntu)。
  4. 访问http://<公网IP>验证Apache服务是否正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:35:58