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

Terraform部署AWS ECS Fargate网关服务LB健康检查失败求助

问题根因&排查解决步骤

已确认前提:私有网络内服务运行正常,3000端口的/health接口返回符合预期,问题出在ALB到ECS任务的链路配置错误。

核心配置错误(直接导致健康检查无流量)

  • 目标组端口配置错误:你的aws_lb_target_group资源中port参数配置为80,但ECS容器实际暴露的服务端口是3000,ALB健康检查请求默认发往目标组指定的端口,自然得不到响应。
  • ALB监听器资源引用错误:你定义ALB使用的资源标识是aws_lb.alb,但aws_lb_listener中引用的是不存在的aws_alb.alb.arn,导致监听器未正确挂载到ALB上,健康检查流量根本不会转发到ECS任务。

其他影响稳定性的配置问题

  • ECS服务子网配置错误:你将公有子网+私有子网都配置为ECS服务的运行子网,私有子网内的Fargate任务即使开启assign_public_ip = true也无法获得公网IP,公网ALB无法路由到私有子网内的任务,会导致这部分任务健康检查必然失败。
  • 安全组配置冗余风险:你给ECS服务同时绑定了默认安全组(开放了mysql、rabbitmq等大量非必要端口到公网)和LB专属安全组,存在安全风险,仅保留LB专属安全组即可。

修复代码修改点

1. 修改目标组端口配置

resource "aws_lb_target_group" "target_group" {
  name        = "target-group"
  port        = 3000 # 改为容器实际暴露的3000端口
  protocol    = "HTTP"
  target_type = "ip"
  vpc_id      = module.vpc.vpc_id

  health_check {
    matcher = "200,301,302"
    path    = "/health"
    interval = 120
    timeout = 30
  }
}

2. 修正ALB监听器的资源引用

resource "aws_lb_listener" "listener" {
  load_balancer_arn = aws_lb.alb.arn # 修正为正确的ALB资源标识
  port              = 80
  protocol          = "HTTP"
  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.target_group.arn
  }
}

3. 修正ECS服务的子网&安全组配置

resource "aws_ecs_service" "gateway_service" {
  # 其余原有配置保持不变
  network_configuration {
    subnets = module.vpc.public_subnets # 仅保留公有子网,若用私有子网则需关闭assign_public_ip并确保VPC内网路由正常
    security_groups = [
      aws_security_group.service_security_group.id # 移除开放过多端口的默认安全组
    ]
    assign_public_ip = true # 公有子网保留true,私有子网改为false
  }
}

验证步骤

修改配置重新apply后:

  1. 到AWS控制台查看ALB监听器状态是否为「活跃」
  2. 查看目标组的目标注册列表,确认ECS任务IP是否被正确注册到3000端口
  3. 查看ECS任务的CloudWatch日志,确认是否收到ALB发来的/health接口请求
  4. 等待2个健康检查周期后,确认目标组中任务的健康状态变为「Healthy」

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:24:06