将 CodeDeploy 与 Amazon EC2 Auto Scaling 集成 - Amazon CodeDeploy
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将 CodeDeploy 与 Amazon EC2 Auto Scaling 集成

CodeDeploy 支持 Amazon EC2 Auto Scaling,这是一项 Amazon 服务,可根据您定义的条件自动启动 Amazon EC2 实例。这些条件可以包括:在指定时间间隔内超出 CPU 利用率、磁盘读写、入站或出站网络流量的限制。Amazon EC2 Auto Scaling 会终止不再需要的实例。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的什么是 Amazon EC2 Auto Scaling?

当新 Amazon EC2 实例作为 Amazon EC2 Auto Scaling 组的一部分启动时,CodeDeploy 可自动将您的修订部署到这些新实例。您还可以将 CodeDeploy 中的部署与在 Elastic Load Balancing 负载均衡器中注册的 Amazon EC2 Auto Scaling 实例进行协调。有关更多信息,请参阅 Integrating CodeDeploy with Elastic Load Balancing在 Elastic Load Balancing 中为 CodeDeploy Amazon EC2 部署设置负载均衡器

注意

如果您将多个部署组与单个 Amazon EC2 Auto Scaling 组相关联,则可能会遇到问题。例如,如果一个部署失败,则实例将开始关闭,但已在运行的其他部署可能在一个小时后才超时。有关更多信息,请参阅避免将多个部署组与一个 Amazon EC2 Auto Scaling 组关联深层剖析:CodeDeploy 与 Amazon EC2 Auto Scaling 的集成

将 CodeDeploy 应用程序部署到 Amazon EC2 Auto Scaling 组

要将 CodeDeploy 应用程序修订部署到 Amazon EC2 Auto Scaling 组,请执行以下操作:

  1. 创建或找到允许 Amazon EC2 Auto Scaling 组使用 Amazon S3 的 IAM 实例配置文件。有关更多信息,请参阅步骤 4:为您的 Amazon EC2 实例创建 IAM 实例配置文件

    注意

    您还可以使用 CodeDeploy 将修订从 GitHub 存储库部署到 Amazon EC2 Auto Scaling 组。尽管 Amazon EC2 实例仍需要一个 IAM 实例配置文件,但该配置文件不需要任何额外的权限即可从 GitHub 存储库部署。

  2. 创建或使用 Amazon EC2 Auto Scaling 组,在启动配置或模板中指定 IAM 实例配置文件。有关更多信息,请参阅在 Amazon EC2 实例上运行的应用程序的 IAM 角色

  3. 创建或找到允许 CodeDeploy 创建一个包含 Amazon EC2 Auto Scaling 组的部署组的服务角色。

  4. 使用 CodeDeploy 创建一个部署组,指定 Amazon EC2 Auto Scaling 组名称、服务角色和其他一些选项。有关更多信息,请参阅 为就地部署创建部署组(控制台)为就地部署创建部署组(控制台)

  5. 使用 CodeDeploy 将您的修订部署到包含 Amazon EC2 Auto Scaling 组的部署组。

有关更多信息,请参阅教程:使用CodeDeploy将应用程序部署到 Auto Scaling 组

在 Auto Scaling 横向缩减事件期间启用终止部署

终止部署是一种在 Auto Scaling 横向缩减事件发生时自动激活的 CodeDeploy 部署。CodeDeploy 在 Auto Scaling 服务终止实例之前立即执行终止部署。在终止部署期间,CodeDeploy 不会部署任何内容。相反,它会生成生命周期事件,您可以将其挂接到自己的脚本以启用自定义关闭功能。例如,您可以将 ApplicationStop 生命周期事件挂接到一个脚本,该脚本会在实例被终止之前妥善关闭您的应用程序。

有关 CodeDeploy 在终止部署期间生成的生命周期事件的列表,请参阅生命周期事件挂钩可用性

如果终止部署因任何原因失败,CodeDeploy 将允许实例终止操作继续进行。这意味着,即使 CodeDeploy 没有将全部(或任何)生命周期事件运行到完成,实例也将被关闭。

如果您不启用终止部署,Auto Scaling 服务仍会在发生横向缩减事件时终止 Amazon EC2 实例,但 CodeDeploy 不会生成生命周期事件。

注意

无论您是否启用终止部署,如果 Auto Scaling 服务在 CodeDeploy 部署进行期间终止某个 Amazon EC2 实例,那么 Auto Scaling 和 CodeDeploy 服务生成的生命周期事件之间可能会出现争用情况。例如,Terminating 生命周期事件(由 Auto Scaling 服务生成)可能会覆盖 ApplicationStart 事件(由 CodeDeploy 部署生成)。在这种情况下,您可能会遇到 Amazon EC2 实例终止失败或 CodeDeploy 部署失败的情况。

让 CodeDeploy 能够执行终止部署

