AWS CodeDeploy
User Guide (API Version 2014-10-06)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

将 AWS CodeDeploy 与 Auto Scaling 集成

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

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

注意

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

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

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

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

    注意

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

  2. 创建或使用 Auto Scaling 组,并指定 IAM 实例配置文件。

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

  4. 使用 AWS CodeDeploy 创建一个部署组,并指定 Auto Scaling 组名称和服务角色。

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

有关更多信息,请参阅 教程:部署到 Auto Scaling 组

使用 AWS CodeDeploy 的 Auto Scaling 行为

自定义生命周期挂钩事件的执行顺序无法预先确定

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

要了解如何将自定义生命周期挂钩添加到 Auto Scaling 组中,请参阅添加生命周期挂钩

部署期间的纵向扩展事件会产生混合环境

如果在部署过程中发生 Auto Scaling 纵向扩展事件,则新实例将使用最近部署的最新应用程序修订更新,而不是当前正在部署的应用程序修订。如果部署成功,则旧实例和最近纵向扩展的实例将会托管不同的应用程序修订。

要解决发生的此问题,您可以将更新的应用程序修订重新部署到受影响的部署组。

为避免此问题,我们建议您在执行部署时暂停 Auto Scaling 纵向扩展过程。您可以通过用于 AWS CodeDeploy 负载均衡的 common_functions.sh 脚本中的设置来完成此操作。如果 HANDLE_PROCS=true,则以下 Auto Scaling 事件在部署过程中将会自动暂停:

  • AZRebalance

  • AlarmNotification

  • ScheduledActions

  • ReplaceUnhealthy

重要

只有 CodeDeployDefault.OneAtATime 部署配置支持此功能。如果您正在使用其他部署配置,部署组的实例可能仍会应用不同的应用程序修订。

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

使用 AWS CloudFormation cfn-init 脚本时必须控制事件的顺序

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

该顺序必须是:

  1. 新预配的实例启动。

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

  3. AWS CodeDeploy 代理启动。

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

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

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

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

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

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

将自定义 AMI 用于 AWS CodeDeploy 和 Auto Scaling

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

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

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