

# 通过替换任务来部署 Amazon ECS 服务
<a name="deployment-type-ecs"></a>

当创建一项使用*滚动更新*（`ECS`）部署类型的服务时，Amazon ECS 服务调度器会将当前正在运行的任务替换为新任务。在滚动更新期间 Amazon ECS 在服务中添加或删除的任务数量由服务部署配置控制。

Amazon ECS 使用以下参数来确定任务数量：
+ `minimumHealthyPercent` 表示在滚动部署期间或容器实例耗尽时应为服务运行且状态良好的任务数下限，以服务所需的任务数的百分比表示。此值向上取整。例如，如果最小运行状况百分比为 `50`，并且所需的任务计数为 4，则调度器可以在启动两个新任务之前停止两个现有任务。同样，如果最小运行状况百分比为 75%，所需任务计数为 2，则由于结果值也为 2，调度器无法停止任何任务。
+ `maximumPercent` 表示在滚动部署期间或容器实例耗尽时应为服务运行的任务数上限，以服务所需的任务数的百分比表示。此值向下取整。例如，如果最大百分比为 `200` 且目标任务计数为 4，则调度器可以在停止四个现有任务之前启动四个新任务。同样，如果最大百分比为 `125`，且目标任务计数为三，则调度器无法启动任何任务，因为结果值也是三。

在滚动部署期间，当任务运行状况不佳时，Amazon ECS 会替换它们，以维护您的服务的 `minimumHealthyPercent` 并保护可用性。运行状况不佳的任务将使用它们所属的同一服务修订进行替换。这样可以确保源修订中运行状况不佳的任务替换与目标修订中的任务失败无关。如果 `maximumPercent` 设置允许，则计划程序会先启动替换任务，然后再停止运行状况不佳的任务。如果 `maximumPercent` 参数限制计划程序先启动替换任务，则计划程序会一次停止一个运行状况不佳的任务以释放容量，然后再启动替换任务。

**重要**  
设置最小运行状况百分比或最大百分比时，应确保调度器在启动部署时可以停止或启动至少一个任务。如果您的服务由于部署配置无效而停滞的部署，将发送服务事件消息。有关更多信息，请参阅 [因为服务部署配置，服务（*service-name*）无法在部署期间停止或启动任务。更新 minimumHealthyPercent 或 maximumPercent 值，然后重试。](service-event-messages-list.md#service-event-messages-7)。

滚动部署有 2 种方法可以让您快速识别服务部署失败的时间：
+ [Amazon ECS 部署断路器如何检测故障](deployment-circuit-breaker.md)
+ [CloudWatch 警报如何检测 Amazon ECS 部署故障](deployment-alarm-failure.md)

可以单独使用这些方法，也可以一起使用。当同时使用这两种方法时，只要满足任一故障方法的故障标准，部署就会设置为失败。

使用以下准则来帮助确定要使用哪种方法：
+ 断路器 — 若要在任务无法启动时停止部署，请使用此方法。
+ CloudWatch 警报 — 若要根据应用程序指标停止部署，请使用此方法。

两种方法都支持回滚到之前的服务修订版本。

## 容器映像解析
<a name="deployment-container-image-stability"></a>

默认情况下，Amazon ECS 会将任务定义中指定的容器映像标签解析为容器映像摘要。如果您创建的服务要运行和维护单个任务，则该任务将用于为任务中的容器建立映像摘要。如果您创建的服务要运行和维护多个任务，则服务调度器在部署期间启动的第一个任务将用于为任务中的容器建立映像摘要。

如果尝试建立容器映像摘要时失败三次或以上，则部署将继续，但不再进行映像摘要解析。如果启用了部署断路器，则部署还会失败并回滚。

建立容器映像摘要后，Amazon ECS 将使用摘要来启动任何其他所需的任务，以及用于任何未来的服务更新。这会导致服务中的所有任务始终运行相同的容器映像，从而确保软件的版本一致性。

您可以使用容器定义中的 `versionConsistency` 参数为任务中的每个容器配置此行为。有关更多信息，请参阅 [versionConsistency](task_definition_parameters.md#ContainerDefinition-versionconsistency)。

**注意**  
低于 `1.31.0` 版本的 Amazon ECS 代理不支持映像摘要解析。代理版本：`1.31.0``1.69.0`仅支持对推送到 Amazon ECR 存储库的映像进行映像摘要解析。代理版本 `1.70.0` 或更高版本支持所有映像的映像摘要解析。
映像摘要解析的最低 Fargate Linux 平台版本为 `1.3.0`。映像摘要解析的最低 Fargate Windows 平台版本为 `1.0.0`。
Amazon ECS 不会捕获由 Amazon ECS 管理的附加容器摘要，例如 Amazon GuardDuty 安全代理或 Service Connect 代理。
要减少具有多个任务的服务中的与容器映像解析相关的可能延迟，请在 EC2 容器实例上运行 Amazon ECS 代理版本 `1.83.0` 或更高版本。要避免可能的延迟，请在任务定义中指定容器映像摘要。
如果您创建的服务所需任务数为零，则 Amazon ECS 将无法建立容器摘要，直到您触发另一个所需任务数大于零的服务部署。
若要建立更新的映像摘要，可以强制进行新的部署。此更新后的摘要将用于启动新任务，不会影响已在运行的任务。有关强制新部署的更多信息，请参阅 *Amazon ECS API 参考*中的 [forceNewDeployment](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html#ECS-UpdateService-request-forceNewDeployment)。
使用 EC2 容量提供程序时，如果在初始部署期间容量不足以启动任务，则软件版本一致性可能会无法保证。为确保即使在容量有限的情况下也能保持版本一致性，请在任务定义容器配置中明确设置 `versionConsistency: "enabled"`，而不是依赖默认行为。这将导致 Amazon ECS 等到容量可用后再继续部署。