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

Terraform部署的AWS EC2实例无法连接问题求助

问题排查与修复方案

1. 安全组配置缺失关键规则

你的安全组仅开放了8080端口的入站访问,但存在两个核心问题:

  • 未开放SSH/EC2实例连接端口:无法通过控制台连接实例,本质是未开放22端口(SSH或EC2 Instance Connect都依赖该端口)。
  • 缺少出站规则:Terraform的aws_security_group资源若不显式定义出站规则,会覆盖AWS默认的全量出站规则,导致实例无法向外发起请求(包括无法响应外部连接的ACK包,直接引发连接失败)。

修复后的安全组代码:

resource "aws_security_group" "instance" {
    name = "terraform-example-instance"

    # 允许外部访问8080端口
    ingress {
        from_port = 8080
        to_port = 8080
        protocol = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
    }

    # 允许SSH/EC2实例连接(控制台连接必备)
    ingress {
        from_port = 22
        to_port = 22
        protocol = "tcp"
        cidr_blocks = ["0.0.0.0/0"] # 生产环境建议限制为你的固定IP,格式如xxx.xxx.xxx.xxx/32
    }

    # 允许所有出站流量(保障实例正常对外通信)
    egress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    }
}

2. 确认实例是否分配公有IP

若实例部署在自定义VPC的私有子网中,默认不会自动分配公有IP,导致外部无法直接访问。可通过两种方式解决:

  • 在aws_instance资源中强制开启公有IP分配:
    resource "aws_instance" "example" {
        # 保留原有配置
        associate_public_ip_address = true
    }
    
  • 检查实例所在子网的设置,确认已开启"自动分配公有IP"(在VPC控制台的子网详情中修改)。

3. 用户数据脚本有效性验证

虽然不是连接失败的直接原因,但可排查服务是否正常启动:

  • 登录实例后执行ps aux | grep httpd,确认busybox httpd进程是否存在。
  • 查看nohup.out日志,排查启动时是否有报错。
  • 建议指定网页根目录,避免路径问题:将脚本中的nohup busybox httpd -f -p 8080 &改为nohup busybox httpd -f -p 8080 -h /home/ec2-user &。

4. 其他排查方向

  • 检查子网的网络ACL:确保ACL规则允许22、8080端口的入站和出站流量。
  • 验证本地网络:确认你的设备防火墙或本地安全组未阻止对22、8080端口的访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:17:41