我有一个自动缩放组,用于启动队列处理实例。这些实例基于Windows。通常我们只需要一个,但是当我们的积压过大时,我希望能够自动启动更多来处理负载,以便我们的用户获得良好的体验。现在,手动设置了所需节点的数量,但我希望将来使用cloudwatch警报自动完成此操作。
当请求新实例时,它会从Chef下载其配置并成功启动,我通过查看日志来了解这一点,显示成功的Chef运行。它加入其他实例并开始使用队列中的消息。然而,它启动后10分钟,它被终止,因为实例"未能启动"由于心跳超时。然后它尝试启动一个新实例并继续循环。
当实例启动时,它会停留在"待定:等待"州。与我的Web服务器自动扩展组不同,它永远不会离开此状态,直到它稍后终止。这两个实例大致相同,只是这不会运行Web服务器。
我尝试将健康状况检查宽限期和冷却时间调整为1500秒,但实例总是在10分钟内(有时是11分钟)终止。我也尝试添加" HealthCheck"和" AddToLoadBalancer"到暂停进程列表但这似乎没有效果。
我还尝试使用Set-ASInstanceHealth手动设置实例的运行状况(对于知道CLI版本的用户,我尝试aws autoscaling set-instance-health
)。这也没有效果。
我确实有一个由自动扩展组启动的实例,所以不知何故它只能在一个点上启动实例。我认为问题在于心跳问题,但我不明白是什么发送它,我找不到任何关于此的文档。
我的猜测是,当某个实例完成启动并且其上的软件配置正确时,我需要设置一个标志。与ELB关联的实例已经具有此功能,因为它们具有正常运行的Web服务器,但是不在任何端口上侦听的实例需要额外的内容。这是我和其他自动缩放组之间唯一的区别。
答案 0 :(得分:6)
2017年9月17日更新 - 您现在可以看到lifecycle hooks in the management console,因此如果您不想,则不需要使用以下API调用。
我已经在AWS论坛上的一些亚马逊员工的帮助下成功解决了这个问题。不幸的是,由于我当时并不知道根本原因,我无法用一些可以帮助某人解决问题的细节来填补这个问题。
问题是我为自动缩放组定义了两个生命周期钩子。这些挂钩负责在新实例启动时触发CodeDeploy部署。部署成功后,钩子被标记为成功,实例将移动到" InService"州。如果钩子从未标记为成功,则自动调节系统会确定实例无法启动并终止它。
我使用Powershell API列出了我的生命周期钩子:
username
我看到我有两个具有相同通知元数据的钩子。我认为一个必须是多余的,我删除了一个。我试图成功的下一次发射。
我的理论是,因为两个钩子都有相同的通知元数据,所以两个钩子都不可能被标记为成功。因此,两者中的一个总是超时,导致心跳超时。
我不知道如何定义这个额外的钩子,但我认为这是CodeDeploy用户界面中的一个错误。无论如何,我很高兴这个问题现在已经解决了。