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. 终止挂钩会向由轮询的 Amazon SQS 队列发送通知。 CodeDeploy

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

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

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

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

Amazon EC2 Auto Scaling 是如何使用的 CodeDeploy

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

注意

Auto Scaling 生命周期挂钩不同于本指南生成 CodeDeploy 并在本指南中描述的生命周期事件(也称为生命周期事件挂钩)。AppSpec “挂钩” 部分

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

  • 启动挂钩 — 此挂钩通知 CodeDeploy Auto S caling 横向扩展事件正在进行中, 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. 启动挂钩会向通过轮询的 Amazon SQS 队列发送通知。 CodeDeploy

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

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

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

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

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

    • 如果 CodeDeploy 指示ABANDON,则 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 默认部署生命周期事件预先确定这些自定义生命周期挂钩事件的执行顺序。例如,如果您向 Amazon EC2 Auto Scaling 组添加一个名为ReadyForSoftwareInstall的自定义生命周期挂钩,则无法事先知道该挂钩是在第一个默认部署生命周期事件之前还是最后一个 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 部署配置支持此功能。

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

部署期间的横向缩减事件

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

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

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

该顺序必须是:

  1. 新预配的实例启动。

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

  3. CodeDeploy 代理启动。

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

如果未仔细控制事件的顺序,则 CodeDeploy 代理可能会在所有脚本完成运行之前开始部署。

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

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

  • 将 CodeDeploy 代理包含在自定义 AMI 中并使用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 代理的基本 AMI,并在在 Amazon EC2 Auto Scaling 组中启动每个新实例时安装代理。尽管此选项相比于另一个选项启动新 Amazon EC2 实例的速度更慢,但是它提高了实例的初始部署将成功的可能性。此选项使用最新版本的 CodeDeploy代理。