【问题标题】:AWS ECS Service restarting bevause of failed Target Group healthcheckAWS ECS 服务因目标组运行状况检查失败而重新启动
【发布时间】:2026-02-26 01:20:06
【问题描述】:

我有一个在 Docker 容器中运行的 .net 核心 API。 该容器已部署到 Amazon ECR,我在其中使用任务定义运行它(已经工作)

  • 我的任务定义中的片段
 "portMappings": [
    {
      "hostPort": 50598,
      "protocol": "tcp",
      "containerPort": 50598
    }
  ],

当我启动服务时,任务运行并且工作正常。我得到了我的公共 IP,我可以在其中检查我的呼叫是否可用:

  • HTTP 401 没问题,因为调用会检查有效令牌

问题是当我尝试向目标组添加负载均衡器时。

为此,我删除了旧服务并使用负载均衡器和目标组创建了一个新服务

像这样启动我的服务后,目标组运行状况检查响应带有“请求超时”并不断重新启动我的服务。 当我检查 API 的公共 IP 时,它仍然有效,只有当我尝试访问我的 API 时 通过负载均衡器它不起作用。

目标群体:

磅:

【问题讨论】:

    标签: amazon-web-services amazon-ecs aws-fargate aws-application-load-balancer


    【解决方案1】:

    您收到请求超时可能是因为附加到任务的安全组不允许来自负载平衡器节点的入站访问。

    默认情况下,即使所有节点都未通过健康检查,负载均衡器也会尝试转发到所有节点,如果入站评估失败,则会导致超时。

    只要主机允许将端口 50598 连接到负载均衡器,就不会发生超时,如果您使用 ALB,则可以添加源作为附加到负载均衡器的安全组。

    一旦此访问生效,您需要确保对 HTTP 状态代码和路径的健康检查成功。

    还值得注意的是,对于 Application Load Balancer,您可以使用从 200 - 499 的范围,而对于网络负载均衡器,它只能从 200 - 399 进行健康检查。

    您的目标组也必须配置为在端口50598 上运行,它当前是目标端口80

    更新

    应用程序似乎在端口 80 上运行。目标组和任务的配置已更新为使用该端口。然后这又开始工作了。

    【讨论】:

    • 我现在允许我的安全组的所有流量,而不是超时,我现在得到 502
    • 这意味着当防火墙正在工作时,应用程序正在失败。看看docs.aws.amazon.com/elasticloadbalancing/latest/application/… :)
    • 应用程序似乎可以工作,我可以使用公共 IP 作为端点...直到它重新启动^^
    • 由于负载均衡器中的 502,它将重新启动。 ECS 监控负载均衡器的健康状况
    • 502需要解决,能否转发一下你的监听器和目标配置的截图?
    【解决方案2】:

    只需在健康检查成功代码中添加401,它应该可以工作。因为你可以在目标组的健康检查中定义多个HTTP状态码。

    还要处理“Request Timeout”,允许ECS实例端口50598来自LB

    【讨论】:

    • 我已经添加了健康检查参数,路径:/api/user/areYouLoggedIn,成功码:401。我会再次检查负载均衡器端口
    • 没有 ALB SG 很好,您需要允许 Ec2 实例端口使其工作,这就是您超时的原因。
    • 我现在添加了一个允许所有流量的安全规则。我不再收到超时,但我收到了 502。
    • 502 表示后端应用程序未运行。检查应用程序。
    • 它一遍又一遍地重启。我仍然可以检查任务的公共 IP 并且它可以工作,但服务不断重启
    【解决方案3】:

    查看我的服务的日志,我发现了以下停止它的原因

    服务 my-service(端口 80)在目标组 my-target-group 中不健康,原因是(原因健康检查失败,这些代码:[302] )。

    而 Http 代码 302 用于执行 URL 重定向。

    由于服务本身没有问题,并且任务停止并重新启动是健康检查失败。我更改了健康检查配置,将200(default) and 302 响应代码视为成功。现在已经修复了。

    但不确定这是否是正确的解决方法。

    【讨论】:

      最近更新 更多