在亚马逊 ECS 计算平台上部署 - AWS CodeDeploy

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

在亚马逊 ECS 计算平台上部署

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

在开始Amazon ECS 部署之前

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

要求 指定的位置
Amazon ECS 集群 部署组
Amazon ECS 服务 部署组
Application Load Balancer 或Network Load Balancer 部署组
生产侦听器 部署组
测试侦听器(可选) 部署组
两个目标组 部署组
Amazon ECS 任务定义 AppSpec file
容器名称 AppSpec file
容器端口 AppSpec file
Amazon ECS 集

Amazon ECS 集群是任务或服务的逻辑分组。在创建CodeDeploy应用程序的部署组时,您可以指定包含您的 Amazon ECS 服务的 Amazon ECS 集群。有关更多信息,请参阅 Amazon Elastic Container Service 用户指南中的 Amazon ECS 集

Amazon ECS 服务

Amazon ECS 服务在 Amazon ECS 集群中维护和运行指定任务定义实例。必须启用您的亚马逊 ECS 服务CodeDeploy。默认情况下,为亚马逊 ECS 部署启用亚马逊 ECS 服务。创建部署组时,您可以选择部署 Amazon ECS 集群中的 Amazon ECS 服务。有关更多信息,请参阅 Amazon Elastic Contain er Service 用户指南中的 Amazon ECS 服务

Application Load Balancer 或Network Load Balancer

您必须在要通过 Amazon ECS 部署进行更新的亚马逊 ECS 服务中使用Elastic Load Balancing。您可以使用Application Load Balancer 或Network Load Balancer。我们建议使用Application Load Balancer,这样您就可以利用动态端口映射和基于路径的路由和优先级规则等功能。在创建 CodeDeploy 应用程序的部署组时,您需要指定负载均衡器。有关更多信息,请参阅为 A CodeDeploy mazon ECS 部署设置负载均衡器、目标组和侦听器 Amazon 弹性容器服务用户指南中的创建负载均衡器。

一两个听众

侦听器 由负载均衡器用于将流量定向到目标组。必须提供一个生产侦听器。您可以指定可选的第二个测试侦听器,在您运行验证测试时该侦听器可以将流量定向到替换任务集。在创建部署组时,您需要指定一个或两个侦听器。如果您使用 Amazon ECS 控制台创建 Amazon ECS 服务,则会为您创建侦听器。有关更多信息,请参阅《Elastic Load Balancing 用户指南》中的应用程序负载均衡器的侦听器以及 Amazon Elastic Container Service 用户指南中的创建服务

两个 Amazon ECS 目标组

目标组 用于将流量路由到一个注册目标。Amazon ECS 部署需要两个目标组:一个用于您的 Amazon ECS 应用程序的原始任务集,另一个用于其替换任务集。在部署过程中,CodeDeploy 会创建替换任务集,并将流量从原始任务集重新路由到新的任务集。在创建 CodeDeploy 应用程序的部署组时,您需要指定目标组。

在部署期间,CodeDeploy确定哪个目标组与您的 Amazon ECS 服务中具有该状态PRIMARY(这是原始任务集)的任务集相关联并将一个目标组与其关联,然后将另一个目标组与替换任务集相关联。如果执行其他部署,则与当前部署的原始任务集关联的目标组将与下一个部署的替换任务集关联。有关更多信息,请参阅 Elastic Load Balancing 用户指南中的应用程序负载均衡器目标组

Amazon ECS 任务定义

需要任务定义才能运行包含Amazon ECS应用程序的 Docker 容器。您在CodeDeploy应用程序AppSpec文件中指定任务定义的 ARN。有关更多信息,请参阅 Amazon Elastic Container Serv ice 用户指南中的 Amazon EC S 任务定义 AppSpec Amazon ECS 部署的 “资源” 部分

Amazon ECS 应用程序的容器

Docker 容器 是一套打包代码及其依赖项以便应用程序运行的软件。容器可以隔离您的应用程序,使其在不同的计算环境中运行。您的负载均衡器将流量定向到 Amazon ECS 应用程序任务集中的容器。您在CodeDeploy应用程序AppSpec的文件中指定容器的名称。AppSpec文件中指定的容器必须是您的 Amazon ECS 任务定义中指定的容器之一。有关更多信息,请参阅 Amazon Elastic Container Servic e 在《亚马逊弹性容器服务用户指南》 AppSpec Amazon ECS 部署的 “资源” 部分

替换任务集的端口

在您的 Amazon ECS 部署期间,您的负载均衡器将流量定向到CodeDeploy应用程序AppSpec文件中指定的容器上的此端口。您在CodeDeploy应用程序AppSpec文件中指定端口。有关更多信息,请参阅 AppSpec Amazon ECS 部署的 “资源” 部分

Amazon ECS 计算平台上的部署工作流程(高级别)

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

