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后:
- 到AWS控制台查看ALB监听器状态是否为「活跃」
- 查看目标组的目标注册列表,确认ECS任务IP是否被正确注册到3000端口
- 查看ECS任务的CloudWatch日志,确认是否收到ALB发来的
/health接口请求 - 等待2个健康检查周期后,确认目标组中任务的健康状态变为「Healthy」
内容的提问来源于stack exchange,提问作者Abdizriel
相关产品推荐
相关产品推荐

