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

上次更新时间:2018 年 6 月 13 日

我的 Amazon Elastic Cloud Compute (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 可能会终止实例以匹配新的设置。