如何通过Auto Scaling阻止EC2实例终止?

时间:2013-07-08 12:25:41

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

如果该实例处于某种处理阶段,我想阻止Auto Scaling功能终止EC2实例。

背景:
假设我有一个Auto Scaling组,目前有5个实例正在运行。 我创建一个平均CPU使用率的警报... 假设其中4个实例处于空闲状态,而其中一个正在进行一些繁重的处理...... 平均CPU负载将触发警报,因此缩小策略将执行。

如何让Auto Scaling终止其中一个空闲实例而不是处理中间的实例?

5 个答案:

答案 0 :(得分:9)

更新

作为noted by Ryan Walls(+1),AWS同时提供Instance Protection 来控制Auto Scaling是否可以在中进行扩展时终止特定实例(请参阅介绍性博客文章{{ 3}}用于散步):

  

您可以在Auto Scaling上启用实例保护设置   组或单个Auto Scaling实例。当Auto Scaling时   启动实例,实例继承实例保护   Auto Scaling组的设置。 [...]

值得注意的是,此实例保护仅适用于事件中的常规Auto Scaling比例:

  

实例保护不保护Auto Scaling实例   通过Amazon EC2控制台手动终止   terminate-instances命令或TerminateInstances API。例   保护不会保护Auto Scaling实例不被终止   如果健康检查失败,必须更换。还有,实例   保护不保护Auto Scaling组中的Spot实例   从中断。

通常,该功能可通过AWS管理控制台(菜单操作 - >实例保护 - >设置保护范围)),AWS CLI(Instance Protection for Auto Scaling命令)和API({ {3}} API动作)。

后两个选项允许手头的场景自动化,即需要在运行“繁重处理”作业之前启用实例保护,并在完成后禁用实例保护,以便实例再次符合终止条件。 / p>


初步答复

set-instance-protectionSetInstanceProtection个实例目前无法使用此功能 - 虽然您确实能够Auto Scaling,但Amazon EC2不包含此类(相当高级)概念:

  

Auto Scaling为您提供以下终止策略选项   从中选择。您可以在自己的中指定一个或多个选项   终止政策。

     
      
  • OldestInstance - 如果希望终止Auto Scaling组中最旧的实例,请指定此项。 [...]

  •   
  • NewestInstance - 如果您希望终止上次启动的实例,请指定此项。 [...]

  •   
  • OldestLaunchConfiguration - 如果您希望使用最早的启动配置启动实例,请指定此项   终止。 [...]

  •   
  • ClosestToNextInstanceHour - 如果您希望距离完成结算时间最近的实例,请指定此项   终止。 [...]

  •   
  • 默认 - 如果您希望Auto Scaling使用默认终止策略选择要终止的实例,请指定此项。

  •   

答案 1 :(得分:9)

我刚刚使用相对较新的生命周期挂钩功能成功解决了自动扩展组中长时间运行的作业问题。

在我的情况下,尝试选择空闲节点终止的问题是,选择空闲节点的进程将与提交节点工作的进程竞争。在这种情况下,最好使用可以终止任何节点的策略,但终止正常,这样就不会丢失任何工作。然后,您可以使用所有标准自动缩放策略来管理扩展和扩展。

终止生命周期钩子允许用户(或进程)在自动扩展组进入中间状态(标记为终止:等待)后对节点执行操作。然后,用户(或进程)负责通过AWS API调用完成生命周期操作,从而导致关闭已终止的EC2实例。

简而言之,我设置它的方式是:

  • 创建一个允许自动缩放以将消息发布到SQS队列的角色。
  • 为终止消息创建SQS队列。
  • 创建一个在每个节点中作为服务运行的监视器脚本。我的脚本是一个简单的事件驱动状态机,它按顺序从MONITORING(轮询SQS以获取节点的终止消息)转换为DRAINING(轮询作业队列直到节点上没有工作)到TERMINATED(完成) -lifecycle call)。
  • 事件驱动的AWS自动缩放的标准配置;也就是说,创建CloudWatch警报,以及用于扩展和向外扩展的自动扩展策略。

这种方法的一个障碍是SDK中尚未支持生命周期钩子管理(至少,它不支持它AFAIK),也没有Cloud Formation资源钩子。

相关的AWS文档在此处:

http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AutoScalingGroupLifecycle.html

答案 2 :(得分:6)

亚马逊终于以更简单的方式解决了这个问题。现在有"实例保护"您可以将实例标记为受保护,并且在"""中缩放时不会终止它。

请参阅https://aws.amazon.com/blogs/aws/new-instance-protection-for-auto-scaling

答案 3 :(得分:2)

aws-cli是你最好的朋友..

  1. 在自动缩放组上禁用缩小规则。

  2. 使用aws-cli创建一个cron作业或计划任务:

    2a上。获取与自动缩放组关联的EC2实例 http://docs.aws.amazon.com/cli/latest/reference/autoscaling/describe-auto-scaling-instances.html

    2B。接下来监视EC2实例上的cloudwatch统计信息 http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/US_SingleMetricPerInstance.html http://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html

    2c中。终止自动扩展组中的空闲EC2实例 http://docs.aws.amazon.com/cli/latest/reference/autoscaling/terminate-instance-in-auto-scaling-group.html

答案 4 :(得分:0)

您可以使用Amazon CloudWatch实现此目的: http://aws.typepad.com/aws/2013/01/amazon-cloudwatch-alarm-actions.html。来自文章:

  

您可以使用类似的策略来摆脱负责处理计算密集型批处理的实例。一旦CPU进入空闲状态并完成工作,终止实例并节省一些钱!

在这种情况下,由于您将处理终止,因此您需要删除缩小规则。另请参阅另一个选项:https://stackoverflow.com/a/19628453/432849