AWS CodeDeploy 常见问题

一般性问题

AWS CodeDeploy 是一项可以将代码自动部署到任意实例中的服务,这些实例包括 Amazon EC2 实例和在本地运行的实例。AWS CodeDeploy 让您能够轻松快速地推出新功能,可帮助您避免在部署过程中停机,并解决您应用程序更新时的复杂性问题。您可以使用 AWS CodeDeploy 自动执行部署,这样不必进行容易出错的手动操作,该服务可以随您的基础设施进行扩展,因此,您可以轻松地部署到一个或上千个实例。

AWS CodeDeploy 针对的人群是需要部署应用程序到任意实例的开发人员和管理员,这些实例包括 Amazon EC2 实例和本地运行的实例。它很灵活,任何想在实例上更新软件或运行脚本的人都可以使用。

AWS CodeDeploy 可用于部署任何类型的应用程序。要使用 AWS CodeDeploy,您需要指定要复制的文件和要在部署期间在每个实例上运行的脚本。AWS CodeDeploy 与编程语言和架构无关,因此您可以将脚本用于任何定制部署逻辑。

AWS CodeDeploy 支持多种类型的操作系统。AWS CodeDeploy 提供有已在 Amazon Linux、Red Hat Enterprise Linux、Ubuntu Server 和 Microsoft Windows Server 上进行测试的代理程序。如果您想使用其他操作系统,AWS CodeDeploy 代理程序在此处以开源软件形式提供。有关操作系统支持的更多信息,请参阅 AWS CodeDeploy 文档

符合。AWS CodeDeploy 可用于各种配置管理系统、持续集成和部署系统以及源代码控制系统。有关更多信息,请参阅产品集成页面。

AWS CodeDeploy 是一项构建块服务,旨在帮助开发人员部署和更新任意实例中的软件,这些实例包括 Amazon EC2 实例和本地运行的实例。AWS Elastic Beanstalk 和 AWS OpsWorks 是端对端应用程序管理解决方案。

符合。AWS CodeDeploy 支持任何实例,只要实例可以安装 CodeDeploy 代理程序并连接到 AWS 公共端点

概念

应用程序是部署到一组实例中的软件和配置的集合。一般情况下,该组中的实例运行同一种软件。例如,如果您有一个大型分布式系统,Web 层可能由一个应用程序组成,数据层可能由另一个应用程序组成。

修订版是可部署内容(如源代码、构建后项目、网页、可执行文件和部署脚本以及 AppSpec 文件)的特定版本。AWS CodeDeploy 代理程序可通过 GitHub 或 Amazon S3 存储桶访问修订版。

部署组是 AWS CodeDeploy 实体,用于分组 CodeDeploy 部署中的 EC2 实例或 AWS Lambda 函数。对于 EC2 部署,部署组是与您作为部署对象的应用程序相关的一组实例。您可以通过指定标签、Auto Scaling 组名称或同时指定此二者,将实例添加到部署组中。在 AWS Lambda 部署中,部署组定义了一组 AWS CodeDeploy 配置,以备未来对组进行无服务器 Lambda 部署,例如警报和回滚。

您可以为一个应用程序定义多个部署组,如模拟和生产。有关标签的更多信息,请参阅在控制台中使用 Amazon EC2 标签。有关向自动扩缩组进行部署的更多信息,请参阅自动扩缩集成

部署配置为部署组指定如何进行部署的行为,包括如何处理部署故障。您可以使用部署配置向多实例部署组执行零停机部署。例如,如果您的应用程序需要部署组中至少有 50% 的实例在运行中且提供流量,您可以在您的部署配置中指定这一点,从而使部署不会导致停机。如果没有与部署或者部署组相关联的部署配置,则在默认情况下,AWS CodeDeploy 将会一次部署到一个实例中。 有关部署配置的更多信息,请参阅实例运行状况

您需要为部署指定三种参数:

  1. 修订版 – 指定待部署版本。
  2. 部署组 – 指定部署位置。
  3. 部署配置 – 指定如何进行部署的可选参数。

AppSpec 文件是一种配置文件,用于指定待复制文件和待执行脚本。AppSpec 文件使用 YAML 格式,它位于您的修订版的根目录下。AppSpec 文件为 AWS CodeDeploy 代理程序所用,由两个部分组成。文件部分指定了您的版次中待复制的源文件,以及每个实例的目标文件夹。挂接部分指定了在部署各阶段运行的脚本的位置(作为从修订包根下起始的相对路径)。部署的各阶段被称为部署生命周期事件。下面是一个示例 AppSpec 文件。有关 AppSpec 文件的更多信息,包括所有可指定的选项,请参阅 AppSpec 文件参考

