首页 文章

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

提问于
浏览
13

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

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

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

5 回答

  • 9

    更新

    作为noted by Ryan Walls(1),AWS同时提供Instance Protection来控制Auto Scaling是否可以在扩展时终止特定实例(请参阅介绍性博客文章Instance Protection for Auto Scaling以获取详细信息):

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

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

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

    像往常一样,该功能可通过AWS管理控制台(菜单操作 - >实例保护 - >设置保护范围)),AWS CLI(set-instance-protection命令)和API(SetInstanceProtection API操作)获得 .

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


    初步答复

    此功能目前不适用于Auto Scaling Amazon EC2实例 - 虽然您确实能够Configure [an] Instance Termination Policy for Your Auto Scaling Groupavailable policies不包含这样(相当高级)的概念:

    Auto Scaling提供以下终止策略选项供您选择 . 您可以在终止策略中指定一个或多个这些选项 . OldestInstance - 如果希望终止Auto Scaling组中最旧的实例,请指定此项 . [...] NewestInstance - 如果要终止上次启动的实例,请指定此项 . [...] OldestLaunchConfiguration - 如果希望终止使用最早的启动配置启动的实例,请指定此项 . [...] ClosestToNextInstanceHour - 如果希望终止最接近完成计费小时的实例,请指定此项 . [...]默认 - 如果您希望Auto Scaling使用默认终止策略来选择终止实例,请指定此项 .

  • 0

    我刚刚使用相对较新的生命周期钩子功能成功处理了自动缩放组中长时间运行的作业问题 .

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

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

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

    • 创建一个允许自动缩放以将消息发布到SQS队列的角色 .

    • 为终止消息创建SQS队列 .

    • 创建在每个节点中作为服务运行的监视器脚本 . 我的脚本是一个简单的事件驱动状态机,它按顺序从MONITORING(轮询SQS以获取节点的终止消息)转换为DRAINING(轮询作业队列,直到节点上没有工作)到TERMINATED(进行完整生命周期调用) .

    • 事件驱动的AWS自动缩放的标准配置;也就是说,创建CloudWatch警报以及用于扩展和向外扩展的自动扩展策略 .

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

    相关的AWS文档在此处:

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

  • 9

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

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

  • 6

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

    • 禁用自动缩放组上的缩小策略 .

    • 使用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

  • 2

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

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

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

相关问题