AWS ECS 错误:目标组中的任务 ELB 运行状况检查失败

AWS ECS error: Task failed ELB health checks in Target group

提问人:user2315104 提问时间:2/3/2019 最后编辑:MLavoieuser2315104 更新时间:9/22/2023 访问量:96328

问:

我正在使用云形成模板来构建基础设施(ECS fargate 集群)。 模板已成功执行,堆栈已成功创建。但是,任务失败,出现以下错误:

Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:eu-central-1:890543041640:targetgroup/prc-service-devTargetGroup/97e3566c8b307abf)

我不明白在哪里寻找这个来解决问题。 由于它是 fargate 集群,我不明白如何登录容器并执行一些运行状况检查查询以进一步调试。

有人可以帮我进一步指导并帮助我吗? 由于此错误,我甚至无法访问我的 Web 应用程序。如果流量不正常,则不会路由流量。ALB

我做了什么

经过一番谷歌搜索,我找到了这个帖子: https://aws.amazon.com/premiumsupport/knowledge-center/troubleshoot-unhealthy-checks-ecs/

但是,我想,这与 fargate 中的 EC2 兼容性有关。但就我而言,EC2 不存在。

如果您愿意,我也可以粘贴整个模板。

请帮忙

亚马逊网络服务 aws-fargate aws-alb

评论