安装完终止挂钩后,横向缩减(终止)事件将按如下方式展开:

  1. Auto Scaling 服务(或者简称为 Auto Scaling)确定需要发生横向缩减事件,然后与 EC2 服务联系以终止 EC2 实例。

  2. EC2 服务开始终止 EC2 实例。实例进入 Terminating 状态,然后进入 Terminating:Wait 状态。

  3. Terminating:Wait 期间,Auto Scaling 会运行附加到 Auto Scaling 组的所有生命周期挂钩,包括 CodeDeploy 安装的终止挂钩。

  4. 终止挂钩会向 CodeDeploy 轮询的 Amazon SQS 队列发送通知。

  5. 收到通知后,CodeDeploy 会解析消息,执行一些验证,然后执行终止部署。

  6. 终止部署运行时,CodeDeploy 每五分钟向 Auto Scaling 发送一次心跳,让其知道该实例仍在运行中。

  7. 到目前为止,EC2 实例仍处于 Terminating:Wait 状态(如果您启用了 Auto Scaling 组暖池,则可能处于 Warmed:Pending:Wait 状态)。

  8. 部署完成后,CodeDeploy 会指示 Auto Scaling CONTINUE EC2 终止过程,无论终止部署是成功还是失败。

Amazon EC2 Auto Scaling 如何与 CodeDeploy 结合使用

当您创建或更新 CodeDeploy 部署组以包含 Auto Scaling 组时,CodeDeploy 会使用 CodeDeploy 服务角色访问 Auto Scaling 组,然后将 Auto Scaling 生命周期挂钩安装到 Auto Scaling 组中。

注意

Auto Scaling 生命周期挂钩生命周期事件(也称为生命周期事件挂钩)并不相同,后者是由 CodeDeploy 生成的,在本指南的 AppSpec “挂钩” 部分 中进行了介绍。

CodeDeploy 安装的 Auto Scaling 生命周期挂钩包括:

  • 启动挂钩 — 此挂钩用于通知 CodeDeploy,有一个 Auto Scaling 横向扩展事件正在进行中,CodeDeploy 需要开始启动部署。

    启动部署进行期间,CodeDeploy 会执行以下操作:

    • 将您的应用程序修订部署到横向扩展实例。

    • 生成生命周期事件以指明部署的进度。您可以将这些生命周期事件挂接到自己的脚本以启用自定义启动功能。有关更多信息,请参阅生命周期事件挂钩可用性中的表。

    启动挂钩和关联的启动部署将始终处于启用状态,无法关闭。

  • 终止挂钩 — 这个可选挂钩用于通知 CodeDeploy,有一个 Auto Scaling 横向缩减事件正在进行中,CodeDeploy 需要开始终止部署。

    终止部署进行期间,CodeDeploy 会生成生命周期事件以指明实例关闭的进度。有关更多信息,请参阅在 Auto Scaling 横向缩减事件期间启用终止部署

CodeDeploy 安装完生命周期挂钩后,将如何使用它们?

安装完启动和终止生命周期挂钩后,CodeDeploy 将分别在 Auto Scaling 组横向扩展和横向缩减事件进行期间使用它们。

横向扩展(启动)事件的展开方式如下:

  1. Auto Scaling 服务(或者简称为 Auto Scaling)确定需要发生横向扩展事件,然后与 EC2 服务联系以启动新的 EC2 实例。

  2. EC2 服务启动新的 EC2 实例。实例进入 Pending 状态,然后进入 Pending:Wait 状态。

  3. Pending:Wait 期间,Auto Scaling 会运行附加到 Auto Scaling 组的所有生命周期挂钩,包括 CodeDeploy 安装的启动挂钩。

  4. 启动挂钩会向 CodeDeploy 轮询的 Amazon SQS 队列发送通知。

  5. 收到通知后,CodeDeploy 会解析消息,执行一些验证,然后开始启动部署

  6. 启动部署运行时,CodeDeploy 每五分钟向 Auto Scaling 发送一次心跳,让其知道该实例仍在运行中。

  7. 到目前为止,EC2 实例仍处于 Pending:Wait 状态。

  8. 部署完成后,CodeDeploy 会向 Auto Scaling 指示是 CONTINUE 还是 ABANDON EC2 启动过程,具体取决于部署是成功还是失败。

    • 如果 CodeDeploy 指示 CONTINUE,则 Auto Scaling 会继续启动过程,要么等待其他挂钩完成,要么将实例置于 Pending:Proceed 然后再置于 InService 状态。

    • 如果 CodeDeploy 指示 ABANDON,则 Auto Scaling 会终止 EC2 实例,并在需要时重新开始启动程序,以满足所需的实例数量,如 Auto Scaling 所需容量设置中所定义。

横向缩减(终止)事件的展开方式如下:

请参阅在 Auto Scaling 横向缩减事件期间启用终止部署

CodeDeploy 如何为 Amazon EC2 Auto Scaling 组命名

在 EC2/本地计算平台上进行蓝绿部署期间,您可以通过两个选项将实例添加到替换(绿色)环境:

  • 使用已存在或者您手动创建的实例。

  • 使用您指定的 Amazon EC2 Auto Scaling 组中的设置,在新的 Amazon EC2 Auto Scaling 组中定义和创建实例。

如果您选择第二个选项,CodeDeploy 将预置一个新 Amazon EC2 Auto Scaling 组。它使用以下约定来命名组:

CodeDeploy_deployment_group_name_deployment_id

