

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 自动扩缩组中实例的运行状况检查
<a name="ec2-auto-scaling-health-checks"></a>

Amazon EC2 Auto Scaling 持续监控自动扩缩组中实例的运行状态，以保持所需容量。

自动扩缩组中的所有实例均以 `Healthy` 状态开始。除非 Amazon EC2 Auto Scaling 收到实例运行状况不佳的通知，否则将认为它们运行状况良好。当实例运行状况不佳且必须更换时，它可以接收来自各种来源的通知。这些源包括以下内容：
+ Amazon EC2
+ Elastic Load Balancing
+ VPC Lattice
+ Amazon EBS
+ 您定义的自定义运行状况检查

Amazon EC2 Auto Scaling 确定某个 `InService` 实例运行状况不佳时，会以一个新的实例替换该实例，以维持组的所需容量。新实例使用自动扩缩组的当前设置及其关联的启动模板或启动配置启动。

以下流程图说明在自动扩缩组中启动新实例的过程。首先启动实例。如果启动成功，则该实例将添加到自动扩缩组。然后，Amazon EC2 Auto Scaling 使用内置的 Amazon EC2 状态检查对该实例执行运行状况检查，并在宽限期后执行您为该组启用的任何可选运行状况检查。这些运行状况检查会定期持续进行。如果任何运行状况检查失败，则该实例将被替换。

