AWS ECS 服务因目标组健康检查失败而重新启动
AWS ECS Service restarting bevause of failed Target Group healthcheck
我有一个 .net 核心 API,它 运行 在 Docker 容器中。
该容器已部署到 Amazon ECR,我在其中 运行 它带有任务定义(已经工作)
- 来自我的任务定义的片段
"portMappings": [
{
"hostPort": 50598,
"protocol": "tcp",
"containerPort": 50598
}
],
当我启动服务时,任务 运行s 并且工作正常。我得到了我的 public IP,我可以在其中检查我的电话是否可用:
- HTTP 401 正常,因为调用会检查有效令牌
问题是当我尝试添加带有目标组的负载平衡器时。
为此,我删除了我的旧服务并创建了一个带有负载均衡器和目标组的新服务
像这样启动我的服务后,目标组运行状况检查响应“请求超时”并不断重新启动我的服务。
当我检查 API 的 public IP 时它仍然有效,只有当我尝试访问我的 API
通过负载均衡器它不起作用。
目标群体:
磅:
只需在 Healthcheck 成功代码 中添加 401
,它应该会起作用。由于您可以在目标组的健康检查中定义多个HTTP状态码。
还要处理“请求超时”,允许ECS实例端口50598
来自LB
您的请求超时可能是因为附加到任务的安全组不允许来自负载均衡器节点的入站访问。
默认情况下,即使所有节点都未通过健康检查,负载均衡器也会尝试转发到所有节点,入站评估失败会导致超时。
只要主机允许端口 50598
连接到负载均衡器,就不会发生超时,如果您使用的是 ALB,则可以添加一个源作为附加到负载均衡器的安全组。
一旦此访问生效,您将需要确保您的 HTTP 状态代码和路径健康检查成功。
同样值得注意的是,对于应用程序负载均衡器,您可以使用 200
- 499
的范围,而对于网络负载均衡器,它只能进行 200
的运行状况检查- 399
.
您的目标组也必须在端口 50598
上配置为 运行,它当前是目标端口 80
。
更新
应用程序似乎 运行正在端口 80
上运行。目标组和任务的配置已更新为使用该端口。然后又开始工作了。
查看我的服务日志,我发现停止它的原因如下
service my-service (port 80) is unhealthy in target-group my-target-group due to (reason Health checks failed with these codes: [302]).
而 Http 代码 302 用于执行 URL 重定向。
由于服务本身没有问题,是健康检查失败导致任务停止重启。我更改了健康检查配置以将 200(default) and 302
响应代码视为成功。现在已经修复了。
但不确定这是否是正确的解决方法。
我有一个 .net 核心 API,它 运行 在 Docker 容器中。 该容器已部署到 Amazon ECR,我在其中 运行 它带有任务定义(已经工作)
- 来自我的任务定义的片段
"portMappings": [ { "hostPort": 50598, "protocol": "tcp", "containerPort": 50598 } ],
当我启动服务时,任务 运行s 并且工作正常。我得到了我的 public IP,我可以在其中检查我的电话是否可用:
- HTTP 401 正常,因为调用会检查有效令牌
问题是当我尝试添加带有目标组的负载平衡器时。
为此,我删除了我的旧服务并创建了一个带有负载均衡器和目标组的新服务
像这样启动我的服务后,目标组运行状况检查响应“请求超时”并不断重新启动我的服务。 当我检查 API 的 public IP 时它仍然有效,只有当我尝试访问我的 API 通过负载均衡器它不起作用。
目标群体:
磅:
只需在 Healthcheck 成功代码 中添加 401
,它应该会起作用。由于您可以在目标组的健康检查中定义多个HTTP状态码。
还要处理“请求超时”,允许ECS实例端口50598
来自LB
您的请求超时可能是因为附加到任务的安全组不允许来自负载均衡器节点的入站访问。
默认情况下,即使所有节点都未通过健康检查,负载均衡器也会尝试转发到所有节点,入站评估失败会导致超时。
只要主机允许端口 50598
连接到负载均衡器,就不会发生超时,如果您使用的是 ALB,则可以添加一个源作为附加到负载均衡器的安全组。
一旦此访问生效,您将需要确保您的 HTTP 状态代码和路径健康检查成功。
同样值得注意的是,对于应用程序负载均衡器,您可以使用 200
- 499
的范围,而对于网络负载均衡器,它只能进行 200
的运行状况检查- 399
.
您的目标组也必须在端口 50598
上配置为 运行,它当前是目标端口 80
。
更新
应用程序似乎 运行正在端口 80
上运行。目标组和任务的配置已更新为使用该端口。然后又开始工作了。
查看我的服务日志,我发现停止它的原因如下
service my-service (port 80) is unhealthy in target-group my-target-group due to (reason Health checks failed with these codes: [302]).
而 Http 代码 302 用于执行 URL 重定向。
由于服务本身没有问题,是健康检查失败导致任务停止重启。我更改了健康检查配置以将 200(default) and 302
响应代码视为成功。现在已经修复了。
但不确定这是否是正确的解决方法。