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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:45:05