为什么 Amazon EC2 Auto Scaling 会终止实例?

上次更新日期:2021 年 2 月 23 日

我的 Amazon Elastic Compute Cloud (Amazon EC2) Auto Scaling 组终止了实例。但在 Amazon EC2 控制台上看不到终止原因。我该如何了解 Amazon EC2 Auto Scaling 终止实例的原因?

简短描述

Amazon EC2 Auto Scaling 依靠 Amazon EC2 或 Elastic Load Balancing (ELB) 运行状况检查来确定实例的运行状况。Auto Scaling 组的所有扩展操作(包括运行状况检查替换),都可在 Amazon EC2 控制台的“活动历史记录”视图中查看。

解决方法

在“活动历史记录”视图中根据实例描述来确定后续步骤。

在继续操作之前,请查找实例终止的描述和原因:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格的 Auto Scaling 下,选择 Auto Scaling 组。然后,选择该实例的组。
  3. 选择活动历史记录视图,随后选择实例终止事件。
  4. 请注意实例终止事件的描述原因

请参考以下描述示例,了解实例终止的可能原因:

“由于 EC2 运行状况检查显示它已终止或停止,实例已停止服务”

使用 Amazon CloudWatch 指标查找实例或系统检查故障:

  1. 打开 Amazon CloudWatch 控制台
  2. 在导航窗格中,选择指标,然后选择所有指标视图。
  3. 在指标窗格中选择 EC2,随后选择每个实例的指标
  4. 键入 instance-id,然后选择 StatusCheckFailed_InstanceStatusCheckFailed_SystemStatusCheckFailed 查看指标图。

Amazon EC2 Auto Scaling 会终止已停止和已重启的实例。查看 AWS CloudTrail 历史记录,确定用户是否手动停止或重启了实例:

  1. 打开 AWS CloudTrail 控制台
  2. 在导航窗格中,选择事件历史记录
  3. 查看 TerminateInstancesStopInstancesRebootInstances API 调用的历史记录。

当发生以下情况之一时,Amazon EC2 Auto Scaling 会终止 Spot 实例:

  • 容量不再可用
  • Spot 价格超过了您为实例指定的最高价格

“活动历史记录”可能会显示,由于运行状况检查,实例已从服务中移除。要验证终止原因,检查 Spot 请求状态:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格的实例下,选择 Spot 请求
  3. 选择 Spot 请求,接着选择描述视图,然后记下

如果 Auto Scaling 组的运行状况检查类型设置为 ELB,则 Amazon EC2 Auto Scaling 会执行 ELB 和 EC2 两项运行状况检查。然后,该服务会终止未能通过这两项运行状况检查中任何一项检查的实例。要了解实例被终止的原因:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格的 Auto Scaling 下,选择 Auto Scaling 组,然后选择该实例所在的组。
  3. 选择详细信息视图,注意运行状况检查类型

“由于 ELB 系统运行状况检查失败,实例已停止服务”

如果多个负载均衡器连接到 Auto Scaling 组,则所有负载均衡器都必须报告实例运行状况良好,Amazon EC2 Auto Scaling 才会将该实例视为运行状况良好。

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格的负载平衡下,选择负载均衡器,然后选择监控
  3. 选择运行状况良好的主机数指标图,确认实例未能通过运行状况检查。
  4. 在导航窗格的 Auto Scaling 下,选择 Auto Scaling 组
  5. 选择该实例的组,然后选择详细信息视图。
  6. 注意负载均衡器目标组下是否连接了多个负载均衡器。

查看 CloudTrail 历史记录,确定暂停的进程是否已将运行状况不佳的实例的终止时间延迟到进程恢复:

  1. 打开 AWS CloudTrail 控制台
  2. 在导航窗格中,选择事件历史记录
  3. 查看 SuspendProcessesResumeProcesses API 调用的历史记录。

“由于用户运行状况检查的原因,实例已停止服务”

您可以在 Amazon EC2 Auto Scaling 中定义自定义运行状况检查。如果自定义运行状况检查确定实例运行状况不佳,则检查会手动触发 SetInstanceHealth,随后将实例的状态设置为运行状况不佳。如果实例运行状况不佳,Amazon EC2 Auto Scaling 会在其下次运行时将其终止。

“启动了一个实例以帮助平衡该组的可用区”“启动了多个实例以平衡 us-east-1a 可用区与其他可用区内的实例”

默认情况下,Amazon EC2 Auto Scaling 会在所有可用区之间平衡实例。当您将新的可用区添加到某个 Auto Scaling 组时,Amazon EC2 Auto Scaling 会在该可用区启动一个新的实例,然后重新平衡操作可能会终止其他可用区内的实例。

“在 2018-02-12T13:48:46Z,一个状态为 ALARM 的监视器警报 XXX-High-CPU-Utilization 触发了 AAA-scaledown,将理想容量从 2 改为 1”

Amazon EC2 Auto Scaling 可以终止组中的实例,以响应已配置的 CloudWatch 警报。查看组策略和 CloudWatch 警报历史记录:

查看 Auto Scaling 组策略的方法如下:

  1. 打开 Amazon EC2 控制台
  2. 导航窗格的 Auto Scaling 下,选择 Auto Scaling 组
  3. 选择实例的组。
  4. 选择扩展策略窗格,查看并编辑策略。

查看 CloudWatch 警报历史记录的方法如下:

  1. 打开 Amazon CloudWatch 控制台
  2. 在导航窗格中,选择警报
  3. 选择警报,随后选择历史记录视图。
  4. 检查警报状态更改或警报配置修改的历史记录。

“在 2018-02-12T13:49:12Z,对 AutoScalingGroup 的计划操作更新将约束设置为最小值:1,最大值:9,理想值:1,从而将理想容量从 2 改为 1。[...]”

您可以通过配置计划操作来更改 Auto Scaling 组的最小容量、最大容量或理想容量值。当计划操作降低所需容量时,Amazon EC2 Auto Scaling 会终止一个或多个实例以满足新的所需容量需求。

“对 AutoScalingGroup 的用户请求更新将约束设置为最小值:0,最大值:2,理想值:1,从而将理想容量从 2 改为 1”

当您手动更改 Auto Scaling 组的约束值,例如降低理想容量时,Amazon EC2 Auto Scaling 可能会终止实例以匹配新的设置。