如何通过Terraform为EC2配置负载均衡并解决504与健康检查失败问题
配置问题排查
1. 目标组target_type配置不符合常规EC2注册场景
你当前将aws_lb_target_group的target_type设为了ip,该类型仅支持传入IP地址作为目标,所以你无法直接传入EC2实例ID/ARN,只能传private_ip属于正常现象。
如果是注册EC2实例作为负载均衡目标,常规做法是将target_type改为instance,此时aws_lb_target_group_attachment的target_id可以直接填写aws_instance.ec2.id,无需手动指定私有IP。
2. 安全组规则配置错误(最常见健康检查失败原因)
- 负载均衡关联的安全组
lb_sg需要放开80端口入站,允许公网访问(如果是面向公网的服务) - EC2实例关联的安全组需要放开8000端口入站,源地址设置为负载均衡的安全组ID,确保负载均衡的健康检查请求和转发请求可以正常到达EC2实例
3. EC2实例侧服务配置异常
- 确认你的应用已经正常启动,且监听在
0.0.0.0:8000,而非仅监听127.0.0.1环回地址 - 手动在EC2实例内执行
curl http://localhost:8000/,确认返回状态码为200,和你健康检查配置的matcher = "200"匹配
4. 健康检查参数合理性
你当前设置的健康检查间隔为90秒,超时时间20秒,参数本身没有问题,但如果服务启动时间较长,可以适当调大healthy_threshold避免误判。
EC2负载均衡配置优化示例
将目标组类型改为适配EC2的instance类型即可,修改后的核心配置如下:
resource "aws_lb_target_group" "alb_target_group" { name = "backend-tg" port = 8000 protocol = "HTTP" target_type = "instance" # 改为instance类型适配EC2实例注册 vpc_id = aws_vpc.main.id health_check { enabled = true path = "/" port = "8000" protocol = "HTTP" healthy_threshold = 3 unhealthy_threshold = 2 interval = 30 # 可适当缩短检查间隔加快健康状态判断 timeout = 5 matcher = "200" } depends_on = [aws_lb.alb] } resource "aws_lb_target_group_attachment" "one" { target_group_arn = aws_lb_target_group.alb_target_group.arn target_id = aws_instance.ec2.id # 直接使用EC2实例ID即可 port = 8000 }
内容的提问来源于stack exchange,提问作者feldo badix
相关产品推荐
相关产品推荐

