

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

# 部署策略和设置
<a name="using-features.rolling-version-deploy"></a>

AWS Elastic Beanstalk 为如何处理[部署](using-features.deploy-existing-version.md)提供了多种选项，包括部署策略（*全部一次*、*滚动*、*带额外批次滚动*、*不可变*和*流量拆分*）以及允许您在部署期间配置批量大小和运行状况检查行为的选项。默认情况下，您的环境使用 all-at-once部署。如果您使用 EB CLI 创建了环境，并且它是可扩展的环境（您未指定 `--single` 选项），则它使用滚动部署。

通过*滚动部署*，Elastic Beanstalk 将环境的 EC2 Amazon 实例拆分为多个批次，并将新版本的应用程序逐批部署到一个批次中。运行旧版应用程序的环境中的其余实例将会保留。在滚动部署期间，一些实例通过旧版本的应用程序处理请求，而已完成批次中的实例通过新版本处理其他请求。有关更多信息，请参阅 [滚动部署的工作方式](#environments-cfg-rollingdeployments-method)。

要在部署期间保持完整容量，可以配置环境以启动新的实例批次，然后再禁用任何实例。此选项称作*附加批次滚动部署*。在部署完成后，Elastic Beanstalk 将终止附加的实例批次。

*不可变的部署*执行[不可变更新](environmentmgmt-updates-immutable.md)，以启动在单独的 Auto Scaling 组中运行新版本应用程序的一组完整的新实例，以及运行旧版本的实例。不可变的部署会阻止由部分完成的滚动部署导致的问题。如果新实例未通过运行状况检查，则 Elastic Beanstalk 将终止这些实例，并使原始实例保持不变。

*流量拆分部署*允许您在应用程序部署过程中执行 Canary 测试。在流量拆分部署中，Elastic Beanstalk 启动一整套新实例，就像在不可变部署期间一样。然后，它在指定的评估期内将指定百分比的传入客户端流量转发到新的应用程序版本。如果新实例保持正常状态，则 Elastic Beanstalk 会将所有流量转发给它们并终止旧实例。如果新实例未通过运行状况检查，或者您选择中止部署，则 Elastic Beanstalk 会将流量移回旧实例并终止新实例。从不会有任何服务中断。有关更多信息，请参阅 [流量拆分部署的工作方式](#environments-cfg-trafficsplitting-method)。

**警告**  
某些策略会在部署或更新期间替换所有实例。这会导致所有累积的 [Amazon EC2 突发余额](https://docs.aws.amazon.com/AWSEC2/latest/DeveloperGuide/burstable-performance-instances.html)丢失。这发生在以下情况下：  
已启用实例替换的托管平台更新
不可变更新
已启用不可变更新或流量拆分的部署

如果您的应用程序未通过所有运行状况检查，但仍能够以较低级别的运行状况正常运行，则您可以修改**正常阈值**选项，使实例能够通过较低级别状况（例如 `Warning`）的运行状况检查。如果您的部署因未通过运行状况检查而失败，并且您需要强制实施更新而不管运行状况如何，请指定**忽略运行状况检查**选项。

如果您指定滚动更新的批大小，则 Elastic Beanstalk 还将使用该值来滚动重新启动应用程序。在您需要重新启动运行于环境实例上的代理和应用程序服务器而不会导致停机时，可使用滚动重新启动。

## 配置应用程序部署
<a name="environments-cfg-rollingdeployments-console"></a>

在[环境管理控制台](environments-console.md)中，通过编辑环境的 **Configuration**（配置）页面上的 **Updates and Deployments**（更新和部署）来启用和配置批量应用程序版本部署。

**配置部署 (控制台)**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration**（配置）。

1. 在 **Rolling updates and deployments**（滚动更新和部署）配置类别中，选择 **Edit**（编辑）。

1. 在**应用程序部署**部分中，选择**部署策略**、批设置和运行状况检查选项。

1. 要保存更改，请选择页面底部的 **Apply**（应用）。

**Rolling updates and deployments**（滚动更新和部署）页面的 **Application deployments**（应用程序部署）部分提供以下应用程序部署选项：
+ **Deployment policy**（部署策略）– 从以下部署选项中选择：
  + **All at once**（一次部署全部）– 将新版本同时部署到所有实例。在执行部署时，环境中的所有实例将短时间禁用。
  + **Rolling**（滚动）– 批量部署新版本。在部署阶段，每个批次都将禁用，以便按批次中的实例数减少环境的容量。
  + **Rolling with additional batch**（额外批量滚动）– 批量部署新版本，但首先启动新的实例批次以确保部署过程中能够使用完整容量。
  + **Immutable**（不可变的）– 通过执行[不可变更新](environmentmgmt-updates-immutable.md)，将新版本部署到新实例组。
  + **Traffic splitting**（流量拆分）– 将新版本部署到一组新的实例，并在现有应用程序版本与新版本之间临时拆分传入的客户端流量。

对于**滚动部署**和**附加批次滚动部署**部署策略，您可以配置：
+ **Batch size**（批处理大小）– 每个批次中要部署的实例集大小。

  选择**百分比**以配置 Auto Scaling 组中 EC2 实例总数的百分比（最多 100%），或者选择**固定**以配置固定数量的实例（不超过环境的 Auto Scaling 配置中的最大实例数）。

对于**流量拆分**部署策略，您可以配置以下内容：
+ **Traffic split**（流量拆分）– 对于运行您正在部署的新应用程序版本的环境实例，Elastic Beanstalk 转移到这些实例的传入客户端流量的初始百分比。
+ **流量拆分评估时间** – 在初始正常部署之后，Elastic Beanstalk 等待的时间段（以分钟为单位），在经过该时间后，会继续将所有传入的客户端流量转移到正部署的新应用程序版本。

![\[Elastic Beanstalk 应用程序部署配置页面\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/environment-cfg-rollingdeployments.png)


**部署首选项**部分包含与运行状况检查相关的选项。
+ **Ignore health check**（忽略运行状况检查）– 当某个批次在 **Command timeout**（命令超时）内未能达到良好的运行状况时，阻止部署回滚。
+ **Healthy threshold**（正常阈值）– 减小在滚动部署、滚动更新和不可变更新期间将实例视为良好运行的阈值。
+ **Command timeout**（命令超时）– 在取消部署或继续下一批次 [如果设置 **Ignore health check**（忽略运行状况检查）前等待实例达到良好运行状况的时间（以秒为单位）。

![\[Elastic Beanstalk 应用程序部署配置页面\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/environment-cfg-healthchecks.png)


## 滚动部署的工作方式
<a name="environments-cfg-rollingdeployments-method"></a>

在处理某个批次时，Elastic Beanstalk 会将该批次中的所有实例从负载均衡器中分离，部署新的应用程序版本，然后重新挂载这些实例。如果您启用[连接耗尽](environments-cfg-clb.md#using-features.managing.elb.draining)功能，Elastic Beanstalk 会在开始部署之前耗尽每个批次中 EC2 亚马逊实例的现有连接。

在某个批次中的实例重新挂载到负载均衡器之后，Elastic Load Balancing 将等到它们通过最小数量的 Elastic Load Balancing运行状况检查（**Healthy check count threshold**（运行状况检查计数阈值）]，然后开始将流量路由到它们。如果未配置[运行状况检查 URL](environments-cfg-clb.md#using-features.managing.elb.healthchecks)，这可以很快发生，因为实例一旦能接受 TCP 连接便会立即通过运行状况检查。如果配置了运行状况检查 URL，则在更新后的实例返回 `200 OK` 状态代码来响应对运行状况检查 URL 的 `HTTP GET` 请求之前，负载均衡器不会将流量路由到这些实例。

Elastic Beanstalk 将等到一个批次中的所有实例的运行状况正常之后才会转到下一个批次。当采用[基本运行状况报告](using-features.healthstatus.md)时，实例运行状况取决于 Elastic Load Balancing 运行状况检查状态。当某个批次中的所有实例均已通过 Elastic Load Balancing 认为足够数量的运行状况检查之后，该批次便已完成。如果启用[增强型运行状况报告](health-enhanced.md)，则 Elastic Beanstalk 需考虑几个其他因素，包括传入请求的结果。当采用增强型运行状况报告时，对于 Web 服务器环境，所有实例都必须在 2 分钟内通过 12 次连续的运行状况检查并呈现[正常状态](health-enhanced-status.md#health-enhanced-status-ok)；对于工作线程环境，则必须在 3 分钟内通过 18 次运行状况检查。

如果一批实例在[命令超时](#environments-cfg-rollingdeployments-console)范围内未转变为运行状况良好状态，则表示部署失败。在部署失败后，[请检查环境中实例的运行状况](health-enhanced-console.md)以了解有关失败原因的信息。然后使用固定或已知良好版本的应用程序再次执行部署以进行回滚。

如果在一批或多批实例成功完成后部署失败，则已完成的批次将运行新版本的应用程序，而待处理的批次则会继续运行旧版本。您可以通过控制台中的[运行状况页面](health-enhanced-console.md#health-enhanced-console-healthpage)识别在环境中的实例上运行的版本。此页面会显示在环境中的每个实例上执行的最新部署的部署 ID。如果您终止失败部署中的实例，Elastic Beanstalk 将从最新的成功部署中选择运行应用程序版本的实例来替换它们。

## 流量拆分部署的工作方式
<a name="environments-cfg-trafficsplitting-method"></a>

使用流量拆分部署，您可以执行 Canary 测试。在提交到新版本并将所有流量定向到新的应用程序版本之前，您可以将一些传入的客户端流量定向到新的应用程序版本，以便验证应用程序的运行状况。

在流量拆分部署期间，Elastic Beanstalk 在单独的临时 Auto Scaling 组中创建一组新实例。然后，Elastic Beanstalk 指示负载均衡器将您环境中一定百分比的传入流量定向到新实例。接下来，在配置的时间段内，Elastic Beanstalk 会跟踪新实例集的运行状况。如果一切正常，则 Elastic Beanstalk 会将剩余流量转移到新实例，并将这些实例附加到环境的原始 Auto Scaling 组，以便替换旧实例。然后 Elastic Beanstalk 进行清理，即终止旧实例并删除临时 Auto Scaling 组。

**注意**  
在流量拆分部署期间，环境的容量不会发生变化。Elastic Beanstalk 在临时 Auto Scaling 组中启动与部署开始时原始 Auto Scaling 组中相同数量的实例。然后，在部署持续时间内，它会在两个 Auto Scaling 组中维护一定数量的实例。在配置环境的流量拆分评估时间时，请考虑这一事实。

将部署回滚到以前的应用程序版本的速度非常快，不会影响服务到客户端的流量。如果新实例未通过运行状况检查，或者您选择中止部署，则 Elastic Beanstalk 会将流量移回旧实例并终止新实例。通过使用 Elastic Beanstalk 控制台中的环境概述页面，并在 **Environment actions**（环境操作）中选择 **Abort current operation**（中止当前操作），可以中止任何部署。您也可以调用 [AbortEnvironmentUpdate](https://docs.aws.amazon.com/elasticbeanstalk/latest/api/API_AbortEnvironmentUpdate.html)API 或等效 AWS CLI 命令。

流量拆分部署需要 Application Load Balancer。在您使用 Elastic Beanstalk 控制台或 EB CLI 创建环境时，Elastic Beanstalk 默认使用此负载均衡器类型。

## 部署选项命名空间
<a name="environments-cfg-rollingdeployments-namespace"></a>

您可以使用 [`aws:elasticbeanstalk:command`](command-options-general.md#command-options-general-elasticbeanstalkcommand) 命名空间中的[配置选项](command-options.md)来配置您的部署。如果您选择流量拆分策略，则此策略的附加选项会在 [`aws:elasticbeanstalk:trafficsplitting`](command-options-general.md#command-options-general-elasticbeanstalktrafficsplitting) 命名空间中可用。

使用 `DeploymentPolicy` 选项可设置部署类型。支持下列值：

 
+ `AllAtOnce` – 禁用滚动部署并且始终同时部署到所有实例。
+ `Rolling` – 启用标准滚动部署。
+ `RollingWithAdditionalBatch` – 在开始部署之前将启动额外的实例批次，以便保持完整容量。
+ `Immutable` – 对每次部署执行[不可变更新](environmentmgmt-updates-immutable.md)。
+ `TrafficSplitting` – 执行流量拆分部署，以便对应用程序部署进行 Canary 测试。

启用滚动部署时，设置 `BatchSize` 和 `BatchSizeType` 选项以配置每个批次的大小。例如，要部署每个批次中 25% 的实例，请指定以下选项和值：

**Example .ebextensions/rolling-updates.config**  

```
option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: Rolling
    BatchSizeType: Percentage
    BatchSize: 25
```

要部署到每个批次中的五个实例（不管运行的实例数量如何），并且在将任何实例从服务中拉出之前启动额外的批次（五个实例）来运行新版本，请指定以下选项和值。

**Example .ebextensions/rolling-additionalbatch.config**  

```
option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: RollingWithAdditionalBatch
    BatchSizeType: Fixed
    BatchSize: 5
```

要对运行状况检查阈值为**警告**的每个部署执行不可变更新，并在批次中的实例未在 15 分钟超时时间内通过运行状况检查的情况下继续部署，请指定以下选项和值。

**Example .ebextensions/immutable-ignorehealth.config**  

```
option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: Immutable
    HealthCheckSuccessThreshold: Warning
    IgnoreHealthCheck: true
    Timeout: "900"
```

要执行流量拆分部署、将 15% 的客户端流量转发到新应用程序版本并评估运行状况 10 分钟时间，请指定以下选项和值。

**Example .ebextensions/traffic-splitting.config**  

```
option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: TrafficSplitting
  aws:elasticbeanstalk:trafficsplitting:
    NewVersionPercent: "15"
    EvaluationTime: "10"
```

EB CLI 和 Elastic Beanstalk 控制台会对前面的选项应用建议的值。如果您需要使用配置文件来配置相同的项，则必须删除这些设置。有关详细信息，请参阅[建议值](command-options.md#configuration-options-recommendedvalues)。