

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

# 使用 AWS CodePipeline、AWS 和 AWS 在多个 AWS CodeCommit 区域部署代码 CodeBuild
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild"></a>

*Anand Krishna Varanasi，Amazon Web Services*

## Summary
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild-summary"></a>

此模式演示了如何使用 AWS 跨多个 Amazon Web Services (AWS) 区域构建基础设施或架构 CloudFormation。它包括跨多个 AWS 区域的持续集成（CI）/持续部署（CD），以实现更快的部署。****例如，此模式中的步骤已经过测试，用于创建部署到三个 AWS 区域的 AWS CodePipeline 任务。您可以基于用例来更改区域数量。

## 先决条件和限制
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户。
+ 
  + *在 AmazonS3 FullAccess* 和*CloudWatchFullAccess*政策中 CodeBuild 扮演的角色。这些政策 CodeBuild 允许 CodeCommit 通过亚马逊观看 AWS 的事件， CloudWatch 以及使用亚马逊简单存储服务 (Amazon S3) Simple Storage Service 作为工件存储。
  + 具有以下策略的 AWS CloudFormation 角色，这些策略使 AWS CloudFormation 能够在最后的构建阶段创建或更新 AWS Lambda 函数、推送或监视 Amazon CloudWatch 日志，以及创建和更新更改集。 
    + *AWSLambdaFullAccess*
    + *AWSCodeDeployFullAccess*
    + *CloudWatchFullAccess*
    + *AWSCloudFormationFullAccess*
    + *AWSCodePipelineFullAccess*
**注意**  
两个 AWS 和 AWS 的 AWS CodeBuild Identity and Access Management (IAM) 角色 CloudFormation 具有适当的策略，用于 CodeBuild 执行 CI 任务，即测试、捆绑、打包工件以及并行部署到多个 AWS 区域。  交叉检查由创建的策略 CodePipeline 以验证是否 CodeBuild 和 AWS 在 CI 和 CD 阶段 CloudFormation 具有适当的权限。

## 架构
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild-architecture"></a>

![部署到三个 AWS 区域的 AWS CodePipeline 任务。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/d44c393c-7243-4d4e-8b84-88a8503af98f/images/5c27fc35-5e62-4292-8b18-a7bc7faf2631.png)


此模式的多区域架构和工作流程包括以下步骤。

1. 您将代码发送到存储 CodeCommit 库。

1. 在收到任何代码更新或提交后， CodeCommit 调用一个 CloudWatch 事件，该事件反过来会启动作 CodePipeline 业。

1. CodePipeline 使用由 CodeBuild处理的 CI。将执行以下任务。
   + 测试 AWS CloudFormation 模板（可选）
   + 打包部署中包含的每个区域的 AWS CloudFormation 模板。例如，此模式与三个 AWS 区域并行部署，因此将 AWS CloudFormation 模板 CodeBuild 打包到三个 S3 存储桶中，每个指定区域一个。S3 存储桶仅供 CodeBuild 用作项目存储库。

1. CodeBuild 将工件打包为下一个部署阶段的输入，该阶段将在三个 AWS 区域并行运行。如果您指定不同数量的区域，则 CodePipeline 会部署到这些区域。

## 工具
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild-tools"></a>

**工具**
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) — CodePipeline 是一项持续交付服务，可用于对持续发布软件变更所需的步骤进行建模、可视化和自动化。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) — CodeBuild 是一项完全托管的构建服务，可编译您的源代码、运行单元测试并生成可随时部署的项目。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) — CodeCommit 是一项由 Amazon Web Services 托管的版本控制服务，您可以使用它来私下存储和管理云中的资产（例如源代码和二进制文件）。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) — AWS CloudFormation 是一项服务，可帮助您建模和设置 Amazon Web Services 资源，这样您就可以花更少的时间管理这些资源，而将更多的时间集中在在 AWS 中运行的应用程序上。
+ [AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)– AWS Identity and Access Management (IAM) 是一项 Web 服务，可帮助您安全地控制对 AWS 资源的访问。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) – Amazon Simple Storage Service (Amazon S3) 是一项面向互联网的存储服务。该服务旨在降低开发人员进行网络规模级计算的难度。

**代码**

以下示例代码适用于该 `BuildSpec.yaml` 文件（构建阶段）。

