ECS 服务的 AWS 网络负载均衡器运行状况检查失败

Posted

技术标签:

【中文标题】ECS 服务的 AWS 网络负载均衡器运行状况检查失败【英文标题】:AWS Network load balancer health check is failing for ECS service 【发布时间】:2020-04-28 22:18:55 【问题描述】:

我创建了一个 ECS 服务来部署一个 spring-boot 应用程序。我已通过在 aws ecs 控制台中为此服务创建容器时指定负载均衡器名称将目标组添加到网络负载均衡器。

现在,当我检查该目标群体的健康状况时,它会不断地使用不同的 IP 地址进行注册和注销。我还检查了安全组,它允许所有端口和 IP。

任何人都可以在这里帮助解决目标群体未达到“健康”状态的问题。

请查看附件 ECS 服务、健康检查状态和使用的安全组的截图。

【问题讨论】:

请在您的问题中包含目标群体的健康检查设置 @priyadhingra19 了解主机端口和容器端口之间的区别。看起来您正在尝试根据目标组设置将流量转发到 80 端口上的容器,但您的任务定义为主机((查看注册的目标及其端口)和容器(查看容器端口)带来 10001 上的容器服务负载均衡)。您有 2 个选项。1)更新/创建目标组以在 10001 而不是 80 上转发流量。或 2)更新任务定义以将容器端口带到 80 而不是 10001。 @priyadhingra19 我不担心默认目标组(80),它在这里无关紧要,你可以删除它,只要你用 10001 端口访问 NLB(例如:http://nlbhostname:10001/)。你的弹簧靴是什么端口?转到VoiceX:1 任务定义并提供Port Mapping 详细信息? Host <--> Container 映射。您的目标组 (ecs-VoiceX-VoiceX-service) 端口应与 Spring Boot 应用程序容器端口匹配。 @priyadhingra19 awsvpc 模式将容器带到与容器端口相同端口的主机上。好的。执行我最初给出的选项之一。重新创建目标组ecs-VoiceX-VoiceX-service,端口为 10001 而不是 80 并附加回服务(您可能需要再次重新创建服务!!)。 @priyadhingra19 太棒了!!我将添加我的观察结果作为答案。如果你没问题,那么你可以接受并投票!! 【参考方案1】:

正如在 cmets 中所讨论的,这是您的设置存在的问题。

    您将 Spring Boot 容器带到 8080 端口,因此 ECS 任务定义 Container Port 应该是 8080(而不是 10001)。 无论Host PortNLB Listener Port,您的Container PortTarget Group 端口都应该同步。因此,重新创建端口为 8080 的目标组,并重新创建附加到更新的目标组的 ECS 服务。 最后,看起来您的流量更多是基于 HTTP/HTTPS,所以我可能会建议使用 ALB(Application Load Balancer) 而不是 NLB。 NLB 适用于所有 TCP 端口,但您将获得将 ALB 用于基于 HTTP/HTTPS 的流量的更多优势。我不能完全确定您的申请,所以这只是一个建议!!。

【讨论】:

我的用例是 Spring Boot 应用程序会暴露一些 REST API。这些 REST api 将被移动应用程序和 Alexa 技能使用。我正在考虑将 AWS Api 网关放在 ECS 之前。我已遵循上述评论中提到的参考资料。如果您想将 api 网关与 ECS 一起使用,他们建议我使用 NLB。 Api 网关允许我放 api 级别的节流。你有什么建议吗? @priyadhingra19 哦!!。如果您想集成 API Gateway,请继续使用 NLB,您应该很好。我以为你会直接向消费​​者公开 NLB,所以我建议使用 ALB。

以上是关于ECS 服务的 AWS 网络负载均衡器运行状况检查失败的主要内容,如果未能解决你的问题,请参考以下文章

AWS 负载均衡器运行状况检查:运行状况检查失败,代码如下:[301]

Terraform AWS LB 运行状况检查失败

宽限期? - AWS EC2 容器服务和弹性负载均衡器

网络负载均衡器的AWS EC2安全组权限

aws 如何从生产环境中的 lambda 函数访问 ECS 服务

Terraform 创建了 AWS ECS 基础设施:运行状况检查一直失败