

# 使用提前成功标准提前完成 Amazon ECS 滚动部署
<a name="early-success-criteria"></a>

当您更新使用滚动部署策略的服务时，Amazon ECS 会启动一次部署，将源服务修订上的任务替换为目标服务修订上的新任务。满足以下所有条件后，Amazon ECS 将完成部署：
+ 目标服务修订达到所需数量的 100%，且其所有任务均在运行并且处于正常状态。
+ 部署断路器或 CloudWatch 警报未触发回滚。
+ 烘焙时间已结束（如果您使用基于警报的回滚）。
+ 源服务修订上的任务已完成清理。

借助提前成功标准，您可以根据工作负载的置信度和运营需求，配置 Amazon ECS 完成部署的时机。

可以在以下场景中使用提前成功标准：
+ 您确信目标服务修订上一定比例的正常任务足以完成部署，并希望提前完成部署，以便执行后续部署、CI/CD 管道及其他依赖操作。
+ 您的服务在专用或受限容量上运行（例如 GPU 加速型推理工作负载），由于硬件可用性限制，某些任务的启动时间可能较长。
+ 您的服务在源服务修订上存在耗尽速度较慢以及可能因其他原因导致需要保持部署开放状态的任务，例如具有长期连接的任务。
+ 您希望部署断路器或 CloudWatch 警报回滚功能，以在目标服务修订达到您定义的运行状况级别之前保护部署，并且不希望在此之后触发回滚。

可以使用部署配置中的以下设置来定义条件。

## 运行正常百分比
<a name="early-success-criteria-healthy-percent"></a>

`earlySuccessCriteria.healthyPercent` 表示在 Amazon ECS 完成部署之前，目标服务修订上必须正在运行且处于正常状态的任务数量，以服务所需任务数的百分比表示。此值向上取整。例如，假定运行正常百分比为 90，所需任务数为 100，则 Amazon ECS 将在 90 个任务运行正常后完成部署。如果运行正常百分比为 50，所需任务数为 3，则 Amazon ECS 将在 2 个任务运行正常后完成部署。

任务运行正常是指任务通过您为服务配置的运行状况检查。

Amazon ECS 将通过常规服务扩缩操作，在部署之外启动目标服务修订上的所有剩余任务。Amazon ECS 完成部署后，部署断路器和 CloudWatch 警报回滚将不再生效。

运行正常百分比必须介于服务 `minimumHealthyPercent` 与 100 之间。

## 源服务修订清理
<a name="early-success-criteria-source-cleanup"></a>

`earlySuccessCriteria.sourceServiceRevisionCleanup` 决定 Amazon ECS 何时清理源服务修订中的任务。该参数有两个值：`BLOCKING` 和 `DEFERRED`。

使用 `BLOCKING` 时，部署将按以下顺序进行：

1. 运行正常百分比的任务均在目标服务修订上运行并且处于正常状态。

1. 烘焙时间已结束（如果您使用基于警报的回滚）。

1. Amazon ECS 会清理源服务修订上的任务。

1. Amazon ECS 完成部署。

使用 `DEFERRED` 时，部署将按以下顺序进行：

1. 运行正常百分比的任务均在目标服务修订上运行并且处于正常状态。

1. 烘焙时间已结束（如果您使用基于警报的回滚）。

1. Amazon ECS 完成部署。

1. Amazon ECS 会在部署之外清理源服务修订上的任务。

使用 `DEFERRED` 时，Amazon ECS 会尝试在最长两周的期限内清理源服务修订上的任务。

`DEFERRED` 适用于具有长期连接或任务缩容保护的服务，其中来自源服务修订的任务可能需要在不保持部署打开的情况下继续运行。当耗尽源服务修订是一项长尾操作且您的 CI/CD 工具存在时间限制时，此功能将非常实用。Amazon ECS 会在达到运行正常百分比时完成部署，源服务修订上的任务将在部署之外耗尽。

## Amazon ECS 如何评估提前成功标准
<a name="early-success-criteria-evaluation"></a>

满足以下所有条件后，Amazon ECS 将完成使用提前成功标准的部署：
+ 目标服务修订上正在运行且处于正常状态的任务数，至少应达到所需数量的正常百分比（向上取整）。
+ 部署断路器或 CloudWatch 警报未触发回滚。
+ 烘焙时间已结束（如果您使用基于警报的回滚）。
+ 如果源服务修订清理设置为 `BLOCKING`，则源服务修订上的任务将被清除。

Amazon ECS 将在目标服务修订上至少启动一项任务，等待其进入正常状态后才会评估运行正常百分比。


**运行正常任务计数示例**  

| 预期数量 | 运行正常百分比 | 所需运行正常任务数（向上取整） | 
| --- | --- | --- | 
| 2 | 50 | 1 | 
| 3 | 50 | 2 | 
| 10 | 80 | 8 | 
| 100 | 90 | 90 | 
| 10 | 100 | 10 | 

## 配置提前成功标准
<a name="early-success-criteria-configure"></a>

您可以使用控制台或 Amazon CLI 为新服务或现有服务配置提前成功标准。

控制台  
在创建服务或更新服务流程中，在“部署配置”下，开启提前成功标准。输入一个“运行正常百分比”值，然后选择一个“源服务修订清理”选项：“阻止”或“延后”。

Amazon CLI  
创建或更新服务时，在 `--deployment-configuration` 参数中设置 `earlySuccessCriteria` 值。  

```
aws ecs update-service \
    --cluster MyCluster \
    --service MyService \
    --deployment-configuration '{
        "strategy": "ROLLING",
        "earlySuccessCriteria": {
            "enable": true,
            "healthyPercent": 90,
            "sourceServiceRevisionCleanup": "BLOCKING"
        }
    }'
```

## 您会观察到的情况
<a name="early-success-criteria-observe"></a>
+ `DescribeServiceDeployments` 会返回部署状态和已配置的提前成功标准。部署执行期间，任务计数为实时数据。部署完成后，任务计数为部署完成时的快照。这同时适用于 `BLOCKING` 和 `DEFERRED`。
+ 要查看某项服务的实时任务计数，请使用 `DescribeServices`。
+ 按状态 `SUCCESSFUL` 筛选 `ListServiceDeployments` 时，将包含提前完成的部署。
+ 部署状态更改事件和 Amazon CloudTrail 记录会显示从 `IN_PROGRESS` 到 `SUCCESSFUL` 的标准生命周期。提前成功标准不会增加新的部署状态。

## 注意事项
<a name="early-success-criteria-considerations"></a>

在使用提前成功标准之前，请查看以下注意事项。

回滚监控在部署期间生效  
部署断路器和 CloudWatch 警报回滚是部署的故障检测机制。这两种机制可在部署进行期间回滚部署。在 Amazon ECS 完成部署后，这些机制将不再回滚服务，包括在 Amazon ECS 通过常规服务扩缩启动任何剩余任务时。部署完成后，将无法停止部署。将运行正常百分比设置为您确信目标服务修订将处于正常状态的百分比。

`DEFERRED` 清理  
使用 `DEFERRED` 时，Amazon ECS 会在完成部署后清理源服务修订上的任务。如果源服务修订上的任务在部署后超过两周仍受到任务缩容保护或其他机制保护，则 Amazon ECS 将无法清理这些任务。使用 `DescribeServices` 监控源服务修订上的任务。