ECS Fargate上Node.js gRPC服务ALB健康检查失败问题排查
修正服务监听地址:将gRPC服务的绑定地址从
127.0.0.1:50051改为0.0.0.0:50051。容器内的127.0.0.1仅允许本地进程访问,Fargate任务需要监听所有可用网卡,才能让ALB的健康检查请求到达服务。确认ALB目标组协议类型:目标组必须选择
gRPC协议,而非HTTP/HTTPS。ALB对gRPC服务的健康检查依赖gRPC协议解析,HTTP模式下无法正确识别/grpc.Health/Check路径的请求。核对健康检查端口与容器映射:确保目标组的健康检查端口与Fargate任务中容器暴露的端口一致,任务定义里需正确配置容器端口为50051(Fargate中主机端口可留空自动分配)。同时调整健康检查参数:超时时间建议设为5秒,间隔时间设为10秒,避免因gRPC请求处理耗时导致超时判定失败。
验证TLS配置一致性:如果ALB的HTTPS监听做了TLS终止,目标组到后端Fargate任务的通信需使用明文gRPC(目标组协议为gRPC,端口50051,无需额外TLS配置);如果后端服务本身启用TLS,需确保服务端证书与ALB信任的证书一致,且目标组健康检查启用TLS加密。
检查Health服务注册逻辑:确保代码中正确将Health服务实例注册到gRPC服务器,示例代码如下:
const { health, Server, ServerCredentials } = require('@grpc/grpc-js'); const server = new Server(); const healthService = new health.HealthService(); healthService.setStatus('grpc.health.v1.Health', health.healthStatus.SERVING); server.addService(health.healthService, healthService); server.bindAsync('0.0.0.0:50051', ServerCredentials.createInsecure(), (err, port) => { if (err) throw err; server.start(); });本地测试可使用
grpcurl工具:grpcurl -plaintext 127.0.0.1:50051 grpc.health.v1.Health/Check,确认返回{"status":"SERVING"}。检查安全组与VPC配置:Fargate任务的安全组需允许来自ALB安全组的入站流量(端口50051);ALB的安全组需允许出站流量到任务安全组(端口50051)。同时确认ALB与Fargate任务处于同一VPC的可通信子网内,路由表配置正确。
验证Reflection服务可用性:执行
grpcurl -plaintext 127.0.0.1:50051 list命令,确认输出包含grpc.health.v1.Health,说明Reflection服务正常注册,Health服务可被正确发现。
内容的提问来源于stack exchange,提问作者gamerrishad

