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

ECS服务通过AWS LoadBalancer暴露时出现超时问题求助

AWS ALB配置ECS多服务访问超时问题

问题背景

我尝试在AWS负载均衡器(ALB)上暴露ECS集群中的2个服务,配置了HTTP监听器重定向至HTTPS监听器,HTTPS监听器根据Host Header转发到对应服务的目标组。已通过AWS Certificate Manager(ACM)注册了证书,但浏览器访问对应URL时出现超时。

Terraform配置

负载均衡器相关资源

resource "aws_lb_target_group" "nginx-tg" {
  name                        = "nginx-tg"
  target_type                 = "ip"
  protocol                    = "HTTP"
  port                        = "80"
  vpc_id                      = var.vpc-id
}

resource "aws_lb_target_group" "apache2-tg" {
  name                        = "apache2-tg"
  target_type                 = "ip"
  protocol                    = "HTTP"
  port                        = "80"
  vpc_id                      = var.vpc-id
}

resource "aws_lb_listener_certificate" "nginx-certificate" {
  certificate_arn = var.nginx-certificate-arn # subdomain1.domain.com
  listener_arn    = aws_lb_listener.test-cluster-lb-https-listener.arn
}

resource "aws_lb_listener_certificate" "apache2-certificate" {
  certificate_arn = var.apache2-certificate-arn # subdomain2.domain.com
  listener_arn    = aws_lb_listener.test-cluster-lb-https-listener.arn
}

resource "aws_lb_listener" "test-cluster-lb-https-listener" {
  load_balancer_arn           = aws_lb.test-cluster-elb.arn
  port                        = "443"
  protocol                    = "HTTPS"
  ssl_policy                  = "ELBSecurityPolicy-2016-08"
  certificate_arn             = var.listener-certificate-arn

  default_action {
    type                      = "redirect"
    redirect {
      port                    = "443"
      protocol                = "HTTPS"
      status_code             = "HTTP_301"
      host                    = "home.domain.com"
      path                    = "/"
    }
  }
}

resource "aws_lb_listener_rule" "nginx-listener-rule" {
  listener_arn = aws_lb_listener.test-cluster-lb-https-listener.arn
  action {
    type = "forward"
    target_group_arn = aws_lb_target_group.nginx-tg.arn
  }
  condition {
    host_header {
      values = [var.nginx-url]
    }
  }
  priority = 1
}

resource "aws_lb_listener_rule" "apache2-listener-rule" {
  listener_arn = aws_lb_listener.test-cluster-lb-https-listener.arn
  action {
    type = "forward"
    target_group_arn = aws_lb_target_group.apache2-tg.arn
  }
  condition {
    host_header {
      values = [var.apache2-url]
    }
  }
  priority = 2
}

ECS服务配置

resource "aws_ecs_service" "nginx" {
  name                        = "nginx"
  launch_type                 = "FARGATE"
  cluster                     = aws_ecs_cluster.ecs_cluster.id
  task_definition             = aws_ecs_task_definition.nginx_task.arn
  desired_count               = 2

  network_configuration {
    subnets                   = [var.private-sn-az-1, var.private-sn-az-2]
    security_groups           = [aws_security_group.service-sg.id]
    assign_public_ip          = true
  }

  load_balancer {
    target_group_arn          = aws_lb_target_group.nginx-tg.arn
    container_name            = "nginx"
    container_port            = 80
  }

}

resource "aws_ecs_service" "apache2" {
  name                        = "apache2"
  launch_type                 = "FARGATE"
  cluster                     = aws_ecs_cluster.ecs_cluster.id
  task_definition             = aws_ecs_task_definition.apache2_task.arn
  desired_count               = 2

  network_configuration {
    subnets                   = [var.private-sn-az-1, var.private-sn-az-2]
    security_groups           = [aws_security_group.service-sg.id]
    assign_public_ip          = true
  }

  load_balancer {
    target_group_arn          = aws_lb_target_group.apache2-tg.arn
    container_name            = "apache2"
    container_port            = 80
  }

}

已确认/尝试的操作

  • 服务安全组已允许来自负载均衡器的所有80端口请求
  • 已将目标组暴露端口从8080改为80

预期与实际结果

  • 预期:调整端口后可正常访问服务
  • 实际:访问subdomain1.domain.com和subdomain2.domain.com仍出现超时

排查与解决建议

1. 检查负载均衡器子网配置

确认ALB部署在公有子网中,且子网关联的路由表有指向Internet Gateway(IGW)的路由。如果ALB在私有子网,会直接导致外部无法访问。

2. 验证目标组健康状态

在AWS控制台查看目标组nginx-tg和apache2-tg的健康检查状态:

  • 如果目标显示unhealthy,检查健康检查路径是否正确(默认是/,若容器内服务根路径不是/需调整)
  • 确认容器内服务确实在80端口监听(可通过ECS任务日志或aws ecs execute-command进入容器验证)

3. 检查安全组规则完整性

  • 负载均衡器安全组:需允许外部(0.0.0.0/0)的80和443端口入站,同时允许所有出站流量(或至少允许到ECS任务的80端口)
  • ECS服务安全组:除了允许ALB的80端口入站,还要确认出站规则允许服务访问必要资源(比如拉取镜像、健康检查回包)

4. 验证DNS解析正确性

确认subdomain1.domain.com和subdomain2.domain.com的A/CNAME记录正确指向ALB的域名,可通过nslookup或dig命令本地验证解析结果。

5. 检查NAT Gateway配置(针对私有子网ECS任务)

虽然给ECS任务分配了公网IP,但如果子网是私有子网,需确认NAT Gateway配置正常,确保任务能正常拉取镜像和响应健康检查。另外,Fargate任务分配公网IP后,安全组也需要允许出站到互联网。

6. 确认监听器规则匹配逻辑

检查var.nginx-url和var.apache2-url的值与访问的Host Header完全一致(比如是否包含www前缀、大小写是否匹配),同时确认规则优先级设置正确(优先级1的规则会先匹配)。

7. 查看日志定位问题

  • 查看ALB的访问日志,确认请求是否到达ALB,以及是否匹配到对应的监听器规则
  • 查看ECS任务的CloudWatch日志,确认是否收到请求或有服务启动/运行错误输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:31:23