AWS AutoScaling,缩减 - 等待进程终止

时间:2013-12-09 11:02:04

标签: amazon-web-services amazon-ec2 amazon-sqs autoscaling amazon-sns

我希望在SQS队列很短时使用AWS AutoScaling来扩展一组实例。 这些实例做了一些繁重的工作,有时需要5-10分钟才能完成。我希望在实例终止之前完成这项工作。

我知道很多人应该遇到同样的问题。在实际终止实例之前,EC2是否可以处理AWS终止请求并完成所有正在运行的进程?最好的办法是什么?

4 个答案:

答案 0 :(得分:4)

您也可以使用Lifecycle hooks。您需要一种远程控制特定工作者的方法,因为AWS将选择一个特定实例进入Terminating:Wait状态,您需要管理该实例。您可能希望采取以下措施:

  1. 指示在实例上运行的工作进程不再接受任何工作。
  2. 等待工人完成已处理的工作
  3. 致电complete-lifecycle行动。
  4. 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下的脚本。

这就像要点:

servicesdown

在正常关机时总会执行。

然后在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. 我需要终止一名工作人员,但我只想终止一名工作
  2. 的工作人员
  3. 我需要终止一个特定的工作人员,我希望那个特定的工作人员等到完成这项工作。
  4. 如果你的目标是#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如果受到保护(目前正在工作),则终止。

    http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/autoscaling/AmazonAutoScaling.html