17

如果该实例处于某种处理的中间,我想通过Auto Scaling功能阻止 EC2 实例终止。

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

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

4

5 回答 5

10

更新

正如Ryan Walls (+1) 所指出的,AWS 同时提供了实例保护 来控制 Auto Scaling 是否可以在缩减时终止特定实例(请参阅介绍性博客文章Instance Protection for Auto Scaling了解详情):

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

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

实例保护不会保护 Auto Scaling 实例免于通过 Amazon EC2 控制台、terminate-instances 命令或 TerminateInstances API 手动终止。如果 Auto Scaling 实例未能通过运行状况检查并且必须更换,实例保护不会保护它免于终止。此外,实例保护不会保护 Auto Scaling 组中的 Spot 实例免受中断。

像往常一样,该功能可通过 AWS 管理控制台(菜单 Actions->Instance Protection->Set Scale In Protection)、AWS CLI(set-instance-protection命令)和 API(SetInstanceProtection API 操作)获得。

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


初步答案

此功能目前不适用于Amazon EC2实例的Auto Scaling - 虽然您确实可以为您的 Auto Scaling 组配置 [an] Instance Termination Policy,但可用的策略不包括这样一个(相当高级的)概念:

Auto Scaling 提供以下终止策略选项供您选择。您可以在终止策略中指定其中一个或多个选项。

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

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

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

  • ClosestToNextInstanceHour — 如果您希望终止最接近计费时间的实例,请指定此项。[...]

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

于 2013-07-09T03:00:41.773 回答
10

我刚刚使用相对较新的生命周期挂钩功能成功处理了 Auto Scaling 组中长时间运行的作业的问题。

在我的例子中,尝试选择一个空闲节点来终止的问题是,选择空闲节点的进程将与向节点提交工作的进程竞争。在这种情况下,最好使用可以终止任何节点的策略,但终止会优雅地发生,因此不会丢失任何工作。然后,您可以使用所有标准 Auto Scaling 策略来管理横向扩展和横向扩展。

终止生命周期挂钩允许用户(或进程)在节点被 Auto Scaling 组置于中间状态(标记为 Terminating:Wait)后对其执行操作。然后,用户(或进程)负责通过 AWS API 调用完成生命周期操作,从而导致终止的 EC2 实例关闭。

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

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

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

相关的 AWS 文档在这里:

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

于 2014-11-10T19:21:30.887 回答
6

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

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

于 2016-01-05T04:47:17.603 回答
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/获取-metric-statistics.html

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

于 2014-08-22T16:00:17.337 回答
0

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

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

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

于 2013-12-02T10:27:45.830 回答