自动缩放组从未成功启动任何实例

Autoscaling group never successfully launches any instances

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

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

当实例启动时,它停留在 "Pending:Wait" 状态。不像我的网络服务器自动缩放组,它永远不会离开这个状态,直到它稍后被终止。这两个实例大致相同,只是这不是 运行 网络服务器。

我尝试将健康检查宽限期和冷却时间调整为 1500 秒,但实例总是在 10 分钟(有时是 11 分钟)内终止。我还尝试将 "HealthCheck" 和 "AddToLoadBalancer" 添加到暂停进程列表中,但这似乎没有效果。

我也尝试过使用 Set-ASInstanceHealth 手动设置实例的健康状况(对于了解 CLI 版本的人来说 aws autoscaling set-instance-health)。这也没有效果。

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

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

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 用户界面中的一个错误。无论如何,我很高兴这个问题现在已经解决了。