

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

# Amazon ECS 计算平台上的部署
<a name="deployment-steps-ecs"></a>

本主题提供有关使用 Amazon ECS 计算平台的 CodeDeploy 部署组件和工作流程的信息。

**Topics**
+ [在开始 Amazon ECS 部署之前](#deployment-steps-prerequisites-ecs)
+ [Amazon ECS 计算平台上的部署工作流（高级）](#deployment-process-workflow-ecs)
+ [在 Amazon ECS 部署过程中发生的事件](#deployment-steps-what-happens)
+ [上传应用程序修订](#deployment-steps-uploading-your-app-ecs)
+ [创建应用程序和部署组](#deployment-steps-registering-app-deployment-groups-ecs)
+ [部署应用程序修订](#deployment-steps-deploy-ecs)
+ [更新应用程序](#deployment-steps-updating-your-app-ecs)
+ [停止和失败的部署](#deployment-stop-fail-ecs)
+ [重新部署和部署回滚](#deployment-rollback-ecs)
+ [通过 Amazon ECS blue/green 部署 AWS CloudFormation](#deployment-steps-ecs-cf)

## 在开始 Amazon ECS 部署之前
<a name="deployment-steps-prerequisites-ecs"></a>

 在开始 Amazon ECS 应用程序部署之前，必须准备好以下事项。有些要求是在创建部署组时指定的，有些则在 AppSpec 文件中指定。


****  

| 要求 | 指定的位置 | 
| --- | --- | 
| Amazon ECS 集群 | 部署组 | 
| Amazon ECS 服务 | 部署组 | 
| 应用程序负载均衡器和网络负载均衡器 | 部署组 | 
| 生产侦听器 | 部署组 | 
| 测试侦听器（可选） | 部署组 | 
| 两个目标组 | 部署组 | 
| Amazon ECS 任务定义 | AppSpec 文件 | 
| 容器名称 | AppSpec 文件 | 
| 容器端口 | AppSpec 文件 | 

**Amazon ECS 集群**  
Amazon ECS *集群*是任务或服务的逻辑分组。在创建 CodeDeploy 应用程序的部署组时，您可以指定包含您的 Amazon ECS 服务的 Amazon ECS 集群。有关更多信息，请参阅《Amazon Elastic Container Service 用户指南》**中的 [Amazon ECS 集群](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_clusters.html)。

**Amazon ECS 服务**  
Amazon ECS *服务* 维护并运行 Amazon ECS 集群中任务定义的指定实例。必须启用您的 Amazon ECS 服务 CodeDeploy。默认情况下，Amazon ECS 部署已启用 Amazon ECS 服务。当您创建部署组时，您需要选择部署 Amazon ECS 集群中的 Amazon ECS 服务。有关更多信息，请参阅《Amazon Elastic Container Service 用户指南》**中的 [Amazon ECS 服务](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html)。

**应用程序负载均衡器和网络负载均衡器**  
 您必须将 Elastic Load Balancing 与要通过部署 Amazon ECS 进行更新的 Amazon ECS 服务一起使用。您可以使用应用程序负载均衡器或网络负载均衡器。我们建议使用应用程序负载均衡器，以便您可以利用动态端口映射和基于路径的路由和优先级规则等功能。您可以在创建 CodeDeploy 应用程序的部署组时指定负载均衡器。有关更多信息，请参阅《Amazon Elastic Container Service 用户指南》**中的[为 A CodeDeploy mazon ECS 部署设置负载均衡器、目标组和侦听器](deployment-groups-create-load-balancer-for-ecs.md)和[创建负载均衡器](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-load-balancer.html)。

**一个或两个侦听器**  
*侦听器* 由负载均衡器用于将流量定向到目标组。必须提供一个生产侦听器。您可以指定可选的第二个测试侦听器，在您运行验证测试时该侦听器可以将流量定向到替换任务集。在创建部署组时，您需要指定一个或两个侦听器。如果您使用 Amazon ECS 控制台创建 Amazon ECS 服务，系统会为您创建侦听器。有关更多信息，请参阅《Elastic Load Balancing 用户指南》**中的[应用程序负载均衡器的侦听器](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listener.html)和《Amazon Elastic Container Service 用户指南》**中的[创建服务](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service.html)。

**两个 Amazon ECS 目标群体**  
 *目标组* 用于将流量路由到一个注册目标。一个 Amazon ECS 部署需要两个目标组：一个用于 Amazon ECS 应用程序的原始任务集，另一个用于其替换任务集。在部署期间， CodeDeploy 创建替换任务集并将流量从原始任务集重新路由到新任务集。在创建 CodeDeploy 应用程序的部署组时，您需要指定目标组。  
 在部署过程中， CodeDeploy 确定哪个目标组与您的 Amazon ECS 服务中具有状态的任务集相关联`PRIMARY`（这是原始任务集），并将一个目标组与该任务集相关联，然后将另一个目标组与替换任务集相关联。如果执行其他部署，则与当前部署的原始任务集关联的目标组将与下一个部署的替换任务集关联。有关更多信息，请参阅《Elastic Load Balancing 用户指南》**中的[应用程序负载均衡器的目标组](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html)。

**Amazon ECS 任务定义**  
 需要*任务定义* 才能运行包含 Amazon ECS 应用程序的 Docker 容器。您可以在 CodeDeploy 应用程序文件中指定任务定义的 AppSpec ARN。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的 [Amazon ECS 任务定义](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html)和[AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

**您的 Amazon ECS 应用程序的容器**  
 Docker *容器* 是一套打包代码及其依赖项以便应用程序运行的软件。容器可以隔离您的应用程序，使其在不同的计算环境中运行。负载均衡器将流量定向到 Amazon ECS 应用程序任务集中的容器。你可以在 CodeDeploy 应用程序 AppSpec 的文件中指定容器的名称。 AppSpec 文件中指定的容器必须是 Amazon ECS 任务定义中指定的容器之一。有关更多信息，请参阅《Amazon Elastic Container Service 用户指南》**中的[什么是 Amazon Elastic Container Service？](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)和[AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

**您的替换任务集的端口**  
 在 Amazon ECS 部署期间，您的负载均衡器会将流量引导到 CodeDeploy应用程序 AppSpec 文件中指定的容器上的此*端口*。你可以在 CodeDeploy 应用程序 AppSpec 的文件中指定端口。有关更多信息，请参阅 [AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

## Amazon ECS 计算平台上的部署工作流（高级）
<a name="deployment-process-workflow-ecs"></a>

下图显示部署更新的 Amazon ECS 服务的主要步骤。

![\[如何将应用程序作为任务集 CodeDeploy 部署到 Amazon ECS 中。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/deployment-process-ecs.png)


这些步骤包括：

1. 通过指定一个唯一代表您要部署的内容的名称来创建 AWS CodeDeploy 应用程序。要部署 Amazon ECS 应用程序，请在您的 AWS CodeDeploy 应用程序中选择 Amazon ECS 计算平台。 CodeDeploy 在部署期间使用应用程序来引用正确的部署组件，例如部署组、目标组、侦听器、流量重新路由行为以及应用程序修订。有关更多信息，请参阅 [使用创建应用程序 CodeDeploy](applications-create.md)。

1. 通过指定以下内容设置部署组：
   +  部署组名称。
   +  Amazon ECS 集群和服务名称。Amazon ECS 服务的部署控制器必须设置为 CodeDeploy。
   +  生产侦听器、可选的测试侦听器以及在部署期间使用的目标组。
   +  部署设置，例如何时将生产流量重新路由到 Amazon ECS 服务中的替换 Amazon ECS 任务集以及何时终止 Amazon ECS 服务中的原始Amazon ECS任务集。
   +  可选设置，如触发器、警报和回滚行为。

1. 指定*应用程序规范文件*（AppSpec 文件）。您可以将其上传到 Amazon S3，以 YAML 或 JSON 格式将其输入控制台，或者使用 AWS CLI 或软件开发工具包进行指定。该 AppSpec 文件指定了部署的 Amazon ECS 任务定义、用于路由流量的容器名称和端口映射，以及在部署生命周期挂钩之后运行的 Lambda 函数。容器名称必须是您的 Amazon ECS 任务定义中的容器。有关更多信息，请参阅 [正在处理的应用程序修订版 CodeDeploy](application-revisions.md)。

1. 部署您的应用程序修订版。 AWS CodeDeploy 将流量从 Amazon ECS 服务中任务集的原始版本重新路由到新的替代任务集。部署组中指定的目标组用于处理传输到原始和替换任务集的流量。在部署完成后，会终止原始任务集。您可以指定一个可选的测试侦听器，以便在将流量重新路由到替换版本之前为其提供测试流量。有关更多信息，请参阅 [使用创建部署 CodeDeploy](deployments-create.md)。

1. 检查部署结果。有关更多信息，请参阅 [监控中的部署 CodeDeploy](monitoring.md)。

## 在 Amazon ECS 部署过程中发生的事件
<a name="deployment-steps-what-happens"></a>

在启动具有测试侦听器的 Amazon ECS 部署之前，您必须配置其组件。有关更多信息，请参阅 [在开始 Amazon ECS 部署之前](#deployment-steps-prerequisites-ecs)。

 下图显示了在准备好启动 Amazon ECS 部署时，这些组件之间的关系。

![\[在准备好开始 Amazon ECS 部署时，负载均衡器、侦听器、目标组和任务集之间的关系。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-1.png)


当部署启动时，开始一次执行一个部署生命周期事件。某些生命周期事件是仅执行文件中指定的 Lambda 函数的 AppSpec 挂钩。下表中的部署生命周期事件按照执行的顺序列出。有关更多信息，请参阅 [AppSpec 亚马逊 ECS 部署的 “挂钩” 部分](reference-appspec-file-structure-hooks.md#appspec-hooks-ecs)。


| 生命周期事件 | 生命周期事件操作 | 
| --- | --- | 
| BeforeInstall（Lambda 函数的挂钩） | 运行 Lambda 函数。 | 
| 安装 | 设置替换任务集。 | 
| AfterInstall（Lambda 函数的挂钩） | 运行 Lambda 函数。 | 
| AllowTestTraffic | 将流量从测试侦听器路由至目标组 2。 | 
| AfterAllowTestTraffic（Lambda 函数的挂钩） | 运行 Lambda 函数。 | 
| BeforeAllowTraffic（Lambda 函数的挂钩） | 运行 Lambda 函数。 | 
| AllowTraffic | 将流量从生产侦听器路由至目标组 2。 | 
| AfterAllowTraffic | 运行 Lambda 函数。 | 



**注意**  
挂钩中的 Lambda 函数是可选的。

1. <a name="ecs-before-install"></a>

****

   在文件中执行`BeforeInstall`挂钩中指定的任何 Lambda 函数。 AppSpec 

1. <a name="ecs-install"></a>

****

   在 `Install` 生命周期事件期间：

   1.  在您的 Amazon ECS 服务中创建替换任务集。

   1.  更新后的容器化应用程序安装到替换任务集中。

   1.  第二个目标组与替换任务集关联。

    此图显示具有新替换任务集的部署组件。容器化应用程序位于此任务集的内部。任务集包含三个任务。（应用程序可以具有任意数量的任务。） 第二个目标组现与替换任务集关联。  
![\[具有新的替换任务集的部署组件。容器化应用程序位于此任务集的内部。任务集包含三个任务。第二个目标组现与替换任务集关联。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-2.png)

1. <a name="ecs-after-install"></a>

****

   在文件中执行`AfterInstall`挂钩中指定的任何 Lambda 函数。 AppSpec 

1. <a name="ecs-allow-test-traffic"></a>

****

   调用了 `AllowTestTraffic` 事件。在此生命周期事件中，测试侦听器将流量路由到更新后的容器化应用程序中。  
![\[测试侦听器将流量路由到更新后的容器化应用程序中。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-3.png)

1. <a name="ecs-after-allow-test-traffic"></a>

****

   在文件中执行`AfterAllowTestTraffic`挂钩中指定的任何 Lambda 函数。 AppSpec Lambda 函数可以使用测试流量来验证部署。例如，Lambda 函数可以向测试侦听器提供流量，并跟踪替换任务集的指标。如果配置了回滚，则可以配置 CloudWatch 警报，在 Lambda 函数中的验证测试失败时触发回滚。

    验证测试完成后，将会发生以下情况之一：
   +  如果验证失败并配置了回滚，则部署状态标记为 `Failed`，组件返回其开始部署时的状态。
   +  如果验证失败但未配置回滚，则部署状态标记为 `Failed`，并且组件保持其当前状态。
   +  如果验证成功，则部署将继续到 `BeforeAllowTraffic` 挂钩。

    有关更多信息，请参阅 [使用 CloudWatch 警报监控部署 CodeDeploy](monitoring-create-alarms.md)、[自动回滚](deployments-rollback-and-redeploy.md#deployments-rollback-and-redeploy-automatic-rollbacks) 和 [为部署组配置高级选项](deployment-groups-configure-advanced-options.md)。

1. <a name="ecs-before-allow-traffic"></a>

****

   在文件中执行`BeforeAllowTraffic`挂钩中指定的任何 Lambda 函数。 AppSpec 

1. <a name="ecs-allow-traffic"></a>

****

   调用了 `AllowTraffic` 事件。生产流量从原始任务集重新路由到替换任务集。下图显示了接收生产流量的替换任务集。  
![\[替换任务集接收生产流量。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-4.png)

1. <a name="ecs-after-allow-traffic"></a>

****

   在文件中执行`AfterAllowTraffic`挂钩中指定的任何 Lambda 函数。 AppSpec 

1. 

****

   所有事件成功后，部署状态设置为 `Succeeded` 并删除原始任务集。  
![\[所有事件均成功完成。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-6.png)

## 上传应用程序修订
<a name="deployment-steps-uploading-your-app-ecs"></a>

将 AppSpec 文件放入 Amazon S3 或将其直接输入控制台或 AWS CLI。有关更多信息，请参阅 [CodeDeploy 应用程序规范 (AppSpec) 文件](application-specification-files.md)。

## 创建应用程序和部署组
<a name="deployment-steps-registering-app-deployment-groups-ecs"></a>

Amazon ECS 计算平台上的 CodeDeploy 部署组可识别向更新后的 Amazon ECS 应用程序提供流量的侦听器和部署期间使用的两个目标组。部署组还定义一组配置选项，例如警报和回滚配置。

## 部署应用程序修订
<a name="deployment-steps-deploy-ecs"></a>

现在，您已准备好部署在部署组中指定的更新的 Amazon ECS 服务。您可以使用 CodeDeploy 控制台或[创建部署命令](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html)。可以指定一些参数（包括修订和部署组）来控制部署。

## 更新应用程序
<a name="deployment-steps-updating-your-app-ecs"></a>

您可以对应用程序进行更新，然后使用 CodeDeploy 控制台或调用 [create-](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html) deployment 命令来推送修订。

## 停止和失败的部署
<a name="deployment-stop-fail-ecs"></a>

您可以使用 CodeDeploy 控制台或[停止部署](https://docs.aws.amazon.com/cli/latest/reference/deploy/stop-deployment.html)命令来停止部署。当您尝试停止部署时，将发生下面三种情况之一：
+ 部署将停止，并且操作将返回成功状态。在这种情况下，没有更多的部署生命周期事件将在已停止部署的部署组上运行。
+ 部署将不会立即停止，并且操作将返回挂起状态。在这种情况下，一些部署生命周期事件可能仍在部署组上运行。在挂起的操作完成后，停止部署的后续调用将返回成功状态。
+ 部署无法停止，并且操作将返回错误。有关更多信息，请参阅 AWS CodeDeploy API 参考中的[错误信息和](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_ErrorInformation.html)[常见错误](https://docs.aws.amazon.com/codedeploy/latest/APIReference/CommonErrors.html)。

## 重新部署和部署回滚
<a name="deployment-rollback-ecs"></a>

CodeDeploy 通过将流量从替换任务集重新路由到原始任务集来实现回滚。

您可以对部署组进行配置，使之在满足特定条件（例如部署失败或达到警报监控阈值）时自动回滚部署。您还可以在单个部署中覆盖为部署组指定的回滚设置。

另外，也可以选择通过手动重新部署以前部署的版本回滚失败的部署。

在所有情况下，新的或回滚的部署都分配有自己的部署 ID。 CodeDeploy 控制台显示列出自动部署结果的部署列表。

如果进行重新部署，则与当前部署的原始任务集关联的目标组将与重新部署的替换任务集关联。

有关更多信息，请参阅 [使用重新部署和回滚部署 CodeDeploy](deployments-rollback-and-redeploy.md)。

## 通过 Amazon ECS blue/green 部署 AWS CloudFormation
<a name="deployment-steps-ecs-cf"></a>

您可以使用 AWS CloudFormation 通过管理 Amazon ECS blue/green 部署 CodeDeploy。有关更多信息，请参阅 [通过创建 Amazon ECS blue/green 部署 CloudFormation](deployments-create-ecs-cfn.md)。

**注意**  
亚太地区（大阪）区域 CloudFormation 不支持使用管理 Amazon ECS blue/green 部署。