```
---
artifacts:
discard-paths: true
files:
- packaged-first-region.yaml
- packaged-second-region.yaml
- packaged-third-region.yaml
phases:
build:
commands:
- echo "********BUILD PHASE - CF PACKAGING**********"
- "aws cloudformation package --template-file sam-template.yaml --s3-bucket $S3_FIRST_REGION --output-template-file packaged-first-region.yaml --region $FIRST_REGION"
- "aws cloudformation package --template-file sam-template.yaml --s3-bucket $S3_SECOND_REGION --output-template-file packaged-second-region.yaml --region $SECOND_REGION"
- "aws cloudformation package --template-file sam-template-anand.yaml --s3-bucket $S3_THIRD_REGION --output-template-file packaged-third-region.yaml --region $THIRD_REGION"
install:
commands:
- echo "********BUILD PHASE - PYTHON SETUP**********"
runtime-versions:
python: 3.8
post_build:
commands:
- echo "********BUILD PHASE - PACKAGING COMPLETION**********"
pre_build:
commands:
- echo "********BUILD PHASE - DEPENDENCY SETUP**********"
- "npm install --silent --no-progress"
- echo "********BUILD PHASE - DEPENDENCY SETUP DONE**********"
version: 0.2
```

## 操作说明
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild-epics"></a>

### 准备代码和 CodeCommit 存储库
<a name="prepare-the-code-and-the-codecommit-repository"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 选择用于部署的主要 AWS 区域。 | 登录 Amazon Web Services account，选择要部署的主区域。 CodeCommit 存储库将位于主区域。 | DevOps | 
| 创建 CodeCommit 存储库。 | 创建 CodeCommit 存储库，并将所需的代码推送到其中。该代码通常包括 AWS CloudFormation 或 AWS SAM 模板、Lambda 代码（如果有）以及作为 AWS 输入的 CodeBuild `buildspec.yaml`文件。 CodePipeline | DevOps | 
| 将代码推送到 CodeCommit 存储库中。 | 在*附件*部分中，下载此示例的代码，然后将所需代码推送到其中。通常，代码可以包含 AWS CloudFormation 或 AWS SAM 模板、Lambda 代码和作为管道输入的 CodeBuild `buildspec.yaml`文件。 | DevOps | 

### 源代码阶段：创建管线
<a name="source-phase-create-the-pipeline"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建作 CodePipeline 业。 | 在 CodePipeline 控制台上，选择**创建管道**。 | DevOps | 
| 为 CodePipeline 作业命名并选择服务角色设置。 | 输入作业的名称，并保留默认的服务角色设置，以便 CodePipeline 创建附加必要策略的角色。 | DevOps | 
| 指定构件存储的位置。 | 在 **“高级设置”** 下，保留默认选项，以便 CodePipeline 创建用于存储代码项目的 S3 存储桶。如果您改用现有 S3 存储桶，则该存储桶必须位于您在第一个操作说明中指定的主区域。 | DevOps | 
| 指定加密密钥。 | 保留默认选项：**默认 AWS 托管式密钥**，或者选择使用您自己的 AWS Key Management Service（AWS KMS）客户托管密钥。 | DevOps | 
| 指定源提供程序。 | 在**来源提供商**下，选择 **AWS CodeCommit**。 | DevOps | 
| 指定存储库。 | 选择您在第一部长篇故事中创建的 CodeCommit 存储库。如果您将代码放在分支中，请选择该分支。 | DevOps | 
| 指定如何检测代码更改。 | 保留默认的 **Amazon Ev CloudWatch en** ts 作为启动 CodePipeline 任务的 CodeCommit 更改触发器。 | DevOps | 

### 构建阶段：配置管线
<a name="build-phase-configure-the-pipeline"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 指定构建提供程序。 | 对于构建提供商，请选择 **AWS CodeBuild**。 | DevOps | 
| 指定 AWS 区域。 | 选择您在第一个操作说明中指定的主区域。 | DevOps | 

