【问题标题】:AWS ECS error: Task failed ELB health checks in Target groupAWS ECS 错误:任务在目标组中未通过 ELB 运行状况检查
【发布时间】:2019-06-27 10:32:24
【问题描述】:

我正在使用云形成模板来构建基础架构(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 不存在。

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

请帮忙

【问题讨论】:

  • 请建议。卡在这里
  • 这些类型的问题实际上很棒,因为服务的未记录(大多数情况下开始时无法记录)方面都得到了很好的记录......

标签: amazon-web-services aws-fargate aws-alb


【解决方案1】:

已解决。 问题在于以下几点:

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

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

【讨论】:

  • 很高兴知道您的问题已解决;但是,您自己的问题是如何在运行状况检查失败并且链接中没有太多内容时进行调试。例如,您有没有发现任何访问​​ docker 日志的方法,例如 EB 上的 aws?如果您使用您拥有的任何新信息更新您的答案,那就太好了。谢谢。
  • 如果您通过 ECS 部署,在 AWS 控制台中,集群 > 任务中有一些信息。选择您可能会看到错误消息的已停止任务。可能类似于“服务 ...-服务(实例 10.0.0.29)(端口 8080)由于(原因请求超时)在目标组 ...-服务中不健康”。
  • 您能否详细说明“Docker 容器端口与主机端口的映射不正确”?究竟出了什么问题,您是在哪里以及如何解决的?
  • +1 ALB 健康检查间隔时间很短是我的收获。我见过一些只设置了 60 秒的东西,由于要设置许多 Kafka 主题等,这需要更长的时间才能完成启动。
【解决方案2】:

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

  • 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。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我必须将应用在 ECS 中运行的端口添加到安全组。
    • 我只在 https 上配置了 elb 健康检查。所以我不得不分配更多资源来运行我的应用程序。但是当我将配置更改为 http 时,我可以用更少的资源运行。
    【解决方案4】:

    我遇到了同样的问题。我能够通过以下方式解决此问题:

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

    【讨论】:

      【解决方案5】:

      让我分享一下我的经验。

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

      【讨论】:

      • 这个答案应该有更多的赞成票。拯救了这一天!
      【解决方案6】:

      如上面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}"
      }
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2021-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-20
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          • 2020-11-25
          相关资源
          最近更新 更多