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

AWS ECS中前后端独立负载均衡部署后503及服务异常排查

问题描述

在AWS ECS中部署Django应用容器时,使用以下Terraform配置创建了API的负载均衡器:

resource "aws_lb" "api" {
  name               = "${local.prefix}-api"
  load_balancer_type = "application"
  subnets = [
    aws_subnet.public_a.id,
    aws_subnet.public_b.id
  ]

  security_groups = [aws_security_group.lb_api.id]

  tags = local.common_tags
}

resource "aws_lb_target_group" "api" {
  name        = "${local.prefix}-api"
  protocol    = "HTTP"
  vpc_id      = aws_vpc.main.id
  target_type = "ip"
  port        = 8000

  health_check {
    path = "/admin/login/"
  }
}

resource "aws_lb_listener" "api" {
  load_balancer_arn = aws_lb.api.arn
  port              = 80
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

resource "aws_lb_listener" "api_https" {
  load_balancer_arn = aws_lb.api.arn
  port              = 443
  protocol          = "HTTPS"

  certificate_arn = aws_acm_certificate_validation.cert.certificate_arn

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.api.arn
  }
}


resource "aws_security_group" "lb_api" {
  description = "Allow access to Application Load Balancer"
  name        = "${local.prefix}-lb-api"
  vpc_id      = aws_vpc.main.id

  ingress {
    protocol    = "tcp"
    from_port   = 80
    to_port     = 80
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    protocol    = "tcp"
    from_port   = 443
    to_port     = 443
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    protocol    = "tcp"
    from_port   = 8000
    to_port     = 8000
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = local.common_tags
}

针对React前端容器,使用了几乎完全相同的配置,仅将标识符"api"替换为"frontend",目标组端口改为80,健康检查路径改为"/"。

单独部署API时可正常访问;但添加前端负载均衡器后,前端访问出现503 Service Temporarily Unavailable错误,一段时间后API也出现故障。ECS控制台显示集群、任务及容器均运行正常,但负载均衡器的健康检查持续报错。端口映射与container-definitions文件一致,求排查方向。

可能的原因及排查步骤
  • 安全组配置不全或冲突

    • 前端负载均衡器的安全组(lb_frontend)出站规则可能未允许访问前端容器的80端口;同时ECS任务的安全组可能仅授权了lb_api的访问,未添加lb_frontend的安全组权限,导致负载均衡器无法连接容器。
    • 检查ECS任务所属安全组的入站规则,确认是否同时允许两个负载均衡器的安全组访问对应端口(API的8000、前端的80)。
  • 目标组健康检查配置不合理

    • React前端健康检查路径设为"/",但部分React应用在路由未配置或静态资源加载异常时,会返回4xx/5xx状态码,导致健康检查失败。可临时将路径改为"/index.html",或直接在容器内用curl验证根路径是否返回200状态码。
    • 检查健康检查的超时时间、重试阈值,若前端容器启动较慢,默认的短超时会导致健康检查误判。
  • VPC子网与路由问题

    • 若ECS任务部署在私网子网,需确认负载均衡器所在的公网子网与私网子网的路由表是否打通,确保负载均衡器能访问到任务的私网IP。
  • 目标组类型配置错误

    • 确认前端目标组的target_type是否为"ip"(与API一致)。如果ECS任务使用awsvpc网络模式,目标类型必须设为"ip";若误用"instance"类型,负载均衡器无法正确定位容器IP。
  • 资源配额或端口占用

    • 检查AWS账户的负载均衡器配额是否已达上限;若使用EC2启动类型,确认EC2实例是否有端口占用情况,导致前端容器无法正常监听80端口。
  • HTTPS证书或DNS问题

    • 前端负载均衡器的HTTPS监听器是否使用了匹配域名的ACM证书?证书不匹配会导致健康检查或访问失败;同时确认域名解析是否正确指向前端负载均衡器的DNS名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:33:18