os: linux

files: 

# You can specify one or more mappings in the files section.

  - source: /

    destination: /var/www/html/WordPress

hooks:

 # The lifecycle hooks sections allows you to specify deployment scripts.

ApplicationStop: 

# Step 1: Stop Apache and MySQL if running.

    - location: helper_scripts/stop_server.sh

BeforeInstall: 

# Step 2: Install Apache and MySQL.

# You can specify one or more scripts per deployment lifecycle event.

    - location: deploy_hooks/puppet-apply-apache.sh

    - location: deploy_hooks/puppet-apply-mysql.sh 

 AfterInstall: 

# Step 3: Set permissions.

    - location: deploy_hooks /change_permissions.sh

      timeout: 30

      runas: root

# Step 4: Start the server.

    - location: helper_scripts/start_server.sh

      timeout: 30

      runas: root

部署会经过一组预定义阶段,称为部署生命周期事件。部署生命周期事件可让您将代码作为部署的一部分运行。下表以执行顺序列出了目前支持的各种不同的部署生命周期事件,以及您可能想使用它们的时间示例。

部署生命周期事件:

  • ApplicationStop
    • 这是第一个部署生命周期事件,发生在下载完成修订版之前。用于此部署生命周期事件的 AppSpec 文件和脚本来自于上一次成功部署的修订版。 

      如果您想从容地停止应用程序或删除部署准备中当前已安装的软件包,您可以使用 ApplicationStop 部署生命周期事件。

  • DownloadBundle

    • 在此部署生命周期事件期间,代理程序会将修订版文件复制到实例上的临时位置。此部署生命周期事件是为代理程序预留的,不能用于运行用户脚本。

  • BeforeInstall

    • 您可以使用 BeforeInstall 部署生命周期事件执行预安装任务,如解密文件和创建当前版本的备份。

  • 安装

    • 在此部署生命周期事件期间,代理程序会将修订版文件从临时位置复制到最终目标文件夹中。此部署生命周期事件是为代理程序预留的,不能用于运行用户脚本。

  • AfterInstall

    • 您可以使用 AfterInstall 部署生命周期事件执行应用程序配置或文件权限更改等任务。

  • ApplicationStart

    • 您一般使用 ApplicationStart 部署生命周期事件重新启动在 ApplicationStop 期间停止的服务。

  • ValidateService

    • ValidateService 是最后一个部署生命周期时间,为您提供机会来验证部署已成功完成。

 

 

入门

您可以登录 AWS 管理控制台并开始使用 AWS CodeDeploy。如果您要寻找该服务的快速概览,请参阅入门指南,其中包含逐步教程。

使用 AWS CodeDeploy

Amazon EC2 实例必须与 IAM 实例配置文件相关联,并且应运行一个受支持的操作系统。有关更多信息,请参阅使用现有的 Amazon EC2 实例

下图显示了部署期间的典型步骤。创建应用程序和部署组(参阅概念部分了解这些术语的解释)通常是每个应用程序的一次性安装任务。定期上传并部署修订版。有关详细说明,包括每个任务的逐步说明,请参阅部署

您不需要对您的代码作任何更改。您只需要在您的修订包根目录下添加一个配置文件(称为 AppSpec 文件),以指定待复制的文件和待执行的脚本。

如果您使用的是 GitHub,您可以通过 .zip、.tar 或 .tar.gz 格式将修订版从您的存储库直接部署到实例中。对于其他源代码控制系统,您可以 .zip、.tar 或 .tar.gz 格式捆绑并将修订版上传到 Amazon S3 存储桶中,并在进行部署时指定 Amazon S3 的位置。如果您的应用程序需要构建步骤,请确保 GitHub 存储库或 Amazon S3 存储桶中包含构建后项目。有关将 GitHub 用于 AWS CodeDeploy 的更多信息,请参阅我们的产品集成页面。有关使用 Amazon S3 存储修订版的更多信息,请参阅推送修订版

您可以从 AppSpec 文件中的任何部署生命周期事件挂接中调用您的配置管理工具。举例来说,如果您有一个想作为部署的一部分运行的 Chef 配方,您可以在 AppSpec 文件的适当部署生命周期事件挂接中指定该配方,以执行此操作。此外,您还可以利用您的配置管理系统在实例上安装 AWS CodeDeploy 代理程序。有关说明如何将 AWS CodeDeploy 用于 Chef、Puppet、Ansible 和 Saltstack 等配置管理系统的示例,请参阅我们的产品集成页面。