这些步骤包括:

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

  2. 通过指定以下内容设置部署组:

    • 部署组名称。

    • Amazon ECS 集群和服务名称。Amazon ECS 服务的部署控制器必须设置为CodeDeploy。

    • 生产侦听器、可选的测试侦听器以及在部署期间使用的目标组。

    • 部署设置,例如何时将生产流量重新路由到您的 Amazon ECS 服务中的替换 Amazon ECS 任务集,以及何时终止 Amazon ECS 服务中的原始 Amazon ECS 任务集。

    • 可选设置,如触发器、警报和回滚行为。

  3. 指定应用程序规范文件(AppSpec文件)。您可以将其上传到 Amazon S3,以 YAML 或 JSON 格式将其输入控制台,或者使用AWS CLI或 SDK 进行指定。该AppSpec文件指定了部署的 Amazon ECS 任务定义、用于路由流量的容器名称和端口映射,以及 Lambda 函数在部署生命周期挂钩之后运行。容器名称必须是您的 Amazon ECS 任务定义中的容器。有关更多信息,请参阅使用 CodeDeploy 的应用程序修订

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

  5. 检查部署结果。有关更多信息,请参阅监控 CodeDeploy 中的部署

Amazon ECS 部署期间会发生什么

在启动带有测试侦听器的 Amazon ECS 部署之前,您必须配置其组件。有关更多信息,请参阅在开始Amazon ECS 部署之前

下图显示了 Amazon ECS 部署准备开始时这些组件之间的关系。

当部署启动时,开始一次执行一个部署生命周期事件。一些生命周期事件是仅执行AppSpec文件中指定的 Lambda 函数的挂钩。下表中的部署生命周期事件按照执行的顺序列出。有关更多信息,请参阅AppSpec 亚马逊 ECS 部署的 “挂钩” 部分

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

注意

挂钩中的 Lambda 函数是可选的。

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

  2. Install 生命周期事件期间:

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

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

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

    此图显示具有新替换任务集的部署组件。容器化应用程序位于此任务集的内部。任务集包含三个任务。(应用程序可以具有任意数量的任务。) 第二个目标组现与替换任务集关联。

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

  4. 调用了 AllowTestTraffic 事件。在此生命周期事件中,测试侦听器将流量路由到更新后的容器化应用程序中。

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

    验证测试完成后,将会发生以下情况之一:

    • 如果验证失败并配置了回滚,则部署状态标记为 Failed,组件返回其开始部署时的状态。

    • 如果验证失败但未配置回滚,则部署状态标记为 Failed,并且组件保持其当前状态。

    • 如果验证成功,则部署将继续到 BeforeAllowTraffic 挂钩。

    有关更多信息,请参阅在 CodeDeploy 中使用 CloudWatch 警报监控部自动回滚为部署组配置高级选项

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

  7. 调用了 AllowTraffic 事件。生产流量从原始任务集重新路由到替换任务集。下图显示了接收生产流量的替换任务集。

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

  9. 所有事件成功后,部署状态设置为 Succeeded 并删除原始任务集。

上传您的应用程序修订版

将AppSpec文件放入 Amazon S3 或直接将其输入控制台或AWS CLI。有关更多信息,请参阅Application Specification Files

创建您的应用程序和部署组

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

部署应用程序修订版

现在准备好部署组中指定的更新的 Amazon ECS 服务。您可以使用CodeDeploy控制台或 create-deploymen t 命令。可以指定一些参数(包括修订和部署组)来控制部署。

更新应用程序

您可以更新您的应用程序,然后使用CodeDeploy控制台或调用 create-deploymen t 命令来推送修订版。

部署已停止且失败

您可以使用CodeDeploy控制台或 stop-deploy ment 命令来停止部署。当您尝试停止部署时,将发生下面三种情况之一:

  • 部署将停止,并且操作将返回成功状态。在这种情况下,没有更多的部署生命周期事件将在已停止部署的部署组上运行。

  • 部署将不会立即停止,并且操作将返回挂起状态。在这种情况下,一些部署生命周期事件可能仍在部署组上运行。在挂起的操作完成后,停止部署的后续调用将返回成功状态。

  • 部署无法停止,并且操作将返回错误。有关更多信息,请参阅AWS CodeDeploy API 参考中的错误信息和常见错误

重新部署和部署回滚

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

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

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

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

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

有关更多信息,请参阅使用 CodeDeploy 重新部署和回滚部署

通过 Amazon ECS 蓝/绿部署AWS CloudFormation

您可以使用通过AWS CloudFormation来管理 Amazon ECS 蓝/绿部署CodeDeploy。有关更多信息,请参阅通过创建 Amazon ECS 蓝/绿部署 AWS CloudFormation

注意

亚太地区(大阪)区域无法使用AWS CloudFormation管理 Amazon ECS 蓝/绿部署。