### 构建阶段：创建和配置项目
<a name="build-phase-create-and-configure-the-project"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建项目 | 选择**创建项目**，然后输入项目的名称。 | DevOps | 
| 指定环境映像。 | 对于此模式演示，请使用默认的 CodeBuild 托管映像。如果您有自定义的 Docker 映像，您还可以选择使用该 Docker 映像。 | DevOps | 
| 指定操作系统。 | 选择 Amazon Linux 2 或 Ubuntu。即将终止对 Amazon Linux 2 的支持。欲了解更多信息，请参阅[亚马逊 Linux 2 FAQs](https://aws.amazon.com/amazon-linux-2/faqs/)。 | DevOps | 
| 指定服务角色。 | 选择您在开始创建 CodePipeline 作业 CodeBuild 之前为其创建的角色。（请参阅*先决条件*部分。） | DevOps | 
| 设置其他选项。 | 对于**超时**和**队列超时**，请保留默认值。对于证书，除非您有要使用的自定义证书，否则请保留默认设置。 | DevOps | 
| 创建环境变量。 | 对于您要部署到的每个 AWS 区域，请通过提供 S3 存储桶名称和区域名称（例如 us-east-1）来创建环境变量。 | DevOps | 
| 如果不是 buildspec.yml，请提供 buildspec 文件名。 | 如果文件名为默认名称 `buildspec.yaml`，则将此字段留空。如果您重命名了 buildspec 文件，请在此处输入名称。确保它与 CodeCommit 存储库中文件的名称相匹配。 | DevOps | 
| 指定日志记录。 | 要查看 Amazon CloudWatch 事件的日志，请保留默认设置。或者，您可以定义任何特定的组或记录器名称。 | DevOps | 

### 跳过“部署”阶段
<a name="skip-the-deploy-phase"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 跳过部署阶段并完成管线的创建。 | 设置管道时，只 CodePipeline 允许您在 “部署” 阶段创建一个阶段。要部署到多个 AWS 区域，请跳过此阶段。创建管线后，您可以添加“部署阶段”的多个阶段。 | DevOps | 

### 部署阶段：配置管线以部署到第一个区域
<a name="deploy-phase-configure-the-pipeline-for-deployment-to-the-first-region"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 向部署阶段添加阶段。 | 编辑管线，然后在“部署”阶段选择**添加阶段**。第一个阶段适用于主区域。 | DevOps | 
| 提供阶段的操作名称。 | 输入反映第一个（主）阶段和区域的唯一名称。例如，输入 **primary\_<region>\_deploy**。 | DevOps | 
| 指定操作提供程序。 | 对于**操作提供者**，请选择 AWS CloudFormation。 | DevOps | 
| 为第一个阶段配置区域。 | 选择第一个（主要）区域，即设置 CodePipeline 和 CodeBuild 的相同区域。这是您要在其中部署堆栈的主区域。 | DevOps | 
| 指定输入构件。 | 选择 **BuildArtifact**。这是构建阶段的输出。 | DevOps | 
| 指定要采取的操作。 | 对于**操作模式**，选择**创建或更新堆栈**。 | DevOps | 
| 输入堆 CloudFormation 栈的名称。 |  | DevOps | 
| 为第一个区域指定模板。 | 选择由第一个（主）区域打包 CodeBuild 并转储到第一个（主）区域的 S3 存储桶中的特定于区域的软件包名称。 | DevOps | 
| 指定功能。 | 如果堆栈模板包含 IAM 资源，或者您直接使用包含宏的模板创建堆栈，则需要功能。对于这种模式，请使用 CAPABILITY\_IAM、CAPABILITY\_NAMED\_IAM、CAPABILITY\_AUTO\_EXPAND。 | DevOps | 

### 部署阶段：配置管线以部署到第二个区域
<a name="deploy-phase-configure-the-pipeline-for-deployment-to-the-second-region"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将第二个阶段添加到“部署”阶段。 | 要为第二个区域添加阶段，请编辑管线并在“部署”阶段选择**添加阶段**。重要：创建第二个区域的过程与第一个区域的创建过程相同，但以下值除外。 | DevOps | 
| 提供第二个阶段的操作名称。 | 输入反映第二个阶段和第二个区域的唯一名称。 | DevOps | 
| 为第二个阶段配置区域。 | 选择您希望在其上部署堆栈的第二个区域。 | DevOps | 
| 为第二个区域指定模板。 | 选择由第二个区域打包 CodeBuild 并转储到 S3 存储桶中的特定于区域的软件包名称。 | DevOps | 

### 部署阶段：配置管线以部署到第三个区域
<a name="deploy-phase-configure-the-pipeline-for-deployment-to-the-third-region"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将第三个阶段添加到“部署”阶段。 | 要为第三个区域添加阶段，请编辑管线并在“部署”阶段选择**添加阶段**。重要：创建第三个区域的过程与前两个区域的创建过程相同，但以下值除外。 | DevOps | 
| 提供第三个阶段的操作名称。 | 输入反映第三个阶段和第三个区域的唯一名称。 | DevOps | 
| 为第三个阶段配置区域。 | 选择您希望在其上部署堆栈的第三个区域。 | DevOps | 
| 为第三个区域指定模板。 | 选择由第三个区域打包 CodeBuild 并转储到 S3 存储桶中的特定于区域的软件包名称。 | DevOps | 

### 清理部署
<a name="clean-up-the-deployment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除 AWS 资源。 | 要清理部署，请删除每个区域中的 CloudFormation 堆栈。然后从主区域中删除 CodeCommit CodeBuild、和 CodePipeline 资源。 | DevOps | 

## 相关资源
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild-resources"></a>
+ [什么是 AWS CodePipeline？](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html)
+ [AWS 无服务器应用程序模型](https://aws.amazon.com/serverless/sam/)
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)
+ [适用于 AWS 的 AWS CloudFormation 架构结构参考 CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CloudFormation.html)

## 附件
<a name="attachments-d44c393c-7243-4d4e-8b84-88a8503af98f"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/d44c393c-7243-4d4e-8b84-88a8503af98f/attachments/attachment.zip)