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
相关产品推荐
相关产品推荐

