当 SQS 队列较短时,我想使用 AWS AutoScaling 缩减一组实例。这些实例会做一些繁重的工作,有时需要 5-10 分钟才能完成。我希望在实例终止之前完成这项工作。
我知道很多人应该面临同样的问题。EC2 是否可以在实例实际终止之前处理 AWS 终止请求并完成我所有正在运行的进程?最好的方法是什么?
当 SQS 队列较短时,我想使用 AWS AutoScaling 缩减一组实例。这些实例会做一些繁重的工作,有时需要 5-10 分钟才能完成。我希望在实例终止之前完成这项工作。
我知道很多人应该面临同样的问题。EC2 是否可以在实例实际终止之前处理 AWS 终止请求并完成我所有正在运行的进程?最好的方法是什么?
你也可以使用Lifecycle hooks。您需要一种远程控制特定工作人员的方法,因为 AWS 会选择一个特定的实例来设置Terminating:Wait
状态,而您需要管理该实例。您需要采取以下措施:
AWS 将为您处理剩下的事情。
附言。如果您使用celery为您的工作人员供电,那么您可以远程要求工作人员正常关机。除非它完成已开始执行的任务,否则它不会关闭。
假设您使用的是 linux,您可以创建一个预烘焙 AMI,您可以在附加到 Auto Scaling 组的启动配置中使用该 AMI。
在 AMI 中,您可以在/etc/init.d
say下放置一个脚本/etc/init.d/servicesdown
。该脚本将执行您需要关闭的任何内容,/usr/share/services
例如下面的脚本。
这里有点像要点:
在进行正常关机时,它总是会被执行。
然后在 Ubuntu/Debian 上说你会做这样的事情来将它添加到你的关机序列中:
/usr/sbin/update-rc.d servicesdown stop 25 0 1 6 .
在 CentOS/RedHat 上,您可以使用chkconfig
命令将其添加到正确的关闭运行级别。
我偶然发现了这个问题,因为我不想终止正在工作的实例。以为我会在这里分享我的发现。不过,有两种方法可以查看:
如果你的目标是#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 代码库中,然后在扩展时,如果实例不应该被终止受保护(当前工作)。
据我所知,目前没有选项可以在正常关闭时终止实例并让进程完成工作。
我建议您查看http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-configure-healthcheck.html。
当我们将实例移动到不健康状态而不是缩小 AS 时,我们为 resque 工作人员实现了它。有一个脚本可以不断检查每个实例的健康状态。一旦实例进入不健康状态,它就会优雅地停止所有服务并向 ec2 发送终止信号。
希望它可以帮助你。