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