![\[显示运行状况检查开始时间的高级示意图。\]](http://docs.amazonaws.cn/autoscaling/ec2/userguide/images/how-health-checks-work.png)


当实例意外终止（例如竞价型实例中断或用户手动终止）时，也可能出现运行状况不佳的实例。同样，在这些情况下，Amazon EC2 Auto Scaling 将自动启动替换实例以维持所需容量。

**Topics**
+ [关于自动扩缩组的运行状况检查](health-checks-overview.md)
+ [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)
+ [使用运行状况检查监控具有受损 Amazon EBS 卷的 Auto Scaling 实例](monitor-and-replace-instances-with-impaired-ebs-volumes.md)
+ [为您的自动扩缩组设置自定义运行状况检查](set-up-a-custom-health-check.md)
+ [查看运行状况检查失败原因](replace-unhealthy-instance.md)
+ [排查 Amazon EC2 Auto Scaling 中运行状况不佳的实例问题](ts-as-healthchecks.md)

# 关于自动扩缩组的运行状况检查
<a name="health-checks-overview"></a>

本主题概述了可用的运行状况检查类型，并描述了将 Amazon EC2 Auto Scaling 运行状况检查与您的应用程序集成的关键注意事项。

**Topics**
+ [运行状况检查类型](#available-health-checks)
+ [Amazon EC2 运行状况检查](#instance-health-detection)
+ [Elastic Load Balancing 运行](#elastic-load-balancing-health-checks)
+ [VPC Lattice 运行状况检查](#vpc-lattice-health-checks)
+ [Amazon EC2 Auto Scaling 如何尽可能减少停机时间](#minimize-downtime)
+ [暖池中实例的运行状况检查](#health-checks-for-instance-in-a-warm-pool)
+ [运行状况检查注意事项](#health-check-considerations)

## 运行状况检查类型
<a name="available-health-checks"></a>

Amazon EC2 Auto Scaling 可以使用下列一项或多项运行状况检查来确定 `InService` 实例的运行状况：


****  

| 运行状况检查类型 | 检查内容 | 
| --- | --- | 
|  Amazon EC2 状态检查和计划事件  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/autoscaling/ec2/userguide/health-checks-overview.html) 这是自动扩缩组的默认运行状况检查类型。  | 
|  Elastic Load Balancing 运行  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/autoscaling/ec2/userguide/health-checks-overview.html) 要运行此运行状况检查类型，您必须为自动扩缩组开启此运行状况检查。  | 
|  VPC 莱迪思健康检查  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/autoscaling/ec2/userguide/health-checks-overview.html) 要运行此运行状况检查类型，您必须为自动扩缩组开启此运行状况检查。  | 
|  亚马逊 EBS 健康检查  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/autoscaling/ec2/userguide/health-checks-overview.html) 要运行此运行状况检查类型，您必须为自动扩缩组开启此运行状况检查。  | 
|  自定义运行状况检查  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/autoscaling/ec2/userguide/health-checks-overview.html)  | 

## Amazon EC2 运行状况检查
<a name="instance-health-detection"></a>

实例启动后，它会附加到自动扩缩组并进入 `InService` 状态。要详细了解 Auto Scaling 组中实例的不同生命周期状态，请参阅 [Amazon EC2 Auto Scaling 实例生命周期](ec2-auto-scaling-lifecycle.md)。

Amazon EC2 Auto Scaling 通过定期检查自动扩缩组中所有实例的运行状态，以确保所有实例都在运行并且运行正常。

**状态检查**  
Amazon EC2 Auto Scaling 使用 Amazon EC2 实例状态检查和系统状态检查的结果来确定实例的运行状况。如果实例状态是除 `running` 以外的其他 Amazon EC2 状态，或者状态检查的状态变为 `impaired`，则 Amazon EC2 Auto Scaling 会认为实例运行不正常并予以替换。这包括当实例为任何以下状态时：
+  `stopping` 
+  `stopped` 
+  `shutting-down` 
+  `terminated` 

Amazon EC2 状态检查不需要任何特殊配置，并且始终处于启用状态。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[状态检查类型](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html#types-of-instance-status-checks)。

**重要**  
Amazon EC2 Auto Scaling 会允许这些状态检查偶尔失败，而不执行任何操作。当状态检查失败时，Amazon EC2 Auto Scaling 会等待几分钟 Amazon 才能修复问题。它不会在状态检查的状态变为 `impaired` 时立即将实例标记为 `Unhealthy`。此外，如果状态检查返回 `insufficient-data`，EC2 Auto Scaling 不会将实例标记为 `Unhealthy`。  
但如果 Amazon EC2 Auto Scaling 检测到实例不再处于 `running` 状态，这种情况将被视为立即失败。在这种情况下，它会立即将实例标记为 `Unhealthy` 并予以替换。

**计划的事件**  
Amazon EC2 偶尔可以将实例上的事件安排在特定时间戳之后运行。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[实例的计划事件](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)。

如果其中一个实例受到计划事件的影响，则 Amazon EC2 Auto Scaling 会认为实例运行不正常并将其替换。在到达时间戳中指定的日期和时间之前，实例不会开始关闭。

## Elastic Load Balancing 运行
<a name="elastic-load-balancing-health-checks"></a>

当您为自动扩缩组开启 Elastic Load Balancing 运行状况检查后，Amazon EC2 Auto Scaling 可以使用这些运行状况检查的结果来确定实例的运行状态。

您必须先配置一个 Elastic Load Balancing 负载均衡器并为其配置运行状况检查以确定实例是否运行正常，然后才能为自动扩缩组开启 Elastic Load Balancing 运行状况检查。有关更多信息，请参阅 [准备附加 Elastic Load Balancing 负载均衡器](getting-started-elastic-load-balancing.md)。

将负载均衡器附加到您的自动扩缩组后，会发生以下情况：
+ Amazon EC2 Auto Scaling 会将自动扩缩组中的实例注册到该负载均衡器。
+ 实例完成注册后，它会进入 `InService` 状态并可与该负载均衡器一起使用。

预设情况下，Amazon EC2 Auto Scaling 会忽略 Elastic Load Balancing 运行状况检查的结果。为自动扩缩组开启这些运行状况检查后，当 Elastic Load Balancing 报告某个注册的实例为 `Unhealthy` 时，Amazon EC2 Auto Scaling 会在下一次定期运行状况检查中将该实例标记为 `Unhealthy` 并予以替换。

如果为负载均衡器启用了连接耗尽（注销延迟），则在终止运行不正常的实例之前，Amazon EC2 Auto Scaling 会等待进行中的请求完成或等待最大超时过期。

**注意**  
有关如何附加负载均衡器以及如何为自动扩缩组开启 Elastic Load Balancing 运行状况检查的说明，请参阅[将 Elastic Load Balancing 负载均衡器附加到自动扩缩组](attach-load-balancer-asg.md)。  
当您为某个组开启 Elastic Load Balancing 运行状况检查时，Amazon EC2 Auto Scaling 可以替换 Elastic Load Balancing 将其报告为运行状况不佳的实例，但仅在负载均衡器处于 `InService` 状态后才会执行此操作。有关更多信息，请参阅 [验证负载均衡器的附加状态](load-balancer-status.md)。

## VPC Lattice 运行状况检查
<a name="vpc-lattice-health-checks"></a>

预设情况下，Amazon EC2 Auto Scaling 会忽略 VPC Lattice 运行状况检查的结果。您可以选择为自动扩缩组开启这些运行状况检查。完成此操作后，当 VPC Lattice 报告某个注册的实例为 `Unhealthy` 时，Amazon EC2 Auto Scaling 会在下一次定期运行状况检查中将实例标记为 `Unhealthy` 并予以替换。注册实例然后检查其运行状况的过程与 Elastic Load Balancing 运行状况检查的过程相同。

**注意**  
有关如何附加 VPC Lattice 目标组以及如何为自动扩缩组开启 VPC Lattice 运行状况检查的说明，请参阅[将 VPC Lattice 目标组附加到您的自动扩缩组](attach-vpc-lattice-target-group-asg.md)。  
当您为某个组开启 VPC Lattice 运行状况检查时，Amazon EC2 Auto Scaling 可以替换 VPC Lattice 将其报告为运行状况不佳的实例，但仅在目标组处于 `InService` 状态后才会执行此操作。有关更多信息，请参阅 [验证您的 VPC Lattice 目标组的附件状态](verify-target-group-attachment-status.md)。

## Amazon EC2 Auto Scaling 如何尽可能减少停机时间
<a name="minimize-downtime"></a>

默认情况下，在终止现有实例的同时会预置新实例，这可能导致在新实例完全运行之前无法接受新请求。

如果 Amazon EC2 Auto Scaling 确定任何实例已停止运行（或者它们已`Unhealthy`用[set-instance-health](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/set-instance-health.html)命令标记），它会立即替换它们。但如果发现其他实例运行不正常，Amazon EC2 Auto Scaling 将使用以下故障恢复方法。这种方法可尽可能减少可能因临时问题或运行状况检查配置错误导致的任何停机时间。
+ 如果正在进行某个扩缩活动并且您的自动扩缩组比所需容量少 10% 或以上，则 Amazon EC2 Auto Scaling 会首先等待进行中的扩缩活动完成，然后再替换运行状况不佳的实例。
+ 在进行横向扩展时，Amazon EC2 Auto Scaling 将首先等待实例通过初始运行状况检查。它还会等待默认实例预热完成，以确保新实例准备就绪。
+ 在实例完成预热并且该组升至超过所需容量的 90% 后，Amazon EC2 Auto Scaling 将替换运行状况不佳的实例，如下所示：
  + Amazon EC2 Auto Scaling 一次只替换该组所需容量的 10%。它将在所有运行不正常的实例都被替换之前持续这样操作。
  + 在替换实例时，它会等待新实例通过初始运行状况检查。它还会等待默认的实例预热期结束，然后再继续操作。

**注意**  
如果某个自动扩缩组的容量非常小，以至于 10% 的结果值小于 1，则 Amazon EC2 Auto Scaling 将改为一次替换一个运行状况不佳的实例。这可能会导致该组出现短暂停机。
您可以通过[设置实例维护策略](https://docs.amazonaws.cn//autoscaling/ec2/userguide/set-instance-maintenance-policy-on-group.html)来修改 Auto Scaling 替换运行状况不佳实例的阈值，从而修改默认的 10% 值。但是，Auto Scaling 可能仍会限制其将实例标记为运行状况不佳的阈值。  
例如，如果 Elastic Load Balancing 运行状况检查报告自动扩缩组中的所有实例都不正常，并且负载均衡器位于 `InService` 状态，则 Amazon EC2 Auto Scaling 可能会减少一次标记为运行不正常的实例数量。这可能会导致一次替换的实例数量少于在其他场景中执行的 10% 这一比例。从而为您提供时间来解决问题，无需 Amazon EC2 Auto Scaling 自动终止整个组。

## 暖池中实例的运行状况检查
<a name="health-checks-for-instance-in-a-warm-pool"></a>

Amazon EC2 Auto Scaling 还会对暖池中的实例进行运行状况检查。有关更多信息，请参阅 [查看运行状况检查状态以及运行状况检查失败的原因](warm-pools-health-checks-monitor-view-status.md)。

## 运行状况检查注意事项
<a name="health-check-considerations"></a>

以下是使用 Amazon EC2 Auto Scaling 运行状况检查时的注意事项。
+ 如果您需要在正在终止的实例上或正在启动的实例上执行某些操作，则可以使用生命周期钩子。借助这些钩子，您可以在 Amazon EC2 Auto Scaling 启动或终止实例时执行自定义操作。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 生命周期钩子](lifecycle-hooks.md)。
+ Amazon EC2 Auto Scaling 没有提供从运行状况检查中移除 Amazon EC2 状态检查和计划事件的方法。如果您不想替换实例，则建议暂停任何单个 Auto Scaling 组的 `ReplaceUnhealthy` 和 `HealthCheck` 进程。有关更多信息，请参阅 [暂停和恢复 Amazon EC2 Auto Scaling 进程](as-suspend-resume-processes.md)。
+ 要手动将运行状况不佳的实例的健康状态设置回原为`Healthy`，您可以尝试使用[set-instance-health](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/set-instance-health.html)命令。如果您收到错误消息，则可能是因为该实例已经开始终止。通常，只有在`ReplaceUnhealthy`进程或进程暂停的情况下，`Healthy`使用[set-instance-health](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/set-instance-health.html)命令将实例的运行状况重新设置为才有用。`Terminate`
+ 如果您需要在不受运行状况检查干扰的情况下对实例进行问题排查，则可以将该实例置于 `Standby` 状态。Amazon EC2 Auto Scaling 不会对处于 `Standby` 状态的实例执行运行状况检查，直到您将该实例恢复运行。有关更多信息，请参阅 [临时从 Auto Scaling 组中移除实例](as-enter-exit-standby.md)。
+ 实例终止后，任何关联的弹性 IP 地址都会取消关联，并且不会自动与新实例关联。必须手动将弹性 IP 地址关联到新实例，或者使用基于生命周期挂钩的解决方案自动完成关联。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[弹性 IP 地址](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)。
+ 同样，实例终止后，其挂载的 EBS 卷也将被分离（或删除，具体取决于卷的 `DeleteOnTermination` 属性）。必须手动将这些 EBS 卷挂载到新实例，或者使用基于生命周期挂钩的解决方案自行完成挂载。有关更多信息，请参阅《Amazon EBS 用户指南》**中的[将 Amazon EBS 卷挂载到实例](https://docs.amazonaws.cn/ebs/latest/userguide/ebs-attaching-volume.html)。

# 设置自动扩缩组的运行状况检查宽限期
<a name="health-check-grace-period"></a>

如果 Amazon EC2 Auto Scaling 运行状况检查确定某个 `InService` 实例运行不正常，则会将其终止并启动一个新的替换实例。运行状况检查宽限期指定了因新实例运行状况不正常而将其终止之前继续运行的最短时间（以秒为单位）。

一个示例用例可能是要求 Amazon EC2 Auto Scaling 避免在 Elastic Load Balancing 运行状况检查失败且原因是实例仍在初始化时采取行动。Elastic Load Balancing 运行状况检查并行运行，从实例向负载均衡器注册时开始。通过设置宽限期，可以防止 Amazon EC2 Auto Scaling 在您新启动的实例进入 `InService` 状态后，但没有立即通过这些运行状况检查时，不必要地将这些实例标记为 `Unhealthy` 并予以终止。

在控制台中，创建自动扩缩组时的运行状况检查宽限期默认为 300 秒。使用 Amazon CLI 或 SDK 创建 Auto Scaling 组时，其默认值为 0 秒。值为 0 将关闭运行状况检查宽限期。

如果将该值设置过高，会降低 Amazon EC2 Auto Scaling 运行状况检查的效果。如果您为实例启动使用了生命周期挂钩，则可以将运行状况检查宽限期设置为 0。借助生命周期挂钩，Amazon EC2 Auto Scaling 提供了一种方法，可确保实例始终在完成初始化之后才会进入 `InService` 状态。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 生命周期钩子](lifecycle-hooks.md)。

宽限期适用于以下实例：
+ 新启动的实例
+ 处于待机状态后重新投入运行的实例
+ 您手动附加到组的实例

**重要**  
在运行状况检查宽限期内，如果 Amazon EC2 Auto Scaling 检测到某个实例不再处于 Amazon EC2 `running` 状态，则会立即将该实例标记为`Unhealthy`并予以替换。例如，假设您停止了自动扩缩组中的某个实例，则该实例会被标记为`Unhealthy`并被替换。

## 设置组的运行状况检查宽限期
<a name="set-health-check-grace-period"></a>

您可以为新的和现有的自动扩缩组设置运行状况检查宽限期。

------
#### [ Console ]

**修改新组的运行状况检查宽限期**  
创建自动扩缩组时，在**配置高级选项**页面的**运行状况检查**、**运行状况检查宽限期**中输入相应的时间（单位为秒）。这是实例进入 `InService` 状态后，Amazon EC2 Auto Scaling 在检查其运行状况之前必须等待的时间。

------
#### [ Amazon CLI ]

**修改新组的运行状况检查宽限期**  
将该`--health-check-grace-period`选项添加到[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令中。以下示例将为一个名为 `my-asg` 的新自动扩缩组配置运行状况检查宽限期，其值为 `60` 秒。

```
aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg \
  --health-check-grace-period 60 ...
```

------

------
#### [ Console ]

**修改现有组的运行状况检查宽限期**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 在屏幕顶部的导航栏中，选择您在其中创建了自动扩缩组的 Amazon Web Services 区域 。

1. 选中 Auto Scaling 组旁边的复选框。

   这时将在页面底部打开一个拆分窗格。

1. 在 **Details (详细信息)** 选项卡上，选择 **Health checks (运行状况检查)**、**Edit (编辑)**。

1. 在 **Health check grace period**（运行状况检查宽限期）下，输入时间长短，单位为秒。这是实例进入 `InService` 状态后，Amazon EC2 Auto Scaling 在检查其运行状况之前必须等待的时间。

1. 选择**更新**。

------
#### [ Amazon CLI ]

**修改现有组的运行状况检查宽限期**  
将该`--health-check-grace-period`选项添加到[update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)命令中。以下示例将为一个名为 `my-asg` 的现有自动扩缩组配置运行状况检查宽限期，其值为 `120` 秒。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
  --health-check-grace-period 120
```

------

**注意**  
我们强烈建议同时为您的自动扩缩组设置默认实例预热时间。有关更多信息，请参阅 [为 Auto Scaling 组设置原定设置实例预热](ec2-auto-scaling-default-instance-warmup.md)。

# 使用运行状况检查监控具有受损 Amazon EBS 卷的 Auto Scaling 实例
<a name="monitor-and-replace-instances-with-impaired-ebs-volumes"></a>

您可以为自动扩缩组开启 Amazon EBS 运行状况检查，以确保 Amazon EC2 Auto Scaling 监控运行您的应用程序的整个系统。

开启这些运行状况检查后，Amazon EC2 Auto Scaling 会收到对实例附加的 EBS 卷执行 Amazon EC2 状态检查的结果。如果某个卷无法访问或未通过 I/O 状态检查，则运行状况检查将失败，相应的实例将被视为运行状况不佳。Amazon EC2 Auto Scaling 检测到运行状况不佳的实例时，会将其予以替换。

本主题假设您熟悉所附加的 EBS 状态检查。如果您不熟悉，则请参阅《Amazon EC2 用户指南》**的[附加的 EBS 状态检查](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html#attached-ebs-status-checks)部分了解详细信息。以下主题描述了如何开启依赖于附加的 EBS 状态检查的 Amazon EC2 Auto Scaling 运行状况检查。

**注意**  
您可以为所有自动扩缩组开启 Amazon EBS 运行状况检查。但是，这些运行状况检查仅适用于[在 Amazon Nitro System 上构建的实例](https://docs.amazonaws.cn/ec2/latest/instancetypes/ec2-nitro-instances.html)。

## 为组开启 Amazon EBS 运行状况检查
<a name="turn-on-ebs-health-checks"></a>

您可以为新的以及现有的自动扩缩组开启 Amazon EBS 运行状况检查。

------
#### [ Console ]

**为新组开启 Amazon EBS 运行状况检查**  
创建自动扩缩组时，在**配置高级选项**页面上，对于**运行状况检查**、**其他运行状况检查类型**，请选择**开启 Amazon EBS 运行状况检查**。然后，在 **运行状况检查宽限期**下，输入时间长短，单位为秒。此时间是 Amazon EC2 Auto Scaling 在实例进入 `InService` 状态后必须等待完成实例运行状况检查的时间。有关更多信息，请参阅 [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)。

------
#### [ Amazon CLI ]

**为新组开启 Amazon EBS 运行状况检查**  
将该`--health-check-type`选项添加到[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令中。以下示例将名为 `my-asg` 的新自动扩缩组的 `--health-check-type` 选项指定为 **`EBS`**。

```
aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg \
  --health-check-type "EBS" --health-check-grace-period 60 ...
```

您可以为 `--health-check-type` 选项指定多个值。例如，要同时添加 Amazon EBS 和 Elastic Load Balancing 运行状况检查类型，请使用以下命令。

```
aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg \
  --health-check-type "EBS,ELB" --health-check-grace-period 60 ...
```

值的名称区分大小写。

------

------
#### [ Console ]

**为现有组开启 Amazon EBS 运行状况检查**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 在屏幕顶部的导航栏中，选择您在其中创建了自动扩缩组的 Amazon Web Services 区域 。

1. 选中现有组旁边的复选框。

   这时将在 **Auto Scaling groups**（Auto Scaling 组）页面底部打开一个拆分窗格。

1. 在 **Details (详细信息)** 选项卡上，选择 **Health checks (运行状况检查)**、**Edit (编辑)**。

1. 对于**运行状况检查**、**其他运行状况检查类型**，选择**开启 Amazon EBS 运行状况检查**。

1. 对于**运行状况检查宽限期**，输入时间长短（以秒为单位）。此时间是 Amazon EC2 Auto Scaling 在实例进入 `InService` 状态后必须等待完成实例运行状况检查的时间。有关更多信息，请参阅 [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)。

1. 选择**更新**。

------
#### [ Amazon CLI ]

**为现有组开启 Amazon EBS 运行状况检查**  
将该`--health-check-type`选项添加到[update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)命令中。以下示例将名为 `my-asg` 的现有自动扩缩组的 `--health-check-type` 选项指定为 `EBS`。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
  --health-check-type "EBS" --health-check-grace-period 60
```

要使用多种运行状况检查类型，您可以为 `--health-check-type` 选项指定多个值（例如 `EBS,ELB`）。

值的名称区分大小写。

------

# 关闭自动扩缩组的 Amazon EBS 运行状况检查
<a name="turn-off-ebs-health-checks"></a>

以下主题描述了如何关闭自动扩缩组的 Amazon EBS 运行状况检查。如果您不再需要 Amazon EBS 运行状况检查，则请按照以下步骤将其关闭。

------
#### [ Console ]

**关闭组的 Amazon EBS 运行状况检查**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中现有组旁边的复选框。

   这时将在 **Auto Scaling groups**（Auto Scaling 组）页面底部打开一个拆分窗格。

1. 在 **Details (详细信息)** 选项卡上，选择 **Health checks (运行状况检查)**、**Edit (编辑)**。

1. 对于**运行状况检查**、**其他运行状况检查类型**，取消选择**开启 Amazon EBS 运行状况检查**。

1. 选择**更新**。

------
#### [ Amazon CLI ]

**关闭组的 Amazon EBS 运行状况检查**  
要更新 Auto Scaling 组的运行状况检查，使其不再使用 Amazon EBS 运行状况检查，请使用[update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)命令。包括 `--health-check-type` 选项和 `EC2` 的值。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
  --health-check-type "EC2"
```

要在不关闭其他运行状况检查类型（例如 Elastic Load Balancing）的情况下关闭 Amazon EBS 运行状况检查，则必须指定类型而不是使用 `EC2`。例如，对于 Elastic Load Balancing 运行状况检查，请为 `--health-check-type` 选项指定 `ELB`。

值的名称区分大小写。

------

# 为您的自动扩缩组设置自定义运行状况检查
<a name="set-up-a-custom-health-check"></a>

您可以使用自定义运行状况检查来补充 Amazon EC2 Auto Scaling 提供的现有运行状况检查选项。通过将自定义运行状况检查与其他运行状况检查类型相结合，您可以创建针对应用程序需求量身定制的全面运行状况监控系统。

首先，创建自定义测试，以验证自动扩缩组中的实例是否正常运行并且可以处理传入流量。如果您配置的运行状况检查检测到某个实例没有响应，则请将该特定实例标记为 `Unhealthy`，这会导致 Amazon EC2 Auto Scaling 立即将其替换。

您可以使用 Amazon CLI 或 SDK 将实例的运行状况直接发送到 Amazon EC2 Auto Scaling。以下示例向您展示了如何使用 Amazon CLI 来配置实例的运行状况，然后验证实例的运行状况。

使用以下[set-instance-health](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/set-instance-health.html)命令将指定实例的运行状况设置为`Unhealthy`。

```
aws autoscaling set-instance-health --instance-id i-1234567890abcdef0 --health-status Unhealthy
```

默认情况下，此命令会执行运行状况检查宽限期。不过，您可以通过包括 `--no-should-respect-grace-period` 选项来覆盖此行为，不执行此宽限期。

使用以下[describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html)命令验证实例的运行状况是否为`Unhealthy`。

```
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
```

下面是一个示例响应，向您演示实例的运行状况为 `Unhealthy` 并且实例正在终止。

```
{
    "AutoScalingGroups": [
        {
            ....
            "Instances": [
                {
                    "ProtectedFromScaleIn": false,
                    "AvailabilityZone": "us-west-2a",
                    "LaunchTemplate": {
                        "LaunchTemplateName": "my-launch-template",
                        "Version": "1",
                        "LaunchTemplateId": "lt-1234567890abcdef0"
                    },
                    "InstanceId": "i-1234567890abcdef0",
                    "InstanceType": "t2.micro",
                    "HealthStatus": "Unhealthy",
                    "LifecycleState": "Terminating"
                },
                ...
            ]
        }
    ]
}
```

# 查看运行状况检查失败原因
<a name="replace-unhealthy-instance"></a>

您可以使用以下过程来查看有关因运行状况检查而被替换的任何实例的信息。

预设情况下，Amazon EC2 Auto Scaling 会创建用于终止运行状况不佳的实例的新扩缩活动，然后终止该实例。在实例终止期间，另一个扩缩活动将会启动一个新实例。您可以使用实例维护策略将此行为更改为尽快开始启动新实例。有关更多信息，请参阅 [实例维护策略](ec2-auto-scaling-instance-maintenance-policy.md)。

------
#### [ Console ]

**查看运行状况检查失败原因**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中 Auto Scaling 组旁边的复选框。

   这时将在 **Auto Scaling groups**（Auto Scaling 组）页面底部打开一个拆分窗格。

1. 在**活动**选项卡的**活动历史记录**下，**状态**列显示您的 Auto Scaling 组是否已成功启动或终止实例。

   如果它终止了任何运行状况不佳的实例，**原因**列显示终止的日期和时间以及运行状况检查失败的原因。例如 `At 2022-05-14T20:11:53Z an instance was taken out of service in response to a user health-check`。此消息表示自定义运行状况检查将实例标记为运行状况不佳。

   有关运行状况检查失败的帮助，请参阅[排查 Amazon EC2 Auto Scaling 中运行状况不佳的实例问题](ts-as-healthchecks.md)。

------
#### [ Amazon CLI ]

**查看运行状况检查失败原因**  
使用以下 [describe-scaling-activities](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-scaling-activities.html) 命令。

```
aws autoscaling describe-scaling-activities --auto-scaling-group-name my-asg
```

以下为示例响应，其中 `Cause` 包含运行状况检查失败的原因。

```
{
  "Activities": [
    {
      "ActivityId": "4c65e23d-a35a-4e7d-b6e4-2eaa8753dc12",
      "AutoScalingGroupName": "my-asg",
      "Description": "Terminating EC2 instance: i-04925c838b6438f14",
      "Cause": "At 2021-04-01T21:48:35Z an instance was taken out of service in response to a user health-check.",
      "StartTime": "2021-04-01T21:48:35.859Z",
      "EndTime": "2021-04-01T21:49:18Z",
      "StatusCode": "Successful",
      "Progress": 100,
      "Details": "{\"Subnet ID\":\"subnet-5ea0c127\",\"Availability Zone\":\"us-west-2a\"...}",
      "AutoScalingGroupARN": "arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:283179a2-f3ce-423d-93f6-66bb518232f7:autoScalingGroupName/my-asg"
    },
...
  ]
}
```

有关输出中字段的描述，请参阅 *Amazon EC2 Auto Scaling API 参考*中的[活动](https://docs.amazonaws.cn/autoscaling/ec2/APIReference/API_Activity.html)。

要描述删除 Auto Scaling 组后的伸缩活动，[describe-scaling-activities](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-scaling-activities.html)请在命令中添加`--include-deleted-groups`选项。

------

# 排查 Amazon EC2 Auto Scaling 中运行状况不佳的实例问题
<a name="ts-as-healthchecks"></a>

以下是 Amazon EC2 Auto Scaling 返回的错误消息、潜在原因以及可以用于解决问题的步骤。

要检索错误消息，请参阅[查看运行状况检查失败原因](replace-unhealthy-instance.md)。

**Topics**
+ [实例因 EC2 实例状态检查失败而停止使用](#ts-failed-status-checks)
+ [实例因 EC2 运行状况检查而停止服务指示它已终止或停止](#ts-terminated-or-stopped)
+ [实例因 ELB 系统运行状况检查失败而停止服务](#ts-failed-elb-health-checks)
+ [其他资源](#troubleshoot-health-checks-additional-resources)

## 实例因 EC2 实例状态检查失败而停止使用
<a name="ts-failed-status-checks"></a>

**问题**：Auto Scaling 实例未通过 Amazon EC2 状态检查。

**原因 1**：如果存在导致 Amazon EC2 考虑您的自动扩缩组中的实例受损的问题，Amazon EC2 Auto Scaling 会自动替换这些实例，作为其运行状况检查的一部分。

**解决方案 1**：当实例状态检查失败时，通常必须通过更改实例配置来自行解决问题，直到应用程序不再出现任何问题。要解决该问题，请完成以下步骤：

1. 手动创建不是 Auto Scaling 组一部分的 Amazon EC2 实例并调查问题。有关调查受损实例的一般帮助，请参阅《Amazon EC2 用户指南》**中的[通过故障状态检查来排查实例问题](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/TroubleshootingInstances.html)。

1. 在确认实例已成功启动且运行状况良好后，请将新的、无错误的实例配置部署到 Auto Scaling 组。

1. 删除您创建的实例以免对 Amazon 账户继续产生费用。

## 实例因 EC2 运行状况检查而停止服务指示它已终止或停止
<a name="ts-terminated-or-stopped"></a>

**问题**：已停止、重新启动或终止的 Auto Scaling 实例将被替换。

**原因 1**：用户已手动停止、重新启动或终止实例。

**解决方案 1**：如果您需要停止或重启自动扩缩组中的实例，则建议您首先将实例置于备用状态。有关更多信息，请参阅 [临时从 Auto Scaling 组中移除实例](as-enter-exit-standby.md)。

**原因 2**：Amazon EC2 Auto Scaling 尝试在 Amazon EC2 竞价服务中断实例后替换竞价型实例，因为 Spot 价格上涨超过您的最高价或容量不再可用。

**解决方案 2**：无法保证在任何给定时间点存在竞价型实例来满足请求。但是，您可以尝试以下操作：
+ 使用更高的 Spot 最高价（可能是按需价格）。通过设置更高的最高价，Amazon EC2 竞价服务可以更好地启动和保持您所需的容量。
+ 通过在多个可用区中运行多个实例类型，增加您可以从中启动实例的不同容量池的数量。有关更多信息，请参阅 [Auto Scaling 组具有多个实例类型和购买选项](ec2-auto-scaling-mixed-instances-groups.md)。
+ 如果您使用多个实例类型，请考虑启用容量再平衡功能。如果您希望 Amazon EC2 竞价服务在运行实例终止之前尝试启动新的竞价型实例，这将非常有用。有关更多信息，请参阅 [Auto Scaling 进行容量再平衡以替换存在风险的竞价型实例](ec2-auto-scaling-capacity-rebalancing.md)。

**原因 3**：使用容量块，Amazon EC2 终止在容量块结束时间前 30 分钟仍在运行的所有实例。这种突然终止会导致您的自动扩缩组尝试启动新实例以维持其所需容量，即使容量块即将结束。

**解决方案 3**：要解决此问题，请尝试以下操作：
+ 减少自动扩缩组的所需容量，以防止其尝试启动新实例。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 的手动扩缩](ec2-auto-scaling-scaling-manually.md)。
+ 请务必在容量块结束时间前 30 分钟横向缩减您的自动扩缩组，这样就不会频繁遇到此错误。确保所有生命周期挂钩在容量块结束时间前 30 分钟完成。有关更多信息，请参阅 [将Capacity Blocks用于机器学习工作负载](launch-template-capacity-blocks.md)。

## 实例因 ELB 系统运行状况检查失败而停止服务
<a name="ts-failed-elb-health-checks"></a>

**问题**：Auto Scaling 实例可能会通过 EC2 状态检查。但是，它们可能无法对已注册 Auto Scaling 组的目标组或经典负载均衡器进行 Elastic Load Balancing 运行状况检查。

**原因 1**：如果您的自动扩缩组依赖于 Elastic Load Balancing 提供的运行状况检查，则 Amazon EC2 Auto Scaling 通过查看 EC2 状态检查和 Elastic Load Balancing 运行状况检查的结果来确定实例的运行状况。负载均衡器通过向每个实例发送请求并等待正确响应或与实例建立连接来执行运行状况检查。实例未能通过 Elastic Load Balancing 运行状况检查，可能是因为实例中运行的应用程序发生问题，导致负载均衡器将实例视为停止服务。

**解决方案 1**：要通过 Elastic Load Balancing 运行状况检查，请执行以下操作：
+ 验证目标组的运行状况检查设置是否已正确配置。您定义每个目标组的负载均衡器的运行状况检查设置。有关更多信息，请参阅 [配置目标的运行状况检查](getting-started-elastic-load-balancing.md#elb-health-checks-for-targets)。
+ 记住负载均衡器所需的成功代码，并且验证应用程序已正确配置为在成功时返回这些代码。
+ 验证负载均衡器和 Auto Scaling 组的安全组是否已正确配置。
+ 验证负载均衡器是否配置在与 Auto Scaling 组相同的可用区中。

**解决方案 2**：更新自动扩缩组以关闭 Elastic Load Balancing 运行状况检查。有关如何关闭这些运行状况检查的说明，请参阅[分离目标组或经典负载均衡器](https://docs.amazonaws.cn//autoscaling/ec2/userguide/attach-load-balancer-asg.html#as-remove-load-balancer)。

**原因 2**：运行状况检查宽限期与实例启动时间不匹配。

**解决方案 3**：编辑自动扩缩组的运行状况检查宽限期。将宽限期设置为足够长的时间段，以支持 Elastic Load Balancing 认为新启动的实例正常之前运行状况检查所需的连续成功次数。有关更多信息，请参阅 [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)。

## 其他资源
<a name="troubleshoot-health-checks-additional-resources"></a>

如果您遇到其他问题，请参阅以下 Amazon Web Services re:Post 文章以获取更多疑难解答帮助：
+  [Amazon EC2 Auto Scaling 为何终止实例？](https://repost.aws/knowledge-center/auto-scaling-instance-how-terminated) 
+  [Amazon EC2 Auto Scaling 为何终止运行状况不佳的实例？](https://repost.aws/knowledge-center/auto-scaling-terminate-instance) 