使用Terraform创建AWS网络负载均衡器时请求挂起问题排查
问题排查:NLB及后端EC2无法响应GET请求
核心判断:大概率是配置问题,而非Terraform Bug
从「直接访问EC2公网IP也挂起」这个现象来看,问题根源不在NLB,而是后端EC2实例本身或基础网络配置存在问题,Terraform Bug的可能性极低。以下是具体排查步骤:
1. 先解决EC2实例的基础可用性问题
NLB的流量最终会转发到EC2,EC2自身不可用的话,NLB必然无法正常工作:
- 验证实例内服务状态:通过SSH登录EC2,执行
curl localhost:80,确认HTTP服务(如Nginx、Apache)是否正常监听80端口并返回响应。如果没有响应,检查服务是否启动(比如systemctl status nginx),排查启动失败日志。 - 检查实例网络连通性:
- 确认EC2已分配弹性公网IP或在启动时开启了「自动分配公网IP」;
- 查看实例所属子网的路由表,确认存在指向互联网网关(IGW)的路由条目;
- 在实例内执行
ping 8.8.8.8,验证是否能正常出网。
- 复核安全组规则:
- 入站规则:确保80端口的源是
0.0.0.0/0(或你的测试客户端IP),而非仅限内网CIDR; - 出站规则:至少允许TCP/80、TCP/443的回包流量(推荐直接允许所有出站流量,后续再精细化配置)。
- 入站规则:确保80端口的源是
2. 验证NLB及目标组配置
当EC2自身可用后,再检查NLB的转发逻辑:
- 目标组健康检查状态:在AWS控制台查看目标组,确认EC2实例的健康检查状态为「健康」。如果是「不健康」,检查健康检查路径(如
/)是否能在实例上返回200状态码,调整健康检查的超时、阈值参数。 - NLB监听配置:确认NLB的80端口监听已关联到正确的目标组,且监听协议为HTTP(或TCP,对应后端服务的协议)。
- 安全组关联确认:用AWS CLI执行
aws elbv2 describe-load-balancers --load-balancer-arns <你的NLB_ARN>,确认返回的SecurityGroups字段包含正确的安全组ID,且该安全组入站规则允许80端口流量。
3. Terraform代码可能存在的疏漏
如果以上排查都没问题,再检查Terraform代码的细节:
- EC2 user_data配置:确认user_data脚本正确安装并启动了HTTP服务,比如是否有遗漏的依赖安装命令,或脚本执行失败的情况(可通过EC2系统日志查看)。
- 目标组健康检查参数:检查Terraform中
aws_lb_target_group的health_check块,确保path、port、protocol与后端服务匹配,healthy_threshold设置合理(比如默认2次)。 - 安全组规则定义:确认
aws_security_group的ingress规则中,from_port和to_port都是80,cidr_blocks包含允许访问的IP范围。
之前出现的AWS控制台与CLI显示安全组不一致的情况,大概率是AWS控制台的缓存延迟问题,并非Terraform的Bug。
内容的提问来源于stack exchange,提问作者Dean Schulze
相关产品推荐
相关产品推荐

