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

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

将 CodeDeploy 与 Amazon EC2 Auto Scaling 集成

CodeDeploy 支持 Amazon EC2 Auto Scaling,Amazon可根据您定义的条件自动启动 Amazon EC2 实例的服务。这些条件可以包括:在指定时间间隔内超过的 CPU 利用率、磁盘读写数或者入站或出站网络流量的限制。当不再需要实例时,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 集成.

向 Amazon EC2 Auto Scaling 组 CodeDeploy 应用程序。

要将 CodeDeploy 应用程序修订部署到 Amazon EC2 Auto Scaling 组:

  1. 创建或找到允许 Amazon EC2 Auto Scaling 组使用 Amazon S3 的 IAM 实例配置文件。

    注意

    您还可以使用 CodeDeploy 将修订从 GitHub 存储库部署到 Amazon EC2 Auto Scaling 组。尽管 Amazon EC2 实例仍需要一个 IAM 实例配置文件,但该配置文件不需要任何额外的权限即可从 GitHub 存储库部署。有关更多信息,请参阅第 4 步:为您的 Amazon EC2 实例创建 IAM 实例配置文件

  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 将应用程序部署到 Amazon EC2 Auto Scaling 组

Amazon EC2 Auto Scaling 如何与 CodeDeploy 协作

为了让 CodeDeploy 在 Auto Scaling 扩展事件期间将应用程序修订部署到新的 EC2 实例,CodeDeploy 使用了 Auto Scaling 生命周期钩子。生命周期钩子通知 CodeDeploy,Auto Scaling 向外扩展事件正在进行中,CodeDeploy 需要将修订部署到缩小的实例。

注意

在本节中,术语 “生命周期钩子” 和 “挂钩” 是指用于将 CodeDeploy 与 Auto Scaling 集成的钩子。这个钩子与中描述的钩子不同AppSpec 的 “hooks” 部分.

生命周期挂钩是如何创建和安装的?

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

CodeDeploy 添加生命周期钩子后,它是如何使用的?

安装生命周期挂钩后,它将在扩展事件期间使用。扩展事件展开如下:

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

  2. EC2 服务启动了一个新的 EC2 实例。该实例移动到Pending状态,然后进入Pending:Wait状态。

  3. Pending:Wait,Auto Scaling 将运行附加到 Auto Scaling 组的所有生命周期钩子,包括 CodeDeploy 创建的生命周期钩子。

  4. 生命周期钩子将通知发送给Amazon SQS 队列这是由 CodeDeploy 调查的。

  5. 收到通知后,CodeDeploy 会解析消息,执行一些验证,并开始使用上次成功的修订版将应用程序部署到新的 EC2 实例。

  6. 在部署运行期间,CodeDeploy 每五分钟向 Auto Scaling 发送一次心跳,以告知实例仍在处理中。

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

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

    • 如果 CodeDeploy 表示CONTINUE,Auto Scaling 将继续启动过程,要么等待其他挂钩完成,或者将实例放入Pending:Proceed然后InService状态。

    • 如果 CodeDeploy 表示抛弃,Auto Scaling 将终止 EC2 实例,并在需要时重新启动启动过程以满足所需的实例数量(如 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 横向扩展事件,则新实例将使用最近部署的最新应用程序修订进行更新,而不是当前正在部署的应用程序修订。如果部署成功,则旧实例和最近扩展的实例将会托管不同的应用程序修订。为了使这些实例更新,CodeDeploy 会自动启动后续部署(在第一个实例之后立即开始)以更新任何过时的实例。如果您想更改此默认行为,以便过时的 EC2 实例留在较旧的修订版中,请参阅Automatic updates to outdated instances.

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

  • AZRebalance

  • AlarmNotification

  • ScheduledActions

  • ReplaceUnhealthy

重要

只有 CodeDeploy Default.oneatime 部署配置支持此功能。

有关使用的更多信息HANDLE_PROCS=true要避免在使用 Amazon EC2 Auto Scaling 时出现部署问题,请参阅关于处理 AutoScaling 流程的重要aws-code 部署示例(位于 GitHub 上)。

中的活动顺序Amazon CloudFormationcfn-init 脚本

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

该顺序必须是:

  1. 新预配的实例启动。

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

  3. CodeDeploy 代理启动。

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

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

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

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

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

有关使用的信息cfn-init,请参阅cfn-initAmazon CloudFormation用户指南.

将自定义 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 代理。