

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

# 什么是 CodeDeploy？
<a name="welcome"></a>

CodeDeploy 是一项部署服务，可自动将应用程序部署到 Amazon EC2 实例、本地实例、无服务器 Lambda 函数或 Amazon ECS 服务。

您可以部署几乎无限种类的应用程序内容，包括：
+ 代码
+ 无服务器函数 AWS Lambda 
+ Web 和配置文件
+ 可执行文件
+ 软件包
+ 脚本
+ 多媒体文件

CodeDeploy 可以部署在服务器上运行并存储在 Amazon S3 存储桶、存储库或 Bitbucket GitHub 存储库中的应用程序内容。 CodeDeploy 也可以部署无服务器 Lambda 函数。您无需更改现有代码即可开始使用 CodeDeploy。

CodeDeploy 让你更轻松：
+ 快速发布新功能。
+ 更新 AWS Lambda 函数版本。
+ 避免在应用程序配置过程中停机。
+ 处理更新应用程序的复杂性，而没有许多与容易出错的手动部署关联的风险。

该服务会随您的基础设施进行扩展，因此您可以轻松地向一个实例或数千个实例部署。

CodeDeploy 可与各种系统配合使用，用于配置管理、源代码控制、[持续集成](https://aws.amazon.com/devops/continuous-integration/)、[持续交付](https://aws.amazon.com/devops/continuous-delivery/)和持续部署。有关更多信息，请参阅[产品集成](https://aws.amazon.com/codedeploy/product-integrations/)。

 CodeDeploy 控制台还提供了一种快速搜索资源的方法，例如存储库、生成项目、部署应用程序和管道。选择**转到资源**或按下 `/` 键，然后键入资源的名称。任何匹配结果都会显示在列表中。搜索不区分大小写。您只能看到您有权查看的资源。有关更多信息，请参阅 [的身份和访问管理 AWS CodeDeploy](security-iam.md)。

**Topics**
+ [的好处 AWS CodeDeploy](#benefits)
+ [CodeDeploy 计算平台概述](#compute-platform)
+ [CodeDeploy 部署类型概述](#welcome-deployment-overview)
+ [我们希望听到您的意见和建议](#welcome-contact-us)
+ [Primary Components](primary-components.md)
+ [Deployments](deployment-steps.md)
+ [Application Specification Files](application-specification-files.md)

## 的好处 AWS CodeDeploy
<a name="benefits"></a>

CodeDeploy 提供以下好处：
+ **服务器、无服务器和容器应用程序。** CodeDeploy允许您在服务器上部署传统应用程序和部署无服务器 AWS Lambda 功能版本或 Amazon ECS 应用程序的应用程序。
+ **自动部署**。 CodeDeploy 在开发、测试和生产环境中实现应用程序部署的完全自动化。 CodeDeploy可根据您的基础架构进行扩展，以便您可以部署到一个或数千个实例。
+ **最大程度减少停机时间**。如果您的应用程序使用 EC2/本地计算平台，则 CodeDeploy 有助于最大限度地提高应用程序的可用性。在就地部署期间， CodeDeploy 对 Amazon EC2 实例执行滚动更新。您可以指定在进行更新时每次进入脱机状态的实例的数量。在 blue/green 部署期间，将在替换实例上安装最新的应用程序修订。在您选择时，流量会立即重新路由到这些实例，或者在完成新环境测试之后立即重新路由。对于两种部署类型， CodeDeploy 将根据您配置的规则跟踪应用程序运行状况。
+ **停止并回滚**。出现错误时，您可以自动或手动停止和回滚部署。
+ **集中控制**。您可以通过 CodeDeploy 控制台或启动部署并跟踪部署状态 AWS CLI。您将收到一份报告，其中列出每个应用程序修订的部署时间及其部署到的 Amazon EC2 实例。
+ **易于采用**。 CodeDeploy 不受平台限制，适用于任何应用程序。您可以轻松地重复使用您的设置代码。 CodeDeploy 还可以与您的软件发布流程或持续交付工具链集成。
+ **并发部署**。如果您有多个使用 EC2/本地计算平台的应用程序，则 CodeDeploy 可以将它们同时部署到同一组实例。



## CodeDeploy 计算平台概述
<a name="compute-platform"></a>

CodeDeploy 能够将应用程序部署到三个计算平台：
+ **EC2/本地**：描述可以作为 Amazon EC2 云实例和/或本地服务器的物理服务器实例。使用 EC2/本地计算平台创建的应用程序可以包括可执行文件、配置文件和映像等。

  使用 EC2/本地计算平台的部署通过使用就地部署或蓝绿部署类型，管理流量定向到实例的方式。有关更多信息，请参阅 [CodeDeploy 部署类型概述](#welcome-deployment-overview)。
+ **AWS Lambda**：用于部署由 Lambda 函数的更新版本组成的应用程序。 AWS Lambda 在由高可用性计算结构组成的无服务器计算环境中管理 Lambda 函数。计算资源的所有管理均由执行 AWS Lambda。有关更多信息，请参阅[无服务器计算和应用程序](https://aws.amazon.com/serverless/)。有关 AWS Lambda 和 Lambda 函数的更多信息，请参阅。[AWS Lambda](https://aws.amazon.com/lambda/)

  您可以通过选择金丝雀、线性或 all-at-once配置来管理部署期间流量转移到更新后的 Lambda 函数版本的方式。
+ **Amazon ECS**：用于将 Amazon ECS 容器化应用程序部署为任务集。 CodeDeploy 通过将应用程序的更新版本安装为新的替换任务集来执行 blue/green 部署。 CodeDeploy 将生产流量从原始应用程序任务集重新路由到替换任务集。成功部署后，将会终止原始任务集。有关 Amazon ECS 的更多信息，请参阅 [Amazon Elastic Container Service](https://aws.amazon.com/ecs/)。

  通过选择金丝雀、线性或 all-at-once配置，您可以管理在部署期间将流量转移到更新的任务集的方式。
**注意**  
同时使用 CodeDeploy 和支持 Amazon ECS blue/green 部署 CloudFormation。这些部署的详细信息将在后续章节中介绍。

下表描述了如何在每个计算平台上使用 CodeDeploy 组件。有关更多信息，请参阅: 
+  [在中使用部署组 CodeDeploy](deployment-groups.md) 
+  [在中处理部署 CodeDeploy](deployments.md) 
+  [在中使用部署配置 CodeDeploy](deployment-configurations.md) 
+  [正在处理的应用程序修订版 CodeDeploy](application-revisions.md) 
+  [在 CodeDeploy 中使用应用程序](applications.md) 


| CodeDeploy 组件 | EC2/本地 | AWS Lambda | Amazon ECS | 
| --- | --- | --- | --- | 
| 部署组 | 将修订部署到一组实例。 | 将无服务器 Lambda 函数的一个新版本部署到高可用性计算基础设施。 | 指定带有容器化应用程序的 Amazon ECS 服务以部署为任务集，同时指定用于为部署的应用程序提供流量的生产和可选测试侦听器，何时重新路由流量并终止已部署应用程序的原始任务集，以及可选的触发器、警报和回滚设置。 | 
| 部署 | 部署由应用程序和 AppSpec 文件组成的新修订版。 AppSpec 指定如何将应用程序部署到部署组中的实例。 | 将生产流量从 Lambda 函数的一个版本转移到同一函数的新版本。该 AppSpec 文件指定要部署的 Lambda 函数版本。 | 将 Amazon ECS 容器化应用程序的更新版本部署为新的替代任务集。 CodeDeploy 将生产流量从具有原始版本的任务集重新路由到具有更新版本的新替换任务集。在部署完成后，会终止原始任务集。 | 
| 部署配置 | 此设置确定部署速度以及在部署过程中任何时候都必须正常的最小实例数。 | 此设置确定流量如何转移到更新后的 Lambda 函数版本。 | 此设置确定流量如何转移到更新后的 Amazon ECS 任务集。 | 
| 修订 |  AppSpec 文件和应用程序文件的组合，例如可执行文件、配置文件等。 | 一个 AppSpec 文件，它指定要部署哪个 Lambda 函数以及可以在部署生命周期事件挂钩期间运行验证测试的 Lambda 函数。 |  指定以下 AppSpec 内容的文件： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/welcome.html)  | 
| 应用程序 | 部署组和修订的集合。EC2/本地应用程序使用 EC2/本地计算平台。 | 部署组和修订的集合。用于 AWS Lambda 部署的应用程序使用无服务器 Lambd AWS a 计算平台。 | 部署组和修订的集合。用于 Amazon ECS 部署的应用程序使用 Amazon ECS 计算平台。 | 

## CodeDeploy 部署类型概述
<a name="welcome-deployment-overview"></a>

CodeDeploy 提供了两个部署类型选项：
+ **就地部署**：停止部署组中每个实例上的应用程序，安装最新的应用程序修订，然后启动和验证应用程序的新版本。您可以使用负载均衡器，以便在部署期间取消注册每个实例，然后在部署完成后让其重新提供服务。只有使用 EC2/本地计算平台的部署才能使用就地部署。有关就地部署的更多信息，请参阅[就地部署概述](#welcome-deployment-overview-in-place)。
**注意**  
AWS Lambda 和 Amazon ECS 部署不能使用就地部署类型。
+ **蓝绿部署**：部署的行为取决于使用的计算平台：
  + **Blue/green on an EC2/On-本地计算平台**：使用以下步骤将部署组（原始环境）中的实例替换为另一组实例（替换环境）：
    + 为替换环境配置实例。
    + 在替换实例上安装最新的应用程序修订。
    + 对于应用程序测试和系统验证等活动，可以选择等待时间。
    + 替换环境中的实例在一个或多个 Elastic Load Balancing 负载均衡器中注册，从而导致流量被重新路由到这些负载均衡器。原始环境中的实例已注销，可以终止或继续运行以用于其他用途。
**注意**  
如果您使用 EC2/本地计算平台，请注意 blue/green 部署仅适用于 Amazon EC2 实例。
  + 或 ** AWS Lambda Amazon ECS 计算平台上的蓝/绿**：流量根据**金丝雀**、**线性**或**all-at-once**部署配置逐渐移动。
  + **蓝/绿部署通过 CloudFormation**：作为 CloudFormation 堆栈更新的一部分，流量将从您当前的资源转移到更新的资源。当前，仅支持 ECS blue/green 部署。

  有关 blue/green 部署的更多信息，请参阅[blue/green 部署概述](#welcome-deployment-overview-blue-green)。

**注意**  
使用该 CodeDeploy 代理，您无需应用程序、部署组甚至 AWS 帐户，即可在已登录的实例上执行部署。有关信息，请参阅[使用 CodeDeploy 代理在本地计算机上验证部署包](deployments-local.md)。

**Topics**
+ [就地部署概述](#welcome-deployment-overview-in-place)
+ [blue/green 部署概述](#welcome-deployment-overview-blue-green)

### 就地部署概述
<a name="welcome-deployment-overview-in-place"></a>

**注意**  
AWS Lambda 和 Amazon ECS 部署不能使用就地部署类型。

以下是就地部署的工作原理：

1. 首先，在本地开发计算机或类似环境中创建可部署的内容，然后添加*应用程序规范文件（AppSpec 文件*）。该 AppSpec 文件是唯一的 CodeDeploy。它定义了您 CodeDeploy 要执行的部署操作。您可以将可部署内容和文件捆绑到存档 AppSpec 文件中，然后将其上传到 Amazon S3 存储桶或 GitHub存储库。此存档文件称为*应用程序修订*（简称*修订*）。

1. 接下来，您将 CodeDeploy 提供有关您的部署的信息，例如从哪个 Amazon S3 存储桶或 GitHub 存储库提取修订以及将其内容部署到哪组 Amazon EC2 实例。 CodeDeploy 将一组 Amazon EC2 实例称为*部署组*。部署组中包含单独标记的 Amazon EC2 实例和/或 Amazon EC2 Auto Scaling 组中的 Amazon EC2 实例。

   每次您成功上传要部署到部署组的新应用程序修订时，该捆绑包就会设置为部署组的*目标修订*。也就是说，当前设为部署目标的应用程序修订为目标修订。这也是为自动部署提取的修订。

1. 接下来，每个实例上的 CodeDeploy 代理都会进行轮询 CodeDeploy 以确定从指定的 Amazon S3 存储桶或存储 GitHub 库中提取内容和时间。

1. 最后，每个实例上的 CodeDeploy 代理从 Amazon S3 存储桶或存储 GitHub 库中提取目标修订版，然后按照 AppSpec 文件中的说明将内容部署到该实例。

 CodeDeploy 保留部署记录，以便您可以获取部署状态、部署配置参数、实例运行状况等。

### blue/green 部署概述
<a name="welcome-deployment-overview-blue-green"></a>

 blue/green 部署用于更新您的应用程序，同时最大限度地减少因更改新应用程序版本而造成的中断。 CodeDeploy 在重新路由生产流量之前，请将新的应用程序版本与旧版本一起配置。
+  **AWS Lambda**：流量从 Lambda 函数的一个版本转移到同一 Lambda 函数的新版本。
+  **Amazon ECS**：流量从 Amazon ECS 服务中的任务集转移到同一 Amazon ECS 服务中更新的替换任务集。
+  **EC2/本地**：流量从原始环境中的一组实例转移到一组替换实例。

与就地部署相比，所有 AWS Lambda 和 Amazon ECS blue/green. An EC2/On-Premises deployment can be in-place or blue/green. A blue/green 部署均为部署具有许多优势：
+ 您可以在新的替换环境中安装和测试应用程序，只需通过重新路由流量即可将应用程序部署到生产环境中。
+  如果您使用的是 EC2/本地计算平台，切换回最新的应用程序版本将更快、更可靠。这是因为只要原始实例没有被终止，流量就可以路由回原始实例。而在就地部署中，必须通过重新部署上一个版本的应用程序来回滚版本。
+ 如果您使用的是 EC2/本地计算平台，则会为 blue/green 部署配置新实例，并反映大多数 up-to-date服务器配置。这将帮助您避免在长时间运行的实例上有时出现的问题类型。
+ 如果您使用的是 AWS Lambda 计算平台，则可以控制流量如何从原始 Lambda 函数版本转移到新 AWS Lambda AWS 函数版本。
+ 如果您使用的是 Amazon ECS 计算平台，则可以控制流量从原始任务集转移到新任务集的方式。

使用进行 blue/green 部署 CloudFormation 可以使用以下方法之一：
+ **CloudFormation 部署模板**：使用 CloudFormation 模板配置部署时，您的部署由 CloudFormation 更新触发。当您更改资源并上传模板更改时，中的堆栈更新 CloudFormation 会启动新的部署。有关可在 CloudFormation 模板中使用的资源列表，请参阅[CloudFormation 模板供 CodeDeploy 参考](reference-cloudformation-templates.md)。
+ **通过 CloudFormation以下方式进行蓝/绿部署**：您可以使用堆栈更新 CloudFormation 来管理 blue/green 部署。除了指定流量路由和稳定设置外，您还可以在堆栈模板中定义蓝绿资源。然后，如果您在堆栈更新期间更新所选资源，则 CloudFormation 会生成所有必要的绿色资源，根据指定的流量路由参数转移流量，然后删除蓝色资源。有关更多信息，请参阅*AWS CloudFormation 用户指南 CloudFormation*中的[ CodeDeploy 使用自动 blue/green 部署 Amazon ECS](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/blue-green.html)。
**注意**  
仅支持 Amazon ECS blue/green 部署。

如何配置 blue/green 部署取决于您的部署使用的计算平台。



#### 在或 AWS Lambda Amazon ECS 计算平台上部署蓝/绿
<a name="blue-green-lambda-compute-type"></a>

如果您使用的是 AWS Lambda 或 Amazon ECS 计算平台，则必须说明流量是如何从原始 AWS Lambda 函数或 Amazon ECS 任务集转移到新函数或任务集的。要指示流量是如何转移的，您必须指定下列部署配置之一：
+ **金丝雀**
+ **线性**
+ **all-at-once**

有关在金丝雀、线性或 all-at-once部署配置中流量如何转移的信息，请参阅[部署配置](primary-components.md#primary-components-deployment-configuration)。

有关 Lambda 部署配置的详细信息，请参阅[AWS Lambda 计算平台上的部署配置](deployment-configurations.md#deployment-configuration-lambda)。

有关 Amazon ECS 部署配置的详细信息，请参阅[Amazon ECS 计算平台上的部署配置](deployment-configurations.md#deployment-configuration-ecs)。

#### Blue/Green deployment on an EC2/on-本地计算平台
<a name="blue-green-server-compute-type"></a>

**注意**  
您必须使用 Amazon EC2 实例在 EC2/本地计算平台上进行 blue/green 部署。该 blue/green 部署类型不支持本地实例。

如果您使用 EC2/本地计算平台，则适用以下规则：

 您必须拥有一个或多个具备识别 Amazon EC2 标签或 Amazon EC2 Auto Scaling 组的 Amazon EC2 实例。这些实例必须满足这些额外要求：
+ 每个 Amazon EC2 实例都必须附加有正确的 IAM 实例配置文件。
+ 必须在每个实例上安装并运行 CodeDeploy 代理。

**注意**  
通常，您还会在原始环境中的实例上运行应用程序修订，但这不是 blue/green 部署的必要条件。

创建用于部署的部署组时，可以选择如何指定替换环境： blue/green 

**复制现有的 Amazon EC2 Auto Scaling 组**：在 blue/green 部署期间，在部署期间为您的替代环境 CodeDeploy 创建实例。使用此选项， CodeDeploy 使用您指定的 Amazon EC2 Auto Scaling 组作为替换环境的模板，包括相同数量的运行实例和许多其他配置选项。

**手动选择实例**：您可以使用 Amazon EC2 实例标签和/或 Amazon EC2 Auto Scaling 组名称指定要计为替换项的实例。如果您选择此选项，则在创建部署前无需指定替换环境的实例。

下面将介绍操作方式：

1. 您已经有充当原始环境的一些实例或一个 Amazon EC2 Auto Scaling 组。首次运行 blue/green 部署时，通常使用已在就地部署中使用的实例。

1. 在现有 CodeDeploy 应用程序中，您可以创建一个 blue/green 部署组，除了就地部署所需的选项外，您还可以在其中指定以下内容：
   + 一种或多个负载均衡器，用于在 blue/green 部署过程中将流量从原始环境路由到替代环境。
   + 立即将流量重新路由到替换环境还是等待您手动路由。
   + 流量路由到替换实例的速率。
   + 被替换的实例是终止还是继续运行。

1. 您为此部署组创建一个部署，在此期间，将会发生如下情况：

   1. 如果您选择复制 Amazon EC2 Auto Scaling 组，则将为您的替换环境预置实例。

   1. 您为部署指定的应用程序修订将安装在替换实例上。

   1. 如果您在部署组设置中指定了等待时间，部署将暂停。这是您可以在替换环境中运行测试和验证的时间。如果您未在等待期结束之前手动路由流量，部署将停止。

   1. 替换环境中的实例向 Elastic Load Balancing 负载均衡器注册，流量开始路由到这些实例。

   1. 原始环境中的实例将取消注册，并根据部署组中的规范进行处理，要么终止，要么继续运行。

#### 通过蓝/绿部署 CloudFormation
<a name="blue-green-cfn-config-type"></a>

您可以使用模板对资源进行建模，从而管理 CodeDeploy 蓝/绿部署。 CloudFormation 

使用 CloudFormation 模板对 blue/green 资源进行建模时，可以在中创建堆栈更新 CloudFormation 以更新您的任务集。生产流量将从服务的原始任务集转移到替换任务集，可以一次全部转移，也可以使用 Canary 部署进行转移。堆栈更新在 CodeDeploy 中启动部署。您可以在中查看部署状态和历史记录 CodeDeploy，但不能以其他方式创建或管理 CloudFormation 模板之外的 CodeDeploy 资源。

**注意**  
对于通过进行的 blue/green 部署 CloudFormation，您无需创建 CodeDeploy 应用程序或部署组。

此方法仅支持 Amazon ECS blue/green 部署。有关通过进行 blue/green 部署的更多信息 CloudFormation，请参阅[通过创建 Amazon ECS blue/green 部署 CloudFormation](deployments-create-ecs-cfn.md)。

## 我们希望听到您的意见和建议
<a name="welcome-contact-us"></a>

我们欢迎您提供反馈。要联系我们，请访问[ CodeDeploy 论坛](https://forums.aws.amazon.com/forum.jspa?forumID=179)。

**主题**
+ [Primary Components](primary-components.md)
+ [Deployments](deployment-steps.md)
+ [Application Specification Files](application-specification-files.md)

# CodeDeploy 主要组件
<a name="primary-components"></a>

在开始使用该服务之前，您应该熟悉 CodeDeploy 部署过程的主要组成部分。

**Topics**
+ [应用程序](#primary-components-application)
+ [计算平台](#primary-components-compute-platform)
+ [部署配置](#primary-components-deployment-configuration)
+ [部署组](#primary-components-deployment-group)
+ [部署类型](#primary-components-deployment-type)
+ [IAM 实例配置文件](#primary-components-iam-instance-profile)
+ [修订](#primary-components-revision)
+ [服务角色](#primary-components-service-role)
+ [目标修订](#primary-components-target-revision)
+ [其他组件](#primary-components-other-components)

## 应用程序
<a name="primary-components-application"></a>

*应用程序*是唯一标识要部署的应用程序的名称。 CodeDeploy 使用此名称（用作容器）来确保在部署期间引用修订版、部署配置和部署组的正确组合。

## 计算平台
<a name="primary-components-compute-platform"></a>

*计算平台*是 CodeDeploy 部署应用程序的平台。有三个计算平台：
+ **EC2/本地**：描述物理服务器的实例，这些实例可以是 Amazon EC2 云实例、本地服务器或两者兼而有之。使用 EC2 /Londest 计算平台创建的应用程序可以由可执行文件、配置文件、图像等组成。

  使用 EC2 /Onlide 计算平台的部署使用就地部署或蓝/绿部署类型来管理流量定向到实例的方式。有关更多信息，请参阅 [CodeDeploy 部署类型概述](welcome.md#welcome-deployment-overview)。
+ **AWS Lambda**：用于部署由 Lambda 函数的更新版本组成的应用程序。 AWS Lambda 在由高可用性计算结构组成的无服务器计算环境中管理 Lambda 函数。计算资源的所有管理均由执行 AWS Lambda。有关更多信息，请参阅[无服务器计算和应用程序](https://aws.amazon.com/serverless/)。有关 AWS Lambda 和 Lambda 函数的更多信息，请参阅。[AWS Lambda](https://aws.amazon.com/lambda/)

  您可以通过选择金丝雀、线性或 all-at-once配置来管理部署期间流量转移到更新后的 Lambda 函数版本的方式。
+ **Amazon ECS**：用于将 Amazon ECS 容器化应用程序部署为任务集。 CodeDeploy 通过将应用程序的更新版本安装为新的替换任务集来执行 blue/green 部署。 CodeDeploy 将生产流量从原始应用程序任务集重新路由到替换任务集。成功部署后，将会终止原始任务集。有关 Amazon ECS 的更多信息，请参阅 [Amazon Elastic Container Service](https://aws.amazon.com/ecs/)。

  通过选择金丝雀、线性或 all-at-once配置，您可以管理在部署期间将流量转移到更新的任务集的方式。

**注意**  
 CodeDeploy 和都支持 Amazon ECS blue/green 部署 CloudFormation。这些部署的详细信息将在后续章节中介绍。

## 部署配置
<a name="primary-components-deployment-configuration"></a>

*部署配置*是部署 CodeDeploy 期间使用的一组部署规则以及部署成功和失败条件。如果您的部署使用 EC2 /Unlide 计算平台，则可以为部署指定运行正常的实例的最小数量。如果您的部署使用 AWS Lambda 或 Amazon ECS 计算平台，则可以指定如何将流量路由到更新后的 Lambda 函数或 ECS 任务集。

有关为使用 EC2 /Londest 计算平台的部署指定最少运行正常主机数的更多信息，请参阅[关于最小运行正常的实例数](instances-health.md#minimum-healthy-hosts)。

在使用 Lambda 或 ECS 计算平台的部署期间，有一些部署配置可指定流量的路由方式：
+ **Canary**：流量将通过两次递增进行转移。您可以从预定义的金丝雀部署选项中选择，这些选项指定在第一次增量中转移到更新后的 Lambda 函数或 ECS 任务集的流量百分比以及以分钟为单位的间隔；然后指定在第二次增量中转移剩余的流量。
+ **线性部署**：流量使用相等的增量转移，在每次递增之间间隔的分钟数相同。您可以从预定义的线性选项中进行选择，这些选项指定在每次增量中转移的流量百分比以及每次增量之间的分钟数。
+ **答 ll-at-once**：所有流量将同时从原来的 Lambda 函数或 ECS 任务集转移到更新的函数或任务集。

## 部署组
<a name="primary-components-deployment-group"></a>

*部署组* 是一组单独的实例。部署组包含单独标记的实例、Amazon A EC2 uto Scaling 组中的亚马逊 EC2 实例，或两者兼而有之。有关 Amazon EC2 实例标签的信息，请参阅[使用控制台处理标签](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#Using_Tags_Console)。有关本地实例的信息，请参阅[使用本地实例 CodeDeploy](instances-on-premises.md)。有关 Amazon A EC2 uto Scaling 的信息，请参阅[CodeDeploy 与亚马逊 EC2 Auto Scaling 集成](integrations-aws-auto-scaling.md)。

## 部署类型
<a name="primary-components-deployment-type"></a>

*部署类型* 是一种用于在部署组中的实例上提供最新应用程序修订的方法。具有两种部署类型：
+ **就地部署**：停止部署组中每个实例上的应用程序，安装最新的应用程序修订，然后启动和验证应用程序的新版本。您可以使用负载均衡器，以便在部署期间取消注册每个实例，然后在部署完成后让其重新提供服务。只有使用 EC2 /Unlide 计算平台的部署才能使用就地部署。有关就地部署的更多信息，请参阅[就地部署概述](welcome.md#welcome-deployment-overview-in-place)。
+ **蓝绿部署**：部署的行为取决于使用的计算平台：
  + **Blue/green on an EC2/On-本地计算平台**：使用以下步骤将部署组（原始环境）中的实例替换为另一组实例（替换环境）：
    + 为替换环境配置实例。
    + 在替换实例上安装最新的应用程序修订。
    + 对于应用程序测试和系统验证等活动，可以选择等待时间。
    + 替换环境中的实例在一个或多个 Elastic Load Balancing 负载均衡器中注册，从而导致流量被重新路由到这些负载均衡器。原始环境中的实例已注销，可以终止或继续运行以用于其他用途。
**注意**  
如果您使用 EC2 /本地计算平台，请注意 blue/green 部署仅适用于 Amazon EC2 实例。
  + 或 ** AWS Lambda Amazon ECS 计算平台上的蓝/绿**：流量根据**金丝雀**、**线性**或**all-at-once**部署配置逐渐移动。
  + **蓝/绿部署通过 CloudFormation**：作为 CloudFormation 堆栈更新的一部分，流量将从您当前的资源转移到更新的资源。当前，仅支持 ECS blue/green 部署。

  有关 blue/green 部署的更多信息，请参阅[blue/green 部署概述](welcome.md#welcome-deployment-overview-blue-green)。

**注意**  
同时使用 CodeDeploy 和支持 Amazon ECS blue/green 部署 CloudFormation。这些部署的详细信息将在后续章节中介绍。

## IAM 实例配置文件
<a name="primary-components-iam-instance-profile"></a>

*IAM 实例配置文件*是您附加到您的 Amazon EC2 实例的 IAM 角色。此配置文件包括访问存储应用程序的 Amazon S3 存储桶或存储 GitHub 库所需的权限。有关更多信息，请参阅 [步骤 4：为 Amazon EC2 实例创建 IAM 实例配置文件](getting-started-create-iam-instance-profile.md)。

## 修订
<a name="primary-components-revision"></a>

*修订* 是您的应用程序的一个版本。 AWS Lambda 部署修订版是一个 YAML 或 JSON 格式的文件，用于指定要部署的 Lambda 函数的相关信息。 EC2/Unlide 部署修订版是一个存档文件，其中包含源内容（源代码、网页、可执行文件和部署脚本）和应用程序规范文件（AppSpec 文件）。 AWS Lambda 修订版可以存储在亚马逊 S3 存储桶中。 EC2/本地版本存储在 Amazon S3 存储桶或 GitHub 存储库中。对于 Amazon S3，修订由其 Amazon S3 对象密钥和 ETag /或版本进行唯一标识。对于 GitHub，修订版本由其提交 ID 进行唯一标识。

## 服务角色
<a name="primary-components-service-role"></a>

*服务角色*是一个 IAM 角色，它向 AWS 服务授予权限，使其可以访问 AWS 资源。您附加到服务角色的策略决定了服务可以访问哪些 AWS 资源以及它可以对这些资源执行的操作。对于 CodeDeploy，服务角色用于以下用途：
+ 读取应用于实例的标签或与实例关联的 Amazon A EC2 uto Scaling 组名称。这样就可以 CodeDeploy 确定它可以将应用程序部署到的实例。
+ 要对实例、Amazon A EC2 uto Scaling 组和 Elastic Load Balancing 负载均衡器执行操作。
+ 向 Amazon SNS 主题发布信息，以便在发生指定部署或实例事件时发送通知。
+ 检索有关 CloudWatch 警报的信息，为部署设置警报监控。

有关更多信息，请参阅 [步骤 2：为创建服务角色 CodeDeploy](getting-started-create-service-role.md)。

## 目标修订
<a name="primary-components-target-revision"></a>

*目标修订* 是您已上传到存储库并要部署到部署组中的实例的应用程序修订的最新版本。换言之，当前面向部署的应用程序版本。这也是为自动部署提取的修订。

## 其他组件
<a name="primary-components-other-components"></a>

有关 CodeDeploy 工作流中其他组件的信息，请参阅以下主题：
+ [选择 CodeDeploy 存储库类型](application-revisions-repository-type.md)
+  [CodeDeploy 部署](deployment-steps.md)
+  [CodeDeploy 应用程序规范 (AppSpec) 文件](application-specification-files.md)
+  [CodeDeploy 实例运行状况](instances-health.md)
+  [与 CodeDeploy 代理合作](codedeploy-agent.md)
+  [使用本地实例 CodeDeploy](instances-on-premises.md)

# CodeDeploy 部署
<a name="deployment-steps"></a>

本主题提供 CodeDeploy 中部署的组件和工作流的相关信息。部署过程会有所不同，具体取决于您用于部署的计算平台或部署方法（Lambda、Amazon ECS、EC2/本地或通过 AWS CloudFormation）。

**Topics**
+ [在 AWS Lambda 计算平台上部署](deployment-steps-lambda.md)
+ [Amazon ECS 计算平台上的部署](deployment-steps-ecs.md)
+ [EC2/本地计算平台上的部署](deployment-steps-server.md)

# 在 AWS Lambda 计算平台上部署
<a name="deployment-steps-lambda"></a>

本主题提供有关使用 AWS Lambda 计算平台的 CodeDeploy 部署的组件和工作流程的信息。

**Topics**
+ [AWS Lambda 计算平台上的部署工作流程](#deployment-process-workflow-lambda)
+ [上传应用程序修订](#deployment-steps-uploading-your-app-lambda)
+ [创建应用程序和部署组](#deployment-steps-registering-app-deployment-groups-lambda)
+ [部署应用程序修订](#deployment-steps-deploy-lambda)
+ [更新 应用程序](#deployment-steps-updating-your-app-lambda)
+ [停止和失败的部署](#deployment-stop-fail-lambda)
+ [重新部署和部署回滚](#deployment-rollback-lambda)

## AWS Lambda 计算平台上的部署工作流程
<a name="deployment-process-workflow-lambda"></a>

下图显示了部署新增和更新 AWS Lambda 函数的主要步骤。

![\[如何 CodeDeploy 部署新的或更新的 AWS Lambda 函数。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/deployment-process-lambda.png)


这些步骤包括：

1. 创建应用程序并为其指定唯一标识要部署的应用程序修订的名称。要部署 Lambda 函数，请在创建应用程序时 AWS 选择 Lambda 计算平台。 CodeDeploy 在部署期间使用此名称来确保它引用了正确的部署组件，例如部署组、部署配置和应用程序修订。有关更多信息，请参阅 [使用创建应用程序 CodeDeploy](applications-create.md)。

1. 通过指定部署组的名称设置部署组。

1. 选择部署配置以指定流量如何从原始 AWS Lambda 函数版本转移到新 Lambda 函数版本。有关更多信息，请参阅 [使用查看部署配置详细信息 CodeDeploy](deployment-configurations-view-details.md)。

1. 将*应用程序规范文件（AppSpec 文件*）上传到 Amazon S3。该 AppSpec 文件指定了 Lambda 函数版本和用于验证部署的 Lambda 函数。如果您不想创建 AppSpec 文件，则可以使用 YAML 或 JSON 直接在控制台中指定 Lambda 函数版本和 Lambda 部署验证函数。有关更多信息，请参阅 [正在处理的应用程序修订版 CodeDeploy](application-revisions.md)。

1. 将您的应用程序修订部署到部署组。 AWS CodeDeploy 将部署您指定的 Lambda 函数修订版。流量将使用您在创建应用程序时选择的部署 AppSpec 文件转移到您的 Lambda 函数修订版。有关更多信息，请参阅 [使用创建部署 CodeDeploy](deployments-create.md)。

1. 检查部署结果。有关更多信息，请参阅 [监控中的部署 CodeDeploy](monitoring.md)。

## 上传应用程序修订
<a name="deployment-steps-uploading-your-app-lambda"></a>

将 AppSpec 文件放入 Amazon S3 或将其直接输入控制台或 AWS CLI。有关更多信息，请参阅 [CodeDeploy 应用程序规范 (AppSpec) 文件](application-specification-files.md)。

## 创建应用程序和部署组
<a name="deployment-steps-registering-app-deployment-groups-lambda"></a>

 AWS Lambda 计算平台上的 CodeDeploy 部署组可识别一个或多个 AppSpec 文件的集合。每个 AppSpec 文件可以部署一个 Lambda 函数版本。部署组还定义一些用于未来部署的配置选项，例如警报和回滚配置。

## 部署应用程序修订
<a name="deployment-steps-deploy-lambda"></a>

现在，您可以将 AppSpec 文件中指定的函数修订版部署到部署组了。您可以使用 CodeDeploy 控制台或[创建部署命令](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html)。可以指定一些参数（包括修订、部署组和部署配置）来控制部署。

## 更新 应用程序
<a name="deployment-steps-updating-your-app-lambda"></a>

您可以对应用程序进行更新，然后使用 CodeDeploy 控制台或调用 [create-](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html) deployment 命令来推送修订。

## 停止和失败的部署
<a name="deployment-stop-fail-lambda"></a>

您可以使用 CodeDeploy 控制台或[停止部署](https://docs.aws.amazon.com/cli/latest/reference/deploy/stop-deployment.html)命令来停止部署。当您尝试停止部署时，将发生下面三种情况之一：
+ 部署将停止，并且操作将返回成功状态。在这种情况下，没有更多的部署生命周期事件将在已停止部署的部署组上运行。
+ 部署将不会立即停止，并且操作将返回挂起状态。在这种情况下，一些部署生命周期事件可能仍在部署组上运行。在挂起的操作完成后，停止部署的后续调用将返回成功状态。
+ 部署无法停止，并且操作将返回错误。有关更多信息 [ErrorInformation](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_ErrorInformation.html)，请参阅 AWS CodeDeploy API 参考中的[常见错误](https://docs.aws.amazon.com/codedeploy/latest/APIReference/CommonErrors.html)。

与停止的部署一样，失败的部署可能导致某些部署生命周期事件已在运行。要查明部署失败的原因，可以使用 CodeDeploy 控制台或分析失败部署中的日志文件数据。有关更多信息，请参阅[应用程序修订和日志文件清理](codedeploy-agent.md#codedeploy-agent-revisions-logs-cleanup)和[查看 CodeDeploy EC2/本地部署的日志数据](deployments-view-logs.md)。

## 重新部署和部署回滚
<a name="deployment-rollback-lambda"></a>

CodeDeploy 通过将先前部署的修订版作为新部署重新部署来实现回滚。

您可以对部署组进行配置，使之在满足特定条件（例如部署失败或达到警报监控阈值）时自动回滚部署。您还可以在单个部署中覆盖为部署组指定的回滚设置。

另外，也可以选择通过手动重新部署以前部署的版本回滚失败的部署。

在所有情况下，新的或回滚的部署都分配有自己的部署 ID。您可以在 CodeDeploy 控制台中查看的部署列表显示了哪些部署是自动部署的结果。

有关更多信息，请参阅 [使用重新部署和回滚部署 CodeDeploy](deployments-rollback-and-redeploy.md)。

# Amazon ECS 计算平台上的部署
<a name="deployment-steps-ecs"></a>

本主题提供有关使用 Amazon ECS 计算平台的 CodeDeploy 部署组件和工作流程的信息。

**Topics**
+ [在开始 Amazon ECS 部署之前](#deployment-steps-prerequisites-ecs)
+ [Amazon ECS 计算平台上的部署工作流（高级）](#deployment-process-workflow-ecs)
+ [在 Amazon ECS 部署过程中发生的事件](#deployment-steps-what-happens)
+ [上传应用程序修订](#deployment-steps-uploading-your-app-ecs)
+ [创建应用程序和部署组](#deployment-steps-registering-app-deployment-groups-ecs)
+ [部署应用程序修订](#deployment-steps-deploy-ecs)
+ [更新应用程序](#deployment-steps-updating-your-app-ecs)
+ [停止和失败的部署](#deployment-stop-fail-ecs)
+ [重新部署和部署回滚](#deployment-rollback-ecs)
+ [通过 Amazon ECS blue/green 部署 AWS CloudFormation](#deployment-steps-ecs-cf)

## 在开始 Amazon ECS 部署之前
<a name="deployment-steps-prerequisites-ecs"></a>

 在开始 Amazon ECS 应用程序部署之前，必须准备好以下事项。有些要求是在创建部署组时指定的，有些则在 AppSpec 文件中指定。


****  

| 要求 | 指定的位置 | 
| --- | --- | 
| Amazon ECS 集群 | 部署组 | 
| Amazon ECS 服务 | 部署组 | 
| 应用程序负载均衡器和网络负载均衡器 | 部署组 | 
| 生产侦听器 | 部署组 | 
| 测试侦听器（可选） | 部署组 | 
| 两个目标组 | 部署组 | 
| Amazon ECS 任务定义 | AppSpec 文件 | 
| 容器名称 | AppSpec 文件 | 
| 容器端口 | AppSpec 文件 | 

**Amazon ECS 集群**  
Amazon ECS *集群*是任务或服务的逻辑分组。在创建 CodeDeploy 应用程序的部署组时，您可以指定包含您的 Amazon ECS 服务的 Amazon ECS 集群。有关更多信息，请参阅《Amazon Elastic Container Service 用户指南》**中的 [Amazon ECS 集群](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_clusters.html)。

**Amazon ECS 服务**  
Amazon ECS *服务* 维护并运行 Amazon ECS 集群中任务定义的指定实例。必须启用您的 Amazon ECS 服务 CodeDeploy。默认情况下，Amazon ECS 部署已启用 Amazon ECS 服务。当您创建部署组时，您需要选择部署 Amazon ECS 集群中的 Amazon ECS 服务。有关更多信息，请参阅《Amazon Elastic Container Service 用户指南》**中的 [Amazon ECS 服务](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html)。

**应用程序负载均衡器和网络负载均衡器**  
 您必须将 Elastic Load Balancing 与要通过部署 Amazon ECS 进行更新的 Amazon ECS 服务一起使用。您可以使用应用程序负载均衡器或网络负载均衡器。我们建议使用应用程序负载均衡器，以便您可以利用动态端口映射和基于路径的路由和优先级规则等功能。您可以在创建 CodeDeploy 应用程序的部署组时指定负载均衡器。有关更多信息，请参阅《Amazon Elastic Container Service 用户指南》**中的[为 A CodeDeploy mazon ECS 部署设置负载均衡器、目标组和侦听器](deployment-groups-create-load-balancer-for-ecs.md)和[创建负载均衡器](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-load-balancer.html)。

**一个或两个侦听器**  
*侦听器* 由负载均衡器用于将流量定向到目标组。必须提供一个生产侦听器。您可以指定可选的第二个测试侦听器，在您运行验证测试时该侦听器可以将流量定向到替换任务集。在创建部署组时，您需要指定一个或两个侦听器。如果您使用 Amazon ECS 控制台创建 Amazon ECS 服务，系统会为您创建侦听器。有关更多信息，请参阅《Elastic Load Balancing 用户指南》**中的[应用程序负载均衡器的侦听器](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listener.html)和《Amazon Elastic Container Service 用户指南》**中的[创建服务](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service.html)。

**两个 Amazon ECS 目标群体**  
 *目标组* 用于将流量路由到一个注册目标。一个 Amazon ECS 部署需要两个目标组：一个用于 Amazon ECS 应用程序的原始任务集，另一个用于其替换任务集。在部署期间， CodeDeploy 创建替换任务集并将流量从原始任务集重新路由到新任务集。在创建 CodeDeploy 应用程序的部署组时，您需要指定目标组。  
 在部署过程中， CodeDeploy 确定哪个目标组与您的 Amazon ECS 服务中具有状态的任务集相关联`PRIMARY`（这是原始任务集），并将一个目标组与该任务集相关联，然后将另一个目标组与替换任务集相关联。如果执行其他部署，则与当前部署的原始任务集关联的目标组将与下一个部署的替换任务集关联。有关更多信息，请参阅《Elastic Load Balancing 用户指南》**中的[应用程序负载均衡器的目标组](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html)。

**Amazon ECS 任务定义**  
 需要*任务定义* 才能运行包含 Amazon ECS 应用程序的 Docker 容器。您可以在 CodeDeploy 应用程序文件中指定任务定义的 AppSpec ARN。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的 [Amazon ECS 任务定义](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html)和[AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

**您的 Amazon ECS 应用程序的容器**  
 Docker *容器* 是一套打包代码及其依赖项以便应用程序运行的软件。容器可以隔离您的应用程序，使其在不同的计算环境中运行。负载均衡器将流量定向到 Amazon ECS 应用程序任务集中的容器。你可以在 CodeDeploy 应用程序 AppSpec 的文件中指定容器的名称。 AppSpec 文件中指定的容器必须是 Amazon ECS 任务定义中指定的容器之一。有关更多信息，请参阅《Amazon Elastic Container Service 用户指南》**中的[什么是 Amazon Elastic Container Service？](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)和[AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

**您的替换任务集的端口**  
 在 Amazon ECS 部署期间，您的负载均衡器会将流量引导到 CodeDeploy应用程序 AppSpec 文件中指定的容器上的此*端口*。你可以在 CodeDeploy 应用程序 AppSpec 的文件中指定端口。有关更多信息，请参阅 [AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

## Amazon ECS 计算平台上的部署工作流（高级）
<a name="deployment-process-workflow-ecs"></a>

下图显示部署更新的 Amazon ECS 服务的主要步骤。

![\[如何将应用程序作为任务集 CodeDeploy 部署到 Amazon ECS 中。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/deployment-process-ecs.png)


这些步骤包括：

1. 通过指定一个唯一代表您要部署的内容的名称来创建 AWS CodeDeploy 应用程序。要部署 Amazon ECS 应用程序，请在您的 AWS CodeDeploy 应用程序中选择 Amazon ECS 计算平台。 CodeDeploy 在部署期间使用应用程序来引用正确的部署组件，例如部署组、目标组、侦听器、流量重新路由行为以及应用程序修订。有关更多信息，请参阅 [使用创建应用程序 CodeDeploy](applications-create.md)。

1. 通过指定以下内容设置部署组：
   +  部署组名称。
   +  Amazon ECS 集群和服务名称。Amazon ECS 服务的部署控制器必须设置为 CodeDeploy。
   +  生产侦听器、可选的测试侦听器以及在部署期间使用的目标组。
   +  部署设置，例如何时将生产流量重新路由到 Amazon ECS 服务中的替换 Amazon ECS 任务集以及何时终止 Amazon ECS 服务中的原始Amazon ECS任务集。
   +  可选设置，如触发器、警报和回滚行为。

1. 指定*应用程序规范文件*（AppSpec 文件）。您可以将其上传到 Amazon S3，以 YAML 或 JSON 格式将其输入控制台，或者使用 AWS CLI 或软件开发工具包进行指定。该 AppSpec 文件指定了部署的 Amazon ECS 任务定义、用于路由流量的容器名称和端口映射，以及在部署生命周期挂钩之后运行的 Lambda 函数。容器名称必须是您的 Amazon ECS 任务定义中的容器。有关更多信息，请参阅 [正在处理的应用程序修订版 CodeDeploy](application-revisions.md)。

1. 部署您的应用程序修订版。 AWS CodeDeploy 将流量从 Amazon ECS 服务中任务集的原始版本重新路由到新的替代任务集。部署组中指定的目标组用于处理传输到原始和替换任务集的流量。在部署完成后，会终止原始任务集。您可以指定一个可选的测试侦听器，以便在将流量重新路由到替换版本之前为其提供测试流量。有关更多信息，请参阅 [使用创建部署 CodeDeploy](deployments-create.md)。

1. 检查部署结果。有关更多信息，请参阅 [监控中的部署 CodeDeploy](monitoring.md)。

## 在 Amazon ECS 部署过程中发生的事件
<a name="deployment-steps-what-happens"></a>

在启动具有测试侦听器的 Amazon ECS 部署之前，您必须配置其组件。有关更多信息，请参阅 [在开始 Amazon ECS 部署之前](#deployment-steps-prerequisites-ecs)。

 下图显示了在准备好启动 Amazon ECS 部署时，这些组件之间的关系。

![\[在准备好开始 Amazon ECS 部署时，负载均衡器、侦听器、目标组和任务集之间的关系。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-1.png)


当部署启动时，开始一次执行一个部署生命周期事件。某些生命周期事件是仅执行文件中指定的 Lambda 函数的 AppSpec 挂钩。下表中的部署生命周期事件按照执行的顺序列出。有关更多信息，请参阅 [AppSpec 亚马逊 ECS 部署的 “挂钩” 部分](reference-appspec-file-structure-hooks.md#appspec-hooks-ecs)。


| 生命周期事件 | 生命周期事件操作 | 
| --- | --- | 
| BeforeInstall（Lambda 函数的挂钩） | 运行 Lambda 函数。 | 
| 安装 | 设置替换任务集。 | 
| AfterInstall（Lambda 函数的挂钩） | 运行 Lambda 函数。 | 
| AllowTestTraffic | 将流量从测试侦听器路由至目标组 2。 | 
| AfterAllowTestTraffic（Lambda 函数的挂钩） | 运行 Lambda 函数。 | 
| BeforeAllowTraffic（Lambda 函数的挂钩） | 运行 Lambda 函数。 | 
| AllowTraffic | 将流量从生产侦听器路由至目标组 2。 | 
| AfterAllowTraffic | 运行 Lambda 函数。 | 



**注意**  
挂钩中的 Lambda 函数是可选的。

1. <a name="ecs-before-install"></a>

****

   在文件中执行`BeforeInstall`挂钩中指定的任何 Lambda 函数。 AppSpec 

1. <a name="ecs-install"></a>

****

   在 `Install` 生命周期事件期间：

   1.  在您的 Amazon ECS 服务中创建替换任务集。

   1.  更新后的容器化应用程序安装到替换任务集中。

   1.  第二个目标组与替换任务集关联。

    此图显示具有新替换任务集的部署组件。容器化应用程序位于此任务集的内部。任务集包含三个任务。（应用程序可以具有任意数量的任务。） 第二个目标组现与替换任务集关联。  
![\[具有新的替换任务集的部署组件。容器化应用程序位于此任务集的内部。任务集包含三个任务。第二个目标组现与替换任务集关联。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-2.png)

1. <a name="ecs-after-install"></a>

****

   在文件中执行`AfterInstall`挂钩中指定的任何 Lambda 函数。 AppSpec 

1. <a name="ecs-allow-test-traffic"></a>

****

   调用了 `AllowTestTraffic` 事件。在此生命周期事件中，测试侦听器将流量路由到更新后的容器化应用程序中。  
![\[测试侦听器将流量路由到更新后的容器化应用程序中。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-3.png)

1. <a name="ecs-after-allow-test-traffic"></a>

****

   在文件中执行`AfterAllowTestTraffic`挂钩中指定的任何 Lambda 函数。 AppSpec Lambda 函数可以使用测试流量来验证部署。例如，Lambda 函数可以向测试侦听器提供流量，并跟踪替换任务集的指标。如果配置了回滚，则可以配置 CloudWatch 警报，在 Lambda 函数中的验证测试失败时触发回滚。

    验证测试完成后，将会发生以下情况之一：
   +  如果验证失败并配置了回滚，则部署状态标记为 `Failed`，组件返回其开始部署时的状态。
   +  如果验证失败但未配置回滚，则部署状态标记为 `Failed`，并且组件保持其当前状态。
   +  如果验证成功，则部署将继续到 `BeforeAllowTraffic` 挂钩。

    有关更多信息，请参阅 [使用 CloudWatch 警报监控部署 CodeDeploy](monitoring-create-alarms.md)、[自动回滚](deployments-rollback-and-redeploy.md#deployments-rollback-and-redeploy-automatic-rollbacks) 和 [为部署组配置高级选项](deployment-groups-configure-advanced-options.md)。

1. <a name="ecs-before-allow-traffic"></a>

****

   在文件中执行`BeforeAllowTraffic`挂钩中指定的任何 Lambda 函数。 AppSpec 

1. <a name="ecs-allow-traffic"></a>

****

   调用了 `AllowTraffic` 事件。生产流量从原始任务集重新路由到替换任务集。下图显示了接收生产流量的替换任务集。  
![\[替换任务集接收生产流量。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-4.png)

1. <a name="ecs-after-allow-traffic"></a>

****

   在文件中执行`AfterAllowTraffic`挂钩中指定的任何 Lambda 函数。 AppSpec 

1. 

****

   所有事件成功后，部署状态设置为 `Succeeded` 并删除原始任务集。  
![\[所有事件均成功完成。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-6.png)

## 上传应用程序修订
<a name="deployment-steps-uploading-your-app-ecs"></a>

将 AppSpec 文件放入 Amazon S3 或将其直接输入控制台或 AWS CLI。有关更多信息，请参阅 [CodeDeploy 应用程序规范 (AppSpec) 文件](application-specification-files.md)。

## 创建应用程序和部署组
<a name="deployment-steps-registering-app-deployment-groups-ecs"></a>

Amazon ECS 计算平台上的 CodeDeploy 部署组可识别向更新后的 Amazon ECS 应用程序提供流量的侦听器和部署期间使用的两个目标组。部署组还定义一组配置选项，例如警报和回滚配置。

## 部署应用程序修订
<a name="deployment-steps-deploy-ecs"></a>

现在，您已准备好部署在部署组中指定的更新的 Amazon ECS 服务。您可以使用 CodeDeploy 控制台或[创建部署命令](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html)。可以指定一些参数（包括修订和部署组）来控制部署。

## 更新应用程序
<a name="deployment-steps-updating-your-app-ecs"></a>

您可以对应用程序进行更新，然后使用 CodeDeploy 控制台或调用 [create-](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html) deployment 命令来推送修订。

## 停止和失败的部署
<a name="deployment-stop-fail-ecs"></a>

您可以使用 CodeDeploy 控制台或[停止部署](https://docs.aws.amazon.com/cli/latest/reference/deploy/stop-deployment.html)命令来停止部署。当您尝试停止部署时，将发生下面三种情况之一：
+ 部署将停止，并且操作将返回成功状态。在这种情况下，没有更多的部署生命周期事件将在已停止部署的部署组上运行。
+ 部署将不会立即停止，并且操作将返回挂起状态。在这种情况下，一些部署生命周期事件可能仍在部署组上运行。在挂起的操作完成后，停止部署的后续调用将返回成功状态。
+ 部署无法停止，并且操作将返回错误。有关更多信息，请参阅 AWS CodeDeploy API 参考中的[错误信息和](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_ErrorInformation.html)[常见错误](https://docs.aws.amazon.com/codedeploy/latest/APIReference/CommonErrors.html)。

## 重新部署和部署回滚
<a name="deployment-rollback-ecs"></a>

CodeDeploy 通过将流量从替换任务集重新路由到原始任务集来实现回滚。

您可以对部署组进行配置，使之在满足特定条件（例如部署失败或达到警报监控阈值）时自动回滚部署。您还可以在单个部署中覆盖为部署组指定的回滚设置。

另外，也可以选择通过手动重新部署以前部署的版本回滚失败的部署。

在所有情况下，新的或回滚的部署都分配有自己的部署 ID。 CodeDeploy 控制台显示列出自动部署结果的部署列表。

如果进行重新部署，则与当前部署的原始任务集关联的目标组将与重新部署的替换任务集关联。

有关更多信息，请参阅 [使用重新部署和回滚部署 CodeDeploy](deployments-rollback-and-redeploy.md)。

## 通过 Amazon ECS blue/green 部署 AWS CloudFormation
<a name="deployment-steps-ecs-cf"></a>

您可以使用 AWS CloudFormation 通过管理 Amazon ECS blue/green 部署 CodeDeploy。有关更多信息，请参阅 [通过创建 Amazon ECS blue/green 部署 CloudFormation](deployments-create-ecs-cfn.md)。

**注意**  
亚太地区（大阪）区域 CloudFormation 不支持使用管理 Amazon ECS blue/green 部署。

# EC2/本地计算平台上的部署
<a name="deployment-steps-server"></a>

本主题提供有关使用 EC2/本地计算平台的 CodeDeploy 部署的组件和工作流程的信息。有关 blue/green 部署的信息，请参阅[blue/green 部署概述](welcome.md#welcome-deployment-overview-blue-green)。

**Topics**
+ [EC2/本地计算平台上的部署组件](#deployment-steps-components-server)
+ [EC2/本地计算平台上的部署工作流程](#deployment-steps-workflow)
+ [设置实例](#deployment-steps-setting-up-instances)
+ [上传应用程序修订](#deployment-steps-uploading-your-app)
+ [创建应用程序和部署组](#deployment-steps-registering-app-deployment-groups)
+ [部署应用程序修订](#deployment-steps-deploy)
+ [更新 应用程序](#deployment-steps-updating-your-app)
+ [停止和失败的部署](#deployment-stop-fail)
+ [重新部署和部署回滚](#deployment-rollback)

## EC2/本地计算平台上的部署组件
<a name="deployment-steps-components-server"></a>

下图显示了 EC2/本地计算平台上 CodeDeploy 部署的组件。

![\[在 EC2/本地计算平台上 CodeDeploy 部署的组件。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/deployment-components-workflow.png)


## EC2/本地计算平台上的部署工作流程
<a name="deployment-steps-workflow"></a>

下图显示部署应用程序修订的主要步骤：

![\[部署应用程序修订的主要步骤。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/deployment-process.png)


这些步骤包括：

1. 创建应用程序并为其命名，以唯一标识要部署的应用程序修订版和应用程序的计算平台。 CodeDeploy 在部署期间使用此名称来确保它引用了正确的部署组件，例如部署组、部署配置和应用程序修订。有关更多信息，请参阅 [使用创建应用程序 CodeDeploy](applications-create.md)。

1. 指定部署类型以及要将应用程序修订部署到的实例，以此来设置部署组。就地部署将使用最新的应用程序修订更新实例。 blue/green 部署使用负载均衡器为部署组注册一组替换实例，并注销原始实例。

   可以指定应用于实例的标签和/或 Amazon EC2 Auto Scaling 组名称。

   如果您在部署组中指定了一组标签，则会 CodeDeploy 部署到至少应用了其中一个指定标签的实例。如果您指定两个或更多标签组，则仅 CodeDeploy 部署到符合每个标签组标准的实例。有关更多信息，请参阅 [为部署组的实例添加标签 CodeDeploy](instances-tagging.md)。

   在所有情况下，都必须将实例配置为在部署中使用（也就是说，它们必须被标记或属于 Amazon EC2 Auto Scaling 组），并且必须安装并运行 CodeDeploy 代理。

   我们为您提供一个 CloudFormation 模板，您可以使用该模板快速设置基于亚马逊 Linux 或 Windows 服务器的 Amazon EC2 实例。我们还为您提供独立 CodeDeploy 代理，以便您可以将其安装在亚马逊 Linux、Ubuntu 服务器、红帽企业 Linux (RHEL) 或 Windows 服务器实例上。有关更多信息，请参阅 [使用创建部署组 CodeDeploy](deployment-groups-create.md)。

   您还可以指定以下选项：
   + **Amazon SNS 通知**。创建触发器，以便在部署和实例中发生指定的事件（例如，成功或失败事件）时，向 Amazon SNS 主题的订阅者发送通知。有关更多信息，请参阅 [使用 Amazon SNS 事件通知监控部署](monitoring-sns-event-notifications.md)。
   + **基于警报的部署管理**。实施 Amazon CloudWatch 警报监控，以便在您的指标超过或低于中设定的阈值时停止部署 CloudWatch。
   + **自动部署回滚**。配置部署，使之在部署失败或达到警报阈值时自动回滚到已知良好的版本。

1. 指定部署配置，以指示您的应用程序修订需要同时部署多少个实例，以及说明部署到成功和失败条件。有关更多信息，请参阅 [使用查看部署配置详细信息 CodeDeploy](deployment-configurations-view-details.md)。

1. 将应用程序修订版上传到 Amazon S3 或 GitHub。除了要部署的文件和要在部署期间运行的任何脚本外，还必须包括*应用程序规范文件*（AppSpec 文件）。该文件包含部署说明，例如，要将文件复制到的每个实例上的位置，以及运行部署脚本的时间。有关更多信息，请参阅 [正在处理的应用程序修订版 CodeDeploy](application-revisions.md)。

1. 将应用程序修订部署到部署组。部署组中每个实例上的 CodeDeploy 代理会将您的应用程序修订从 Amazon S3 复制 GitHub 到该实例。然后， CodeDeploy 代理解绑修订版，并使用该 AppSpec 文件将文件复制到指定位置并执行所有部署脚本。有关更多信息，请参阅 [使用创建部署 CodeDeploy](deployments-create.md)。

1. 检查部署结果。有关更多信息，请参阅 [监控中的部署 CodeDeploy](monitoring.md)。

1. 部署修订。如果您需要修复源内容中的错误，或以不同顺序运行部署脚本，或处理失败的部署，则可能需要重新部署。为此，请将修改后的源内容、所有部署脚本和 AppSpec 文件重新捆绑到新的修订版中，然后将修订版上传到 Amazon S3 存储桶或存储 GitHub 库。然后，使用新修订执行到同一部署组的新部署。有关更多信息，请参阅 [使用创建部署 CodeDeploy](deployments-create.md)。

## 设置实例
<a name="deployment-steps-setting-up-instances"></a>

 您必须先设置实例，然后才能首次部署应用程序修订。如果一个应用程序修订需要三个生产服务器和两个备份服务器，您将启动或使用五个实例。

要手动预配置实例，请执行以下操作：

1. 在实例上安装 CodeDeploy 代理。该 CodeDeploy 代理可以安装在亚马逊 Linux、Ubuntu Server、RHEL 和 Windows 服务器实例上。

1. 如果您使用标签来识别部署组中的实例，请启用标记。 CodeDeploy 依靠标签来识别实例并将其分组到 CodeDeploy 部署组中。尽管入门教程同时使用了键和值，但是您可以只使用键或值为部署组定义标签。

1. 启动附加有 IAM 实例配置文件的 Amazon EC2 实例。IAM 实例配置文件必须在 Amazon EC2 实例启动时附加到该实例， CodeDeploy 代理才能验证该实例的身份。

1. 创建服务角色。提供服务访问权限，以便 CodeDeploy 可以扩展您 AWS 账户中的标签。

对于初始部署， CloudFormation 模板会为您完成所有这些操作。它基于已安装 CodeDeploy 代理的亚马逊 Linux 或 Windows 服务器创建和配置新的单个 Amazon EC2 实例。有关更多信息，请参阅 [使用以下实例 CodeDeploy](instances.md)。

**注意**  
对于 blue/green 部署，您可以选择使用已有的替换环境实例，也可以让您在部署过程中 CodeDeploy 配置新实例。

## 上传应用程序修订
<a name="deployment-steps-uploading-your-app"></a>

将 AppSpec 文件放在应用程序源内容文件夹结构中的根文件夹下。有关更多信息，请参阅 [CodeDeploy 应用程序规范 (AppSpec) 文件](application-specification-files.md)。

将应用程序源内容文件夹结构捆绑成存档文件格式，例如 zip、tar 或压缩的 tar。将存档文件（*修订版*）上传到 Amazon S3 存储桶或 GitHub 存储库。

**注意**  
Windows Server 实例不支持 tar 和压缩的 tar 存档文件格式（.tar 和.tar.gz）。

## 创建应用程序和部署组
<a name="deployment-steps-registering-app-deployment-groups"></a>

 CodeDeploy 部署组根据实例的标签、Amazon EC2 Auto Scaling 组名称或两者来识别一组实例。可以向同一实例部署多个应用程序修订。可以向多个实例部署一个应用程序修订。

例如，可以为三个生产服务器添加标签“Prod”，为两个备份服务器添加标签“Backup”。这两个标签可用于在 CodeDeploy 应用程序中创建两个不同的部署组，从而允许您选择哪组（或两者）应参与部署。

您可以在部署组中使用多个标签组，将部署限制到一组较少的实例。有关信息，请参阅[为部署组的实例添加标签 CodeDeploy](instances-tagging.md)。

## 部署应用程序修订
<a name="deployment-steps-deploy"></a>

现在，您可以从 Amazon S3 或 GitHub 部署组部署您的应用程序修订了。您可以使用 CodeDeploy 控制台或[创建部署命令](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html)。可以指定一些参数（包括修订、部署组和部署配置）来控制部署。

## 更新 应用程序
<a name="deployment-steps-updating-your-app"></a>

您可以对应用程序进行更新，然后使用 CodeDeploy 控制台或调用 [create-](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html) deployment 命令来推送修订。

## 停止和失败的部署
<a name="deployment-stop-fail"></a>

您可以使用 CodeDeploy 控制台或[停止部署](https://docs.aws.amazon.com/cli/latest/reference/deploy/stop-deployment.html)命令来停止部署。当您尝试停止部署时，将发生下面三种情况之一：
+ 部署将停止，并且操作将返回成功状态。在这种情况下，没有更多的部署生命周期事件将在已停止部署的部署组上运行。一些文件可能已复制到部署组中的一个或多个实例，并且一些脚本可能已在一个或多个实例上运行。
+ 部署将不会立即停止，并且操作将返回挂起状态。在这种情况下，一些部署生命周期事件可能仍在部署组上运行。一些文件可能已复制到部署组中的一个或多个实例，并且一些脚本可能已在一个或多个实例上运行。在挂起的操作完成后，停止部署的后续调用将返回成功状态。
+ 部署无法停止，并且操作将返回错误。有关更多信息 [ErrorInformation](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_ErrorInformation.html)，请参阅 AWS CodeDeploy API 参考中的[常见错误](https://docs.aws.amazon.com/codedeploy/latest/APIReference/CommonErrors.html)。

与停止的部署一样，失败的部署可能导致一些部署生命周期事件已在部署组中的一个或多个实例上运行。要找出部署失败的原因，您可以使用 CodeDeploy 控制台、调用[get-deployment-instance](https://docs.aws.amazon.com/cli/latest/reference/deploy/get-deployment-instance.html)命令或分析失败部署的日志文件数据。有关更多信息，请参阅[应用程序修订和日志文件清理](codedeploy-agent.md#codedeploy-agent-revisions-logs-cleanup)和[查看 CodeDeploy EC2/本地部署的日志数据](deployments-view-logs.md)。

## 重新部署和部署回滚
<a name="deployment-rollback"></a>

CodeDeploy 通过将先前部署的修订版作为新部署重新部署来实现回滚。

您可以对部署组进行配置，使之在满足特定条件（例如部署失败或达到警报监控阈值）时自动回滚部署。您还可以在单个部署中覆盖为部署组指定的回滚设置。

另外，也可以选择通过手动重新部署以前部署的版本回滚失败的部署。

在所有情况下，新的或回滚的部署都分配有自己的部署 ID。您可以在 CodeDeploy 控制台中查看的部署列表显示了哪些部署是自动部署的结果。

有关更多信息，请参阅 [使用重新部署和回滚部署 CodeDeploy](deployments-rollback-and-redeploy.md)。

# CodeDeploy 应用程序规范 (AppSpec) 文件
<a name="application-specification-files"></a>

应用程序规范文件（AppSpec 文件）是唯一的，是 [YAML](http://www.yaml.org) 格式或 [JSON](http://www.json.org) 格式的文件。 CodeDeploy该 AppSpec 文件用于将每个部署作为一系列生命周期事件挂钩进行管理，这些挂钩在文件中定义。

有关如何创建格式良好的 AppSpec 文件的信息，请参见[CodeDeploy AppSpec 文件引用](reference-appspec-file.md)。

**Topics**
+ [AppSpec 亚马逊 ECS 计算平台上的文件](#appspec-files-on-ecs-compute-platform)
+ [AppSpec AWS Lambda 计算平台上的文件](#appspec-files-on-lambda-compute-platform)
+ [AppSpec EC2/本地计算平台上的文件](#appspec-files-on-server-compute-platform)
+ [CodeDeploy 代理如何使用该 AppSpec 文件](#application-specification-files-agent-usage)

## AppSpec 亚马逊 ECS 计算平台上的文件
<a name="appspec-files-on-ecs-compute-platform"></a>

如果您的应用程序使用 Amazon ECS 计算平台，则可以使用 YAML 或 JSON 格式化 AppSpec 文件。它还可以直接键入到控制台中的编辑器内。该 AppSpec 文件用于指定：
+ 用于将流量定向到新任务集的 Amazon ECS 服务名称以及容器名称和端口。
+ 要用作验证测试的函数。

可以在部署生命周期事件后验证 Lambda 函数。有关更多信息，请参阅 [AppSpec 亚马逊 ECS 部署的 “挂钩” 部分](reference-appspec-file-structure-hooks.md#appspec-hooks-ecs)、[AppSpec Amazon ECS 部署的文件结构](reference-appspec-file-structure.md#ecs-appspec-structure) 和 [AppSpec Amazon ECS 部署的文件示例](reference-appspec-file-example.md#appspec-file-example-ecs)。

## AppSpec AWS Lambda 计算平台上的文件
<a name="appspec-files-on-lambda-compute-platform"></a>

如果您的应用程序使用 AWS Lambda 计算平台，则可以使用 YAML 或 JSON 格式化 AppSpec 文件。它还可以直接键入到控制台中的编辑器内。该 AppSpec 文件用于指定：
+ 要部署的 AWS Lambda 函数版本。
+ 要用作验证测试的函数。

可以在部署生命周期事件后验证 Lambda 函数。有关更多信息，请参阅 [AppSpec AWS Lambda 部署的 “挂钩” 部分](reference-appspec-file-structure-hooks.md#appspec-hooks-lambda)。

## AppSpec EC2/本地计算平台上的文件
<a name="appspec-files-on-server-compute-platform"></a>

如果您的应用程序使用 EC2/本地计算平台，则该 AppSpec 文件始终采用 YAML 格式。该 AppSpec 文件用于：
+ 将应用程序修订中的源文件映射到其在实例上的目的地。
+ 为部署的文件指定自定义权限。
+ 指定要在部署过程的各个阶段在每个实例上运行的脚本。

在多个单独的部署生命周期事件发生后，您可以在实例上运行脚本。 CodeDeploy 仅运行文件中指定的脚本，但这些脚本可以调用实例上的其他脚本。您可以运行任何类型的脚本，只要该脚本受实例上运行的操作系统支持即可。有关更多信息，请参阅 [AppSpec EC2/本地部署的 “挂钩” 部分](reference-appspec-file-structure-hooks.md#appspec-hooks-server)。

## CodeDeploy 代理如何使用该 AppSpec 文件
<a name="application-specification-files-agent-usage"></a>

部署期间， CodeDeploy 代理会在 AppSpec 文件的 **hooks** 部分中查找当前事件的名称。如果找不到该事件， CodeDeploy 代理将移到下一步。如果找到该事件， CodeDeploy 代理将检索要执行的脚本列表。脚本按其在文件中的出现顺序运行。每个脚本的状态都记录在实例的 CodeDeploy 代理日志文件中。

如果脚本运行成功，则返回退出代码 0（零）。

**注意**  
 在 AWS Lambda 或 Amazon ECS 部署中不使用该 CodeDeploy 代理。

在**安装**事件期间， CodeDeploy 代理使用**文件**部分中定义的映射来确定要将哪些文件夹或文件从修订版复制到实例。 AppSpec 

如果操作系统上安装的 CodeDeploy 代理与 AppSpec 文件中列出的代理不匹配，则部署将失败。

有关 CodeDeploy 代理日志文件的信息，请参见[与 CodeDeploy 代理合作](codedeploy-agent.md)。