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状态码。 - 检查健康检查的超时时间、重试阈值,若前端容器启动较慢,默认的短超时会导致健康检查误判。
- React前端健康检查路径设为"/",但部分React应用在路由未配置或静态资源加载异常时,会返回4xx/5xx状态码,导致健康检查失败。可临时将路径改为"/index.html",或直接在容器内用
VPC子网与路由问题
- 若ECS任务部署在私网子网,需确认负载均衡器所在的公网子网与私网子网的路由表是否打通,确保负载均衡器能访问到任务的私网IP。
目标组类型配置错误
- 确认前端目标组的
target_type是否为"ip"(与API一致)。如果ECS任务使用awsvpc网络模式,目标类型必须设为"ip";若误用"instance"类型,负载均衡器无法正确定位容器IP。
- 确认前端目标组的
资源配额或端口占用
- 检查AWS账户的负载均衡器配额是否已达上限;若使用EC2启动类型,确认EC2实例是否有端口占用情况,导致前端容器无法正常监听80端口。
HTTPS证书或DNS问题
- 前端负载均衡器的HTTPS监听器是否使用了匹配域名的ACM证书?证书不匹配会导致健康检查或访问失败;同时确认域名解析是否正确指向前端负载均衡器的DNS名称。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

