AWS Fargate中SpringBoot容器ALB目标组健康检查失败求助
问题:AWS ECS Fargate任务ALB目标组健康检查失败(SpringBoot API)
场景与已排查操作
- 本地构建Docker镜像,测试
GET localhost:9099/hello返回200 OK后推送到AWS ECR - 创建ECS任务定义:4 vCPU、10GB内存,Linux/x86/64系统,awsvpc网络模式,容器端口映射9099
- 基于任务定义创建ECS服务,配置全新ALB(监听80端口),目标组关联ECS任务的9099端口;健康检查宽限期60秒,尝试过Fargate 1.3.0、1.4.0及最新版本;ECS任务安全组允许ALB安全组的所有TCP流量,同时开放9099端口允许公网访问
- 任务启动后,可通过公网/私有IP直接访问API,但ALB目标组健康检查显示请求超时,状态为不健康
- 调整健康检查配置:HTTP协议、路径
/hello、使用流量端口9099、健康阈值2、不健康阈值3、超时120秒、间隔150秒、成功码200-499;重启任务后健康检查仍失败,且容器日志无/hello请求记录 - 访问ALB公网DNS的
9099/hello返回504错误,目标组监控显示请求到达但因目标不健康未转发 - CloudWatch日志显示SpringBoot API运行正常,开启ALB访问日志后未捕获到健康检查相关请求
- ALB与ECS任务均部署在us-east-1区域,已配置该区域全部6个可用区的子网
- 查阅相关文档及社区内容未找到有效解决办法,现有配置逻辑上应满足健康检查要求
排查方向
1. 验证ALB到Fargate任务的网络连通性
- 在ALB所在子网部署临时EC2实例(或通过AWS Systems Manager Session Manager在私有子网启动测试实例),执行
telnet <Fargate私有IP> 9099或curl http://<Fargate私有IP>:9099/hello,确认网络是否可达 - 检查VPC路由表:确保ALB所在子网的路由表可访问Fargate任务所在子网,无错误路由(比如误将流量指向NAT网关而非直接路由)
- 检查网络ACL:确认ALB和Fargate任务所在子网的网络ACL,双向放行TCP 9099端口流量(入方向、出方向均需配置)
2. 确认SpringBoot服务的监听地址
- 检查SpringBoot配置文件(如
application.properties/application.yml),确保服务监听地址为0.0.0.0,而非localhost或127.0.0.1。若仅监听本地回环地址,任务内部可访问,但外部(包括ALB)无法通过私有IP访问 - 查看容器启动日志,确认SpringBoot启动时的监听记录,比如是否存在
Tomcat started on port(s): 9099 (http) with context path ''且绑定地址为0.0.0.0的日志
3. 检查ALB与目标组的端口配置匹配性
- 确认ALB监听规则:若ALB监听80端口,需确保规则将流量转发到关联9099端口的目标组;同时验证目标组的
目标端口是否设置为9099,而非错误匹配其他端口 - 确认目标组健康检查协议:若SpringBoot使用HTTP服务,目标组健康检查协议需设为HTTP,而非HTTPS
4. 排查健康检查的请求路径与头部
- 尝试更换健康检查路径:比如改为
/或/actuator/health(若已开启SpringBoot Actuator),排除/hello路径的特殊配置问题 - 检查是否需要自定义请求头:部分SpringBoot应用可能要求特定Host头或其他参数,可在目标组健康检查配置中添加对应头部
5. 验证Fargate任务的ENI配置
- 查看Fargate任务的弹性网络接口(ENI)状态,确认ENI已成功分配私有IP,且关联的安全组正确
- 查看ENI的流量统计,确认是否有来自ALB的流量到达ENI但未被容器接收
6. 检查VPC DNS与端点配置
- 确认VPC已启用DNS解析,Fargate任务的私有IP可正常解析,ALB能通过私有IP访问任务
- 若配置了VPC端点,确认其不会拦截ALB到Fargate任务的流量
内容的提问来源于stack exchange,提问作者Rajesh Ranjan
相关产品推荐
相关产品推荐

