41

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

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

我没有得到什么和在哪里寻找这个来解决问题。因为它是 Fargate 集群,所以我不知道如何登录容器并执行一些健康检查查询以进一步调试。

有人可以帮助我进一步指导并帮助我吗?由于这个错误,我什至无法访问我的网络应用程序。如果ALB流量不健康,则不会路由流量。

我做了什么

经过一番谷歌搜索,我发现了这篇文章: https ://aws.amazon.com/premiumsupport/knowledge-center/troubleshoot-unhealthy-checks-ecs/

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

如果你觉得,我也可以粘贴整个模板。

请帮忙

4

8 回答 8

23

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

  • Docker 容器端口与主机端口的映射不正确
  • ALB 健康检查间隔时间很短。因此,ALB 立即放弃,而不是等待 docker 容器启动并正常运行。

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

于 2019-02-06T12:13:04.513 回答
11

这个问题有很多不同的可能原因,不仅仅是开放的端口:

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

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

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

编辑:在我的情况下,我的应用程序的健康检查代码是不同的。默认值为 200,但您也可以添加一个范围,例如 200-499。

于 2019-12-02T10:13:39.650 回答
4

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

显然,健康检查发生在其他一些端口和/或协议上,因为更新安全组以允许所有端口上的所有流量(如https://docs.aws.amazon.com/AmazonECS/latest/userguide/create-application- load-balancer.html)使健康检查工作。

于 2019-11-13T06:48:37.997 回答
2

让我分享一下我的经验。

在我的情况下,一切都是正确的,除了服务器侦听的主机之外,localhost这使得服务器无法从外部世界访问,并且健康检查分别不起作用。在某些库中它应该是0.0.0.0或空的。

于 2021-07-29T14:57:49.697 回答
2

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

  1. 导航到 EC2 服务
  2. 然后在侧面板中选择目标组
  3. 为负载均衡器选择目标组
  4. 选择健康检查选项卡
  5. 确保您的 EC2 实例的运行状况检查与目标组中的运行状况检查相同。这将告诉您的 ELB 在进行健康检查时将其流量路由到此端点。就我而言,我的健康检查路径是 /health。
于 2019-11-02T05:02:34.117 回答
0

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

于 2021-05-18T19:31:03.053 回答
0

正如上面tschumann所说,检查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}"
}
于 2019-11-19T21:22:10.233 回答
0

就我而言,ECS Fargate 将 Docker 容器功能编排为服务,而不是 Web 应用程序或 API。该服务没有监听任何端口(例如:调度corn/ActiveMQ消息消费者......等)。

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

我在目标组中添加的所有健康检查路径到 -

在此处输入图像描述

下面是 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}`);
});
于 2022-02-24T05:09:22.243 回答