0赞 user2315104 2/4/2019
请提出建议。卡在这里
2赞 Romeo Sierra 11/17/2021
这些类型的问题实际上很棒,因为服务的未记录(大多数时候一开始是无法记录的)方面被很好地记录在案......
0赞 Sigex 1/22/2022
“”>我不明白如何登录容器并执行一些运行状况检查查询以进一步调试。古玩,如果可以的话,你会做什么检查?我在 EC2 atm 上运行,遇到同样的错误。留下了一个 CF 模板,在一个 AWS 账户上设置了应用程序,但我正在尝试将生产应用程序拆分到它自己的 AWS 账户中,并且服务一直在重启。IAM 角色执行角色、任务角色、任务定义容器镜像都是一样的。“任务失败 ELB 运行状况检查 (target-group arn:aws:elasticloadbalancing:eu-west-2:***:targetgroup/stage-quotation/***)”

答:

39赞 user2315104 2/6/2019 #1

此问题已解决。 这是以下几点的问题:

  • Docker 容器端口与主机端口的映射不正确
  • ALB 运行状况检查间隔时间非常短。因此,ALB 立即放弃了,没有等待 docker 容器启动并正常运行。

进行这些更改后,它工作正常

评论

4赞 AlexanderF 4/6/2019
很高兴知道您的问题已解决;但是,您自己的问题是,当运行状况检查失败并且链接中没有太多内容时,如何调试。您是否有机会找到任何访问 docker 日志的方法,例如 aws 在 EB 上?如果您用您拥有的任何新信息更新您的答案,那就太好了。谢谢。
2赞 ozooxo 5/21/2019
如果您通过 ECS 进行部署,则在 AWS 控制台中,集群>任务中提供了一些信息。选择已停止的任务,您可能会看到错误消息。可能类似于“由于(请求超时原因)原因,服务...-service(实例10.0.0.29)(端口8080)在目标组...-service中不正常”。
37赞 E. Muuli 6/4/2019
您能否详细说明“Docker 容器端口与主机端口的映射不正确”?到底出了什么问题,你在哪里以及如何解决它?
4赞 Romeo Sierra 11/17/2021
+1 ALB 健康检查间隔时间很短是我的收获。我见过一些只设置了 60 秒的东西,由于要设置许多 Kafka 主题等,完成启动需要更长的时间。
0赞 Oshada 8/27/2022
我遇到了同样的问题,并且能够通过增加间隔时间来解决问题。
3赞 Ryan Forte 11/2/2019 #2

我遇到了完全相同的问题。我能够通过以下方式解决这个问题:

  1. 导航到 EC2 服务
  2. ,然后在侧面板中选择目标组
  3. 为负载均衡器选择目标组
  4. 选择“运行状况检查”选项卡
  5. 确保您的 EC2 实例的运行状况检查与目标组中的运行状况检查相同。这将告知您的 ELB 在执行运行状况检查时将其流量路由到此终端节点。就我而言,我的运行状况检查路径是/health。
5赞 tschumann 11/13/2019 #3

我收到此错误消息是因为 ECS 服务和负载均衡器目标组之间的安全组仅允许 HTTP 和 HTTPS 流量。

显然,运行状况检查发生在其他端口和/或协议上,因为更新安全组以允许所有端口上的所有流量(如 https://docs.aws.amazon.com/AmazonECS/latest/userguide/create-application-load-balancer.html 中建议的那样)使运行状况检查起作用。

评论

0赞 jones-chris 1/7/2020
我必须将 ECS 中运行应用程序的端口添加到安全组。
0赞 Meraj al Maksud 7/13/2021
我只在 https 上配置了 elb 运行状况检查。因此,我不得不分配更多资源来运行我的应用程序。 但是当我将配置更改为 http 时,我可以用更少的资源运行。
1赞 bruce szalwinski 11/20/2019 #4

如上所述,检查 ECS 集群周围的安全组。如果使用 Terraform,请使用如下所示的内容允许进入所有 docker 临时端口:

resource "aws_security_group" "ecs_sg" {
  name    = "ecs_security_group"
  vpc_id  = "${data.aws_vpc.vpc.id}"

}

resource "aws_security_group_rule" "ingress_docker_ports" {
  type              = "ingress"
  from_port         = 32768
  to_port           = 61000
  protocol          = "-1"
  cidr_blocks       = ["${data.aws_vpc.vpc.cidr_block}"]
  security_group_id = "${aws_security_group.ecs_sg.id}"
}

评论

0赞 Gurpreet 12/4/2023
谢谢,你的回答有帮助。我还试图重新确认临时端口范围。根据 docs.aws.amazon.com/AmazonECS/latest/APIReference/...,在我的实例上读取 /proc/sys/net/ipv4/ip_local_port_range 文件时,它是 32768 到 60999。我仍然不知道这些端口是由哪些因素决定的。如果我更改实例的 AMI,它们会改变吗?但是,最好在设置入口规则之前进行检查。
19赞 Rene B. 12/2/2019 #5

此问题有很多不同的原因,而不仅仅是开放端口:

  • ecsServiceRole IAM 角色的 IAM 权限不正确
  • 容器实例安全组 Elastic Load Balancing 负载
  • 未为所有可用区弹性负载配置平衡器
  • 平衡负载均衡器运行状况检查配置错误
  • 无法更新服务 servicename:任务定义中更改了负载均衡器容器名称或端口

因此,AWS创建了自己的网站,以解决此错误的可能性:

https://docs.aws.amazon.com/en_en/AmazonECS/latest/developerguide/troubleshoot-service-load-balancers.html

编辑:就我而言,我的应用程序的运行状况检查代码不同。默认值为 200,但您也可以添加一个范围,例如 200-499。

0赞 James 5/19/2021 #6

可能对某人有帮助。我们的目标组运行状况检查路径设置为 ,对于我们的服务来说,它指向 Swagger 并且运行良好。更新为使用 Springfox 而不是手动生成 swagger.json 后,现在执行 302 重定向到 ,这导致运行状况检查失败。由于这是针对 Spring Boot 服务的,因此我们只需将目标组中的运行状况检查路径指向(OOTB Spring 状态页面)。///swagger-ui.html/health

9赞 nacholibre 7/29/2021 #7

让我分享我的经验。

就我而言,一切都是正确的,除了服务器侦听的主机之外,这使得服务器无法从外部世界访问,并且健康检查不起作用。在某些库中,它应该是空的。localhost0.0.0.0

1赞 iravinandan 2/24/2022 #8

就我而言,ECS Fargate 将 docker 容器功能编排为服务,而不是 Web 应用程序或 API。该服务是不侦听任何端口(例如:Schedule corn/ActiveMQ message consumer ...等)。

换句话说,它是一个客户端,而不是一个服务器节点。所以我只听localhost进行健康检查......

我在目标组中添加了运行状况检查路径 -

enter image description here

在 index.ts 中的代码下面 -

import express from 'express';

const app = express();
const port = process.env.PORT || 8080;

//Health Check

app.get('/__health', (_, res) => res.send({ ok: 'yes' }));
app.listen(port, () => {
  logger.info(`Health Check: Listening at http://localhost:${port}`);
});
0赞 Anthony Sychev 7/4/2022 #9

解决方案在响应“iravinandan”时部分正确,但在nodejs路由器的最后一部分,只需简单地添加即可。或者,您可以单击页面末尾的“高级”选项卡设置您的个人状态。status(200)

app.get('/__health', (request, response) => response.status(200).end(""));

enter image description here

更多信息请见:请在此处输入链接描述

问候

1赞 M. Gleria 7/29/2022 #10

我的案例是在 FARGATE 模式下运行的 React 应用程序。

第一个问题是 Docker 镜像是在 NodeJS 上构建的,它使用以下命令“服务”它:

CMD npm run start # react-scripts start

除此之外,这根本不是一个好的做法,它需要大量资源(4GB和2vCPU是不够的),因此,检查失败了。(本文提到这是一个可能的原因)

为了解决前面的问题,我们将镜像修改为多阶段构建,构建阶段使用 NodeJS 提供内容,NGINX 提供内容。在本地运行良好,但我们尚未意识到 NGINX 的默认端口为 80,并且您不能在具有 awsvpc 网络模式的 FARGATE 上使用不同的主机和容器端口。

为了解决这个问题,我启动了一个具有正确安全组的 EC2 实例,以在负载均衡器无法执行运行状况检查的同一端口上与 FARGATE 目标连接。我能够对其他目标执行 curl 的命令,但是对于这个不健康的目标(不断被回收),我收到了即时的 Connection 拒绝响应。这不是超时,它告诉我目标无法管理该请求,因为它没有侦听该端口。然后我意识到我的容器需要端口 80 上的流量,并且我的应用程序配置为在 3xxx 端口上工作。

这里的解决方案是修改 NGINX 的默认配置以侦听我们想要的端口,重新构建映像并重新启动服务。

-1赞 Keval Gangani 7/29/2022 #11

就我而言,我的 ECS Fargate 服务不需要负载均衡器,因此我删除了“负载均衡器”和“安全组”,然后它就可以工作了。

0赞 M. Osama 8/26/2022 #12

我在作为 fargate 运行的 ACS 上部署 java springboot 应用程序时遇到了同样的问题。我必须解决 3 个问题才能解决问题,如果这可以帮助其他人的话。

  1. 容器在端口 8080 上运行(因为 tomcat),因此 ELB、目标组和两个安全组(一个使用 ELB,一个使用 ECS)必须在其入站规则中允许 8080。此外,还必须修改任务设置,以将容器更改为映射到 8080。

  2. 目标组运行状况检查部分的端口(高级设置)必须显式更改为 8080,而不是默认的 80。

  3. 我不得不在应用程序中创建一个虚拟的运行状况检查路径,因为在“/”处ping应用程序的根目录会导致 302 错误代码。

希望这会有所帮助。

0赞 Kedar Parsewar 9/24/2022 #13

我在使用 AWS Fargate 时也遇到了同样的问题。

以下是一些可以尝试的解决方案:

  1. 首先检查“附加”的“服务”的安全组,该组具有“出站”和“入站”规则。
  2. 如果您使用的是 Loadbalancer 并指向目标组,则必须在安全组上启用 docker 容器端口,并附加仅来自 ALB 安全组的入站流量 3)还要检查我们分配给目标组的运行状况检查端点是否有任何依赖项,它应该只返回 200 个状态回复/我们在目标组中指定的内容
0赞 Kirill G. 1/11/2023 #14

就我而言,这是一个安全组规则,仅允许来自某个 IP 的连接,这阻止了来自 LB 的运行状况检查。我将 VPC 的 cidr 作为另一条规则添加到安全组中,然后它起作用了。

0赞 muku 3/1/2023 #15

我浏览了 aws 提供的博客,我的修复是在 LB w.r.t 中错误地配置了 ping 路径。

https://docs.aws.amazon.com/AmazonECS/latest/userguide/troubleshoot-service-load-balancers.html

https://aws.amazon.com/premiumsupport/knowledge-center/ecs-fargate-health-check-failures/

1赞 Satish Mali 4/18/2023 #16

ECS的一些可能解决方案

  1. 验证安全组入站端口是否允许 ECS 实例流量。
  2. 验证容器网络和端口映射。
  3. 验证目标组运行状况检查终结点。它应该是正确的,并给出 200 状态。

评论

1赞 Rafael Matsumoto 5/4/2023
此外,请验证负载均衡器安全组是否允许出站流量,否则它将无法命中目标实例进行运行状况检查
0赞 Veronica CDF 9/22/2023 #17

如果您使用 cloudformation 使用管道创建,我建议在您的模板中添加 2 个参数。例:

[第一步] 类型:AWS::ECS::Service 性能: HealthCheckGracePeriodSeconds:60

[第二步] 目标组: 类型:AWS::ElasticLoadBalancing::TargetGroup 性能: 港口:!引用 ListenerContainerPort 协议:TCP VpcId:!参考VPCID 目标类型:ip HealthCheckTimeoutSeconds:40 HealthCheckIntervalSeconds:100

当部署成功完成并且任务停止错误时。

评论

0赞 Community 10/4/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。