符合。您可以通过使用 AWS CLI 或 AWS 软件开发工具包调用公有 API,以将 AWS CodeDeploy 与您的持续集成和部署系统相集成。您可以在我们的产品集成页面找到预构建集成和示例。

将最新版本部署到部署组中,从而将您的应用程序置于新添加的实例上。除了以 Auto Scaling 组的一部分启动的实例之外,AWS CodeDeploy 不会将最新版本自动部署到新添加的 Amazon EC2 实例中。

您可以将 Auto Scaling 组与部署组关联在一起,从而确保新启动的实例始终会获得最新版本的应用程序。每当该 Auto Scaling 组有新的 Amazon EC2 实例启动时,它首先将处于“待处理”状态,且该部署组的最后一次成功修订版的部署会在该 Amazon EC2 实例上触发。如果部署成功完成,Amazon EC2 实例的状态将更改为“正在服务”。如果部署失败,Amazon EC2 实例将被终止,新的 Amazon EC2 实例会以“待处理”状态启动,且会在新启动的 EC2 实例上触发部署。有关自动扩缩组实例生命周期事件的更多信息,请参阅自动扩缩组生命周期

您可以使用 AWS 管理控制台AWS 命令行界面(AWS CLI)AWS 软件开发工具包AWS CodeDeploy API 访问 AWS CodeDeploy。您可以查看部署的总体状态,并进一步深入了解每个实例的状态以及实例的每个部署生命周期事件的状态。您还可以查看任何故障所对应的日志条目,从而轻松调试部署问题,无需登录实例。

符合。当您停止正在运行的部署时,AWS CodeDeploy 服务将指导每个实例上的代理程序来停止执行其他脚本。要使您的应用程序回到一致状态,您可以重新部署修订版或部署另一个修订版。

要使应用程序回滚到前一修订版,您只需要部署该修订版。AWS CodeDeploy 会跟踪记录为当前修订版复制的文件,并在开始新部署前删除这些文件,因此重新部署和回滚之间没有区别。然而,您需要确保前一修订版可用于回滚。

符合。您可以使用获得版本控制的 Amazon S3 存储桶并指定版本 ID 唯一地标识修订版。

有关服务限制的更多信息,请参阅限制。要想提高您的服务限制,请通过 AWS 支持中心提交请求。

符合。要获得从您的账户发起的 AWS CodeDeploy API 调用的历史记录,您只需在 AWS 管理控制台中打开 AWS CloudTrail 即可。

您可以针对影响您部署的事件创建通知。通知将以 Amazon SNS 通知的形式发出。每个通知将包括状态消息以及指向其事件生成该通知的资源的链接。 通知没有额外成本;但您可能需要为通知使用的其他 AWS 服务付费,例如 Amazon SNS。要了解如何开始使用通知,请参阅通知用户指南。此外,使用 AWS Chatbot 的客户可以将通知配置为发送到其 Slack 通道或 Amazon Chime 聊天室。有关更多详情,请单击此处

安全性

可以,但安装在 Amazon EC2 实例上的 AWS CodeDeploy 代理程序必须能够访问公有 AWS CodeDeploy 和 Amazon S3 服务终端节点。有关更多信息,请参阅 AWS CodeDeploy 端点Amazon S3 端点

符合。AWS CodeDeploy 支持资源级权限。您可以为每种 AWS CodeDeploy 资源指定有访问权限的用户及其可执行的操作。例如,您可以设置一项 IAM 策略使用户部署一个特定的应用程序,但只列出其他应用程序的修订版。因此,您可以防止用户对错误的应用程序进行无意更改。有关将 IAM 用于 AWS CodeDeploy 的更多信息,请参阅访问权限参考

区域

请参阅区域性产品和服务,了解 CodeDeploy 在不同区域的具体提供情况。

AWS CodeDeploy 使用位于同一区域的 AWS 资源执行部署。要将一个应用程序部署到多个区域,请在目标区域定义该应用程序,将该应用程序包复制到每个区域中的 Amazon S3 存储桶,然后使用串联或并联转出跨区域开始部署。

计费

通过 AWS CodeDeploy 向 Amazon EC2 实例部署代码不会产生额外收费。使用 AWS CodeDeploy 进行的每次本次实例更新费用为 0.02 USD。有关其他详细信息,请参阅定价页面。