例如,如果在 ID 为 10 的部署中,部署名为 alpha-deployments 的部署组,则预置的 Amazon EC2 Auto Scaling 组将被命名为 CodeDeploy_alpha-deployments_10。有关更多信息,请参阅 为 EC2/本地蓝绿部署创建部署组(控制台)GreenFleetProvisioningOption

自定义生命周期挂钩事件的执行顺序

您可以向 CodeDeploy 部署到的 Amazon EC2 Auto Scaling 组添加自己的生命周期挂钩。但是,这些自定义生命周期挂钩事件相对于 CodeDeploy 默认部署生命周期事件的执行顺序无法预先确定。例如,如果您将一个名为 ReadyForSoftwareInstall 的自定义生命周期挂钩添加到 Amazon EC2 Auto Scaling 组,则无法提前知道它是在第一个 CodeDeploy 默认部署生命周期事件之前还是在最后一个该事件之后执行。

有关更多信息,请参阅 Amazon EC2 Auto Scaling 组添加自定义生命周期挂钩,请参阅《Amazon EC2 Auto Scaling 用户指南》中的添加生命周期挂钩

部署期间的横向扩展事件

如果在部署过程中发生 Auto Scaling 横向扩展事件,新实例将使用之前部署的应用程序修订进行更新,而不是最新的应用程序修订。如果部署成功,则旧实例和最近横向扩展的实例将会托管不同的应用程序修订。为了让这些旧版本的实例保持最新状态,CodeDeploy 会自动启动后续部署(在第一次部署之后立即启动)以更新所有过时的实例。如果您想更改此默认行为,以便将过时的 EC2 实例保留在较旧版本,请参阅Automatic updates to outdated instances

如果您想在部署期间暂停 Amazon EC2 Auto Scaling 横向扩展流程,则可以通过 common_functions.sh 脚本中的设置来实现,该设置用于使用 CodeDeploy 进行负载平衡。如果 HANDLE_PROCS=true,则以下 Auto Scaling 事件在部署过程中将自动暂停:

  • AZRebalance

  • AlarmNotification

  • ScheduledActions

  • ReplaceUnhealthy

重要

只有 CodeDeployDefault.OneAtATime 部署配置支持此功能。

有关在使用 Amazon EC2 Auto Scaling 时使用 HANDLE_PROCS=true 避免部署问题的更多信息,请参阅 GitHub 上 aws-codedeploy-samples 中的关于处理自动扩缩过程的重要通知

部署期间的横向缩减事件

如果 CodeDeploy 部署在某个 Auto Scaling 组上进行时,该 Auto Scaling 组开始横向缩减,那么终止过程(包括 CodeDeploy 终止部署生命周期事件)和终止实例上的其他 CodeDeploy 生命周期事件之间可能会出现争用情况。如果在所有 CodeDeploy 生命周期事件完成之前终止该特定实例,那么该实例上的部署可能会失败。此外,整个 CodeDeploy 部署可能会失败,也可能不会失败,具体取决于您在部署配置中如何设定正常运行的最少主机数设置。

Amazon CloudFormation cfn-init 脚本中的事件顺序

如果您使用 cfn-init (或 cloud-init) 在新预配的 Linux 实例上运行脚本,则除非您严格控制实例启动之后的事件发生顺序,否则部署可能会失败。

该顺序必须是:

  1. 新预配的实例启动。

  2. 所有 cfn-init 引导脚本运行直至完成。

  3. CodeDeploy 代理将启动。

  4. 将最新的应用程序修订部署到实例。

如果没有精心控制事件的顺序,则 CodeDeploy 代理可能会在所有脚本运行完成之前启动部署。

要控制事件的顺序,请使用以下最佳实践之一:

  • 通过 cfn-init 脚本安装 CodeDeploy 代理(将其放在所有其他脚本之后)。

  • 在自定义 AMI 中包含 CodeDeploy 代理,使用 cfn-init 脚本启动它(将其放在所有其他脚本之后)。

有关使用 cfn-init 的更多信息,请参阅《Amazon CloudFormation 用户指南》中的 cfn-init

将 自定义 AMI 与 CodeDeploy 和 Amazon EC2 Auto Scaling 一起使用

指定要在 Amazon EC2 Auto Scaling 组中启动新 Amazon EC2 实例时使用的基本 AMI 时,有下面两个选项:

  • 可以指定已安装 CodeDeploy 代理的自定义的基本 AMI。由于已安装代理,因此相比于另一个选项,此选项启动新 Amazon EC2 实例的速度更快。但是,此选项提高了 Amazon EC2 实例的初始部署失败的可能性,尤其在 CodeDeploy 代理已过期的情况下。如果选择此选项,建议您定期更新自定义的基本 AMI 中的 CodeDeploy 代理。

  • 可以指定未安装 CodeDeploy 代理而是在 Amazon EC2 Auto Scaling 组中启动每个新实例时安装该代理的基本 AMI。尽管此选项相比于另一个选项启动新 Amazon EC2 实例的速度更慢,但是它提高了实例的初始部署将成功的可能性。此选项使用最新版本的 CodeDeploy 代理。