【问题标题】:Autoscaling group never successfully launches any instances自动缩放组从未成功启动任何实例
【发布时间】:2016-02-28 02:22:04
【问题描述】:

我有一个启动队列处理实例的自动缩放组。这些实例基于 Windows。通常我们只需要一个,但是当我们的 backlog 变得太大时,我希望能够自动启动更多来处理负载,以便我们的用户有良好的体验。目前,所需节点的数量是手动设置的,但我想在未来通过 cloudwatch 警报自动设置。

当请求一个新实例时,它会从 Chef 下载其配置并成功启动,我通过查看日志知道这一点,显示 Chef 运行成功。它加入其他实例并开始使用队列中的消息。但是,在启动 10 分钟后,由于心跳超时,实例“启动失败”而终止。然后它会尝试启动一个新实例并继续循环。

当实例启动时,它卡在“Pending:Wait”状态。与我的 Web 服务器自动缩放组不同,它永远不会离开此状态,直到稍后终止。这两个实例大致相同,只是它不运行 Web 服务器。

我尝试将运行状况检查宽限期和冷却期调整为 1500 秒,但实例总是在 10 分钟(有时是 11 分钟)内终止。我还尝试将“HealthCheck”和“AddToLoadBalancer”添加到挂起的进程列表中,但这似乎没有效果。

我还尝试过使用 Set-ASInstanceHealth 手动设置实例的运行状况(或 aws autoscaling set-instance-health 了解 CLI 版本的人)。这也没有效果。

我确实有一个由自动缩放组启动的实例,因此它在某一时刻能够启动实例。我认为问题出在心跳问题上,但我不明白是什么发送了它,我找不到任何关于此的文档。

我的猜测是,当实例完成启动并且其上的软件配置正确时,我需要在某处设置一个标志。与 ELB 关联的实例已经具备此功能,因为它们具有正常运行的 Web 服务器,但不侦听任何端口的实例需要额外的东西。这是我能看到的与其他自动缩放组之间的唯一区别。

【问题讨论】:

  • 您的自动缩放实例是否正确处理 CloudWatch 运行状况检查?尝试在 10 分钟内测试相关检查。
  • 什么是 CloudWatch 运行状况检查?请注意,这些实例不运行任何侦听任何端口的服务。 EC2 UI 中的两个运行状况检查通过。
  • 看看下面的链接。我想 AWS 无法确定您的自动扩展实例是否已启动、运行和运行。 docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/…

标签: amazon-web-services autoscaling


【解决方案1】:

2017 年 9 月 17 日更新 - 您现在可以看到 lifecycle hooks in the management console,因此您无需使用下面的 API 调用。

在 AWS 论坛上的一些亚马逊员工的帮助下,我已经成功解决了这个问题。不幸的是,由于当时我不知道根本原因,所以我无法用一些可以帮助某人解决问题的细节来填写问题。

问题是我为自动缩放组定义了两个生命周期挂钩。这些挂钩负责在新实例启动时触发 CodeDeploy 部署。一旦部署成功,钩子就被标记为成功并且实例被移动到“InService”状态。如果钩子从未标记为成功,则自动缩放系统会确定实例启动失败并终止它。

我使用 Powershell API 列出了我的生命周期挂钩:

PS> Get-ASLifecycleHooks -AutoScalingGroupName "Production Background Server";

AutoScalingGroupName  : Production Background Server
DefaultResult         : CONTINUE
GlobalTimeout         : 150000
HeartbeatTimeout      : 1500
LifecycleHookName     : CodeDeploy-managed-automatic-launch-deployment-hook-Production-cdf28f52-84dc-48ca-9c25-xxxxxxxxxxxx
LifecycleTransition   : autoscaling:EC2_INSTANCE_LAUNCHING
NotificationMetadata  : 03ff305d-be5e-48a8-bc85-xxxxxxxxxxxxx
NotificationTargetARN : arn:aws:sqs:eu-west-1:xxxxxxxxxxxxxx:razorbill-eu-west-1-prod-default-autoscaling-lifecycle-hook
RoleARN               : 

AutoScalingGroupName  : Production Background Server
DefaultResult         : CONTINUE
GlobalTimeout         : 150000
HeartbeatTimeout      : 1500
LifecycleHookName     : CodeDeploy-managed-automatic-launch-deployment-hook-Production-f6bda6f3-d4f3-4a73-a6ca-xxxxxxxxxxxxx
LifecycleTransition   : autoscaling:EC2_INSTANCE_LAUNCHING
NotificationMetadata  : 03ff305d-be5e-48a8-bc85-xxxxxxxxxxxx
NotificationTargetARN : arn:aws:sqs:eu-west-1:xxxxxxxxxxxxxx:razorbill-eu-west-1-prod-default-autoscaling-lifecycle-hook
RoleARN               : 

我看到我有两个具有相同通知元数据的挂钩。我认为一个必须是多余的,我删除了一个。我尝试的下一次启动成功了。

我的理论是,因为两个挂钩具有相同的通知元数据,所以不可能将两个挂钩都标记为成功。因此,两者中的一个总是会超时,从而导致心跳超时。

我不知道这个额外的钩子是如何定义的,但我认为这是 CodeDeploy 用户界面中的一个错误。无论如何,我很高兴这个问题现在得到了解决。

【讨论】:

  • 太棒了,这个对我有用!此外,对于使用终端和 AWS CLI 的用户,您可以使用以下内容描述您的 LifeCycle Hooks:aws autoscaling describe-lifecycle-hooks --auto-scaling-group-name "AUTOSCALING-GROUP-NAME" 并使用以下内容删除它们:aws autoscaling delete-lifecycle-hook --lifecycle-hook-name "LIFECYCLE-HOOK-NAME" --auto-scaling-group-name "AUTOSCALING-GROUP-NAME"
猜你喜欢
  • 2012-06-19
  • 2017-03-17
  • 1970-01-01
  • 2019-08-16
  • 2016-05-13
  • 2017-06-07
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多