

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

# CodeDeploy 实例运行状况
<a name="instances-health"></a>

CodeDeploy 监控部署组中实例的运行状况。如果运行正常的实例数小于部署期间已为部署组指定的最小运行正常实例数，则部署将失败。例如，如果 85% 的实例必须在部署期间保持运行正常，且部署组包含 10 个实例，则只要一个实例的部署失败，整个部署都将失败。这是因为，当一个实例脱机以安装最新的应用程序版本时，可用的运行正常的实例计数已降至 90%。一个出现故障的实例加上另一个脱机实例意味着只有 80% 的实例运行正常且可用。 CodeDeploy 将使整个部署失败。

需要牢记的是，为了使整个部署成功，必须满足以下条件：
+ CodeDeploy 能够部署到部署中的每个实例。
+ 到至少一个实例的部署必须成功。也就是说，即使最小正常运行的主机数值为 0，也是到至少一个实例的部署必须成功（即至少有一个实例必须是正常运行的），才能使整个部署成功。

**Topics**
+ [运行状况](#instances-health-status)
+ [关于最小运行正常的实例数](#minimum-healthy-hosts)
+ [关于每个可用区最小运行正常的实例数](#minimum-healthy-hosts-az)

## 运行状况
<a name="instances-health-status"></a>

CodeDeploy 为每个实例分配两个运行状况值：*修订运行状况*和*实例运行状况*。

修订运行状况  
修订运行状况基于实例上当前安装的应用程序修订。它具有以下状态值：  
+ 当前：实例上安装的修订与部署组的上次成功部署的修订匹配。
+ 旧：实例上安装的修订与旧版应用程序匹配。
+ 未知：应用程序修订尚未安装成功到实例上。

实例运行状况  
实例运行状况基于针对实例的部署是否成功。它具有以下值：  
+ 正常：针对实例的上次部署成功。
+ 不正常：尝试将修订部署到实例失败，或修订尚未部署到实例。

CodeDeploy 使用修订运行状况和实例运行状况按以下顺序安排部署到部署组实例的部署：

1. “不正常”实例运行状况。

1. “未知”修订运行状况。

1. “旧”修订运行状况。

1. “当前”修订运行状况。

如果整个部署成功，则将更新修订，并更新部署组的运行状况值来反映最新的部署。
+ 具有成功部署的所有当前实例将保持“当前”状态。否则，它们将变为“未知”状态。
+ 具有成功部署的所有“旧”或“未知”实例将变为“当前”状态。否则，它们将保持“旧”或“未知”状态。
+ 所有具有成功部署的正常实例都将保持“正常”状态。否则，它们将变为“不正常”状态。
+ 所有具有成功部署的不正常实例都将变为“正常”状态。否则，它们将保持“不正常”状态。

如果整个部署失败或停止：
+  CodeDeploy 尝试部署应用程序修订的每个实例都将其实例运行状况设置为正常或不正常，具体取决于该实例的部署尝试是成功还是失败。
+  CodeDeploy 未尝试部署应用程序修订的每个实例都将保留其当前实例运行状况值。
+ 部署组的修订保持不变。

## 关于最小运行正常的实例数
<a name="minimum-healthy-hosts"></a>

所需的最小运行正常实例数在部署配置中进行定义。

**重要**  
在 blue/green 部署期间，部署配置和最低运行正常主机值适用于替换环境中的实例，而不是原始环境中的实例。但是，当原始环境中的实例从负载均衡器取消注册时，只要一个原始实例未能成功取消注册，整个环境就将标记为失败。

CodeDeploy 提供了三种默认部署配置，这些配置具有常用的最低运行状况主机值：


| 默认部署配置名称 | 预定义的最小正常运行主机值 | 
| --- | --- | 
| CodeDeployDefault.OneAtATime | 1 | 
| CodeDeployDefault.HalfAtATime | 50% | 
| CodeDeployDefault.AllAtOnce | 0 | 

在 [在中使用部署配置 CodeDeploy](deployment-configurations.md) 中，您将发现有关默认部署配置的更多信息。

您可以在中创建自定义部署配置 CodeDeploy ，以定义自己的最低运行状况主机值。在使用以下操作时，您可以将这些值定义为整数或百分比：
+ 就像`minimum-healthy-hosts`您在中使用[create-deployment-config](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-config.html)命令一样 AWS CLI。
+ 就`Value`像 CodeDeploy API 中的[MinimumHealthyHosts](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_MinimumHealthyHosts.html)数据类型一样。
+ 就像你在 CloudFormation 模板[AWS::CodeDeploy::DeploymentConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentconfig.html)中使用`MinimumHealthyHosts`时一样。

CodeDeploy 允许您为部署指定运行正常的实例的最小数量，主要有两个目的：
+ 确定整个部署是成功还是失败。如果应用程序修订已成功部署到至少最小数量的运行正常的实例，则部署将成功。
+ 确定部署期间为允许继续部署而必须运行正常的实例的数量。

您可以实例数或实例总数百分比的形式为部署组指定最小运行正常的实例数。如果您指定百分比，则在部署开始时， CodeDeploy 会将该百分比转换为等值的实例数，将所有小数实例向上舍入。

CodeDeploy 在部署过程中跟踪部署组实例的运行状况，并使用部署中指定的最小运行正常实例数来确定是否继续部署。基本原则是，部署绝对不能导致运行正常的实例数低于您指定的最小数量。此规则的一个例外情况是，当部署组最初具有的运行正常的实例数少于指定的最小运行正常的实例数时。在此情况下，部署过程不会进一步减少运行正常的实例数。

**注意**  
CodeDeploy 将尝试部署到部署组中的所有实例，包括那些当前处于 “已停止” 状态的实例。在计算正常运行的最小主机数过程中，处于停止状态的实例和出现故障的实例的影响相同。如果由于处于停止状态的实例过多而导致部署失败，要解决这种问题，请重启实例或更改实例的标签，以将它们从部署组排除出去。

CodeDeploy 通过尝试将应用程序修订部署到部署组运行状况不佳的实例来启动部署过程。对于每次成功部署，都会将实例的运行状况 CodeDeploy 更改为运行状况良好，然后将其添加到部署组的运行正常的实例中。 CodeDeploy 然后将当前运行正常的实例数与指定的最小运行正常实例数进行比较。
+ 如果运行正常的实例数量小于或等于指定的最小运行正常实例数，则 CodeDeploy 取消部署以确保运行正常的实例数量不会随着部署的增加而减少。
+ 如果运行正常的实例数比指定的最小运行正常实例数至少多一个，则会将应用程序修订版 CodeDeploy 部署到最初的一组运行正常的实例。

如果部署到运行正常的实例失败，则会将该实例的运行状况 CodeDeploy 更改为不健康。随着部署的进展， CodeDeploy 更新当前运行正常的实例数，并将其与指定的最小运行正常实例数进行比较。如果运行正常的实例数量在部署过程中的任何时候降至指定的最小数量，则 CodeDeploy 会停止部署。此做法可防止下一个部署失败的可能性，并减小运行正常的实例数以使其小于指定的最小数量。

**注意**  
确保您指定的最小运行正常的实例数小于部署组中的实例总数。如果您指定百分比值，请记住此值将取整。否则，当部署开始时，运行正常的实例数将小于或等于指定的最小运行正常的实例数，并且 CodeDeploy 将立即使整个部署失败。

CodeDeploy 还使用指定的最小运行正常实例数和实际运行正常的实例数来确定是否以及如何将应用程序修订部署到多个实例。默认情况下，会将应用程序修订 CodeDeploy 部署到尽可能多的实例，而不会出现运行正常的实例数量低于指定的最小运行正常实例数的风险。

要确定应同时部署到的实例数量，请 CodeDeploy 使用以下计算方法：

```
[total-hosts] - [minimum-healthy-hosts] =
        [number-of-hosts-to-deploy-to-at-once]
```

例如：
+ 如果您的部署组有 10 个实例，并且您将运行正常的最小实例数设置为 9，则一次将 CodeDeploy 部署到 1 个实例。
+ 如果您的部署组有 10 个实例，并且您将运行正常的最小实例数设置为 3，则在第一批中同时 CodeDeploy 部署到 7 个实例，然后在第二批中同时部署到其余 3 个实例。
+ 如果您的部署组有 10 个实例，并且您将运行正常的最小实例数设置为 0，则会同时 CodeDeploy 部署到 10 个实例。

**示例**

以下示例假定一个具有 10 个实例的部署组。

最小运行正常的实例数：95%  
CodeDeploy 将最小运行状况良好的实例数四舍五入为 10，这等于运行正常的实例数。如果未将修订部署到任何实例，则整个部署将立即失败。

最小运行正常的实例数：9  
CodeDeploy 一次将修订部署到一个实例。如果部署到任一实例失败，则整体部署将 CodeDeploy 立即失败，因为运行正常的实例数量等于最小运行正常的实例数。此规则的例外情况是，如果最后一个实例失败，部署仍将成功。  
CodeDeploy 继续部署，每次部署一个实例，直到任何部署失败或整体部署完成。如果 10 个部署全都成功，则部署组现在将具有 10 个运行正常的实例。

最小运行正常的实例数：8  
CodeDeploy 一次将修订部署到两个实例。如果其中两个部署失败，则整个部署 CodeDeploy 立即失败。此规则的例外情况是，如果最后一个实例是第二个失败的实例，则部署仍将成功。

最小运行正常的实例数：0  
CodeDeploy 将修订一次部署到整个部署组。至少一个到实例的部署必须成功，整个部署才能成功。如果 0 个实例正常运行，则部署会失败。这是因为如下要求：为了将整个部署标记为成功，在完成整个部署时，至少有一个实例必须是正常运行的，即使最小正常运行的实例数值为 0。

## 关于每个可用区最小运行正常的实例数
<a name="minimum-healthy-hosts-az"></a>

**注意**  
本节交替使用*实例*和*主机*这两个术语来指代 Amazon EC2 实例。

如果您要部署到多个[可用区的](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-availability-zones)实例，则可以选择启用该[zonal configuration](deployment-configurations-create.md#zonal-config)功能，该功能允许一次部署 CodeDeploy 到一个可用区。

启用此功能后， CodeDeploy 将确保运行正常的主机数量保持在 “每个区域最小运行正常主机数” *和* “最小运行正常主机数” 值之上。如果运行正常的主机数量低于任一值， CodeDeploy 则所有可用区的部署都将失败。

要计算一次部署到的主机数量，请同时 CodeDeploy 使用 “每个区域最少运行正常的主机” 和 “最少运行正常的主机” 值。 CodeDeploy 将使用*较小的*计算方法 `[A]``[B]`，在何处`[A]`和`[B]`是：

```
[A] = [total-hosts] - [min-healthy-hosts] =
        [number-of-hosts-to-deploy-to-at-once]
```

```
[B] = [total-hosts-per-AZ] - [min-healthy-hosts-per-AZ] =
        [number-of-hosts-to-deploy-to-at-once-per-AZ]
```

确定一次要部署到的主机数量后，将按该数量的批次 CodeDeploy 部署到主机，一次部署一个可用区，在区域之间可以选择暂停（或 “烘焙时间”）。

**示例**

如果您的部署配置如下：
+ `[total-hosts]` 是 `200`
+ `[minimum-healthy-hosts]` 是 `160`
+ `[total-hosts-per-AZ]` 是 `100` 
+ `[minimum-healthy-hosts-per-AZ]` 是 `50`

则...
+ `[A]` = `200 - 160 = 40`
+ `[B]` = `100 - 50 = 50`
+ `40` 小于 `50`

因此， CodeDeploy 将立即部署到`40`主机。

在这种情况下，部署展开如下：

1. CodeDeploy 部署到第一个可用区：

   1. CodeDeploy 部署到第一批`40`主机。

   1. CodeDeploy 部署到下一个主`40`机。

   1. CodeDeploy 部署到其余`20`主机。

      到第一个可用区的部署现已完成。

1. （可选） CodeDeploy 等待第一个区域的部署 “烘烤”，具体定义为**监控器持续时间**或**为第一个区域添加监视器持续时间**设置。如果没有问题，请 CodeDeploy 继续。

1. CodeDeploy 部署到第二个可用区：

   1. CodeDeploy 部署到第一批`40`主机。

   1. CodeDeploy 部署到下一个主`40`机。

   1. CodeDeploy 部署到其余`20`主机。

      到第二个也是最后一个可用区的部署现已完成。

要了解区域配置功能以及如何指定每个可用区正常运行主机的最小数量，请参阅[zonal configuration](deployment-configurations-create.md#zonal-config)。