我希望在SQS队列很短时使用AWS AutoScaling来扩展一组实例。 这些实例做了一些繁重的工作,有时需要5-10分钟才能完成。我希望在实例终止之前完成这项工作。
我知道很多人应该遇到同样的问题。在实际终止实例之前,EC2是否可以处理AWS终止请求并完成所有正在运行的进程?最好的办法是什么?
答案 0 :(得分:4)
您也可以使用Lifecycle hooks。您需要一种远程控制特定工作者的方法,因为AWS将选择一个特定实例进入Terminating:Wait
状态,您需要管理该实例。您可能希望采取以下措施:
AWS将为您处理剩下的事情。
PS。如果您使用celery为您的员工提供电力,那么您可以remotely ask a worker to shutdown gracefully。它不会关闭,除非它完成了它已经开始执行的任务。
答案 1 :(得分:3)
假设您使用的是Linux,您可以创建一个预先附加的AMI,您可以在Auto Scaling组附带的Launch Config中使用它。
在AMI中,您可以将脚本放在/etc/init.d
下/etc/init.d/servicesdown
。该脚本将执行您需要关闭的任何内容,例如/usr/share/services
下的脚本。
这就像要点:
在正常关机时总会执行。
然后在Ubuntu / Debian上说你会做这样的事情把它添加到关机序列中:
/usr/sbin/update-rc.d servicesdown stop 25 0 1 6 .
在CentOS / RedHat上,您可以使用chkconfig
命令将其添加到正确的关闭运行级别。
答案 2 :(得分:1)
据我所知,目前没有选择在正常关闭时终止实例,让进程完成工作。
我建议您查看http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-configure-healthcheck.html。
我们为resque工作者实施它,同时我们将实例移动到不健康的状态,而不是缩小AS。有一个脚本可以在每个实例上不断检查健康状态。一旦实例移动到不健康状态,它将优雅地停止所有服务并向ec2发送终止信号。
希望它对你有所帮助。
答案 3 :(得分:0)
我偶然发现了这个问题,因为我不想终止正在工作的实例。以为我在这里分享我的发现。有两种方法可以看到这个:
如果你的目标是#1,亚马逊新的"实例保护"看起来它的目的是解决这个问题。
请参阅以下链接以获取示例,他们将此代码段作为示例: https://aws.amazon.com/blogs/aws/new-instance-protection-for-auto-scaling/
while (true)
{
SetInstanceProtection(False);
Work = GetNextWorkUnit();
SetInstanceProtection(True);
ProcessWorkUnit(Work);
SetInstanceProtection(False);
}
我自己没有对此进行测试,但我看到API调用与设置保护有关,因此看起来这可以集成到EC2 Worker App代码库中,然后在Scaling In中,实例不应该&#39如果受到保护(目前正在工作),则终止。