

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 AWS CodePipeline、AWS CodeCommit 和 AWS CodeBuild 在多個 AWS 區域中部署程式碼
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild"></a>

*Anand Krishna Varanasi，Amazon Web Services*

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

此模式示範如何使用 AWS CloudFormation 跨多個 Amazon Web Services (AWS) 區域建置基礎設施或架構。它包含跨多個 AWS 區域的持續整合 (CI)/持續部署 (CD)，以加快部署速度。** **此模式中的步驟已針對建立 AWS CodePipeline 任務進行測試，以部署至三個 AWS 區域做為範例。您可以根據您的使用案例變更區域數量。

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

**先決條件**
+ 作用中的 AWS 帳戶
+ 
  + 具有 *AmazonS3FullAccess* 和 *CloudWatchFullAccess* 政策的 CodeBuild 角色。這些政策可讓 CodeBuild 透過 Amazon CloudWatch 監看 AWS CodeCommit 事件，並使用 Amazon Simple Storage Service (Amazon S3) 做為成品存放區。
  + 具有下列政策的 AWS CloudFormation 角色，可讓 AWS CloudFormation 在最終建置階段中建立或更新 AWS Lambda 函數、推送或監看 Amazon CloudWatch logs，以及建立和更新變更集。 
    + *AWSLambdaFullAccess*
    + *AWSCodeDeployFullAccess*
    + *CloudWatchFullAccess*
    + *AWSCloudFormationFullAccess*
    + *AWSCodePipelineFullAccess*
**注意**  
AWS CodeBuild 和 AWS CloudFormation 的兩個 AWS Identity and Access Management (IAM) 角色具有適當的政策，可讓 CodeBuild 執行 CI 任務，以平行測試、綁定、封裝成品和部署到多個 AWS 區域。  交叉檢查 CodePipeline 建立的政策，以確認 CodeBuild 和 AWS CloudFormation 在 CI 和 CD 階段具有適當的許可。

## Architecture
<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_tw/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 區域，因此 CodeBuild 會將 AWS CloudFormation 範本封裝成三個 S3 儲存貯體，每個指定區域中各一個。CodeBuild 只會使用 S3 儲存貯體做為成品儲存庫。

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) 是網際網路的儲存體。此服務旨在降低開發人員進行網路規模運算的難度。

**Code**

下列範例程式碼適用於 `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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 選取部署的主要 AWS 區域。 | 登入您的 AWS 帳戶，然後選擇部署的主要區域。CodeCommit 儲存庫將位於主要區域。 | DevOps | 
| 建立 CodeCommit 儲存庫。 | 建立 CodeCommit 儲存庫，並將所需的程式碼推送至其中。此程式碼通常包含 AWS CloudFormation 或 AWS SAM 範本、如果有 Lambda 程式碼，以及 CodeBuild `buildspec.yaml` 檔案做為 AWS CodePipeline 的輸入。 | DevOps | 
| 將程式碼推送至 CodeCommit 儲存庫。 | 在*附件*區段中，下載此範例的程式碼，然後將所需的程式碼推送至其中。一般而言，程式碼可以包含 AWS CloudFormation 或 AWS SAM 範本、Lambda 程式碼和 CodeBuild `buildspec.yaml` 檔案做為管道的輸入。 | DevOps | 

### 來源階段：建立管道
<a name="source-phase-create-the-pipeline"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 CodePipeline 任務。 | 在 CodePipeline 主控台上，選擇**建立管道**。 | DevOps | 
| 命名 CodePipeline 任務，然後選擇服務角色設定。 | 輸入任務的名稱，並保留預設服務角色設定，以便 CodePipeline 建立已連接必要政策的角色。 | DevOps | 
| 指定成品存放區的位置。 | 在**進階設定**下，保留預設選項，以便 CodePipeline 建立用於程式碼成品儲存的 S3 儲存貯體。如果您改用現有的 S3 儲存貯體，儲存貯體必須位於您在第一個特徵中指定的主要區域中。 | DevOps | 
| 指定加密金鑰。 | 保留預設選項、**預設 AWS 受管金鑰**，或選擇使用您自己的 AWS Key Management Service (AWS KMS) 客戶受管金鑰。 | DevOps | 
| 指定來源提供者。 | 在**來源提供者**下，選擇 **AWS CodeCommit**。 | DevOps | 
| 指定儲存庫。 | 選擇您在第一個 epic 中建立的 CodeCommit 儲存庫。如果您將程式碼放在分支中，請選擇分支。 | DevOps | 
| 指定程式碼變更的偵測方式。 | 保留預設值 **Amazon CloudWatch Events**，做為 CodeCommit 啟動 CodePipeline 任務的變更觸發條件。 | DevOps | 

### 建置階段：設定管道
<a name="build-phase-configure-the-pipeline"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 指定建置提供者。 | 針對建置提供者，選擇 **AWS CodeBuild**。 | DevOps | 
| 指定 AWS 區域。 | 選擇您在第一個史詩中指定的主要區域。 | DevOps | 

### 組建階段：建立和設定專案
<a name="build-phase-create-and-configure-the-project"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立專案 | 選擇**建立專案**，然後輸入專案的名稱。 | DevOps | 
| 指定環境映像。 | 針對此模式示範，請使用預設 CodeBuild 受管映像。如果您有自訂 Docker 映像，您也可以選擇使用自訂 Docker 映像。 | DevOps | 
| 指定作業系統。 | 選擇 Amazon Linux 2 或 Ubuntu。Amazon Linux 2 即將終止支援。如需詳細資訊，請參閱 [Amazon Linux 2 FAQs](https://aws.amazon.com/amazon-linux-2/faqs/)。 | DevOps | 
| 指定服務角色。 | 在開始建立 CodePipeline 任務之前，請選擇您為 CodeBuild 建立的角色。 CodePipeline （請參閱*先決條件*一節。) | DevOps | 
| 設定其他選項。 | 對於**逾時**和**佇列逾時**，請保留預設值。對於憑證，除非您有要使用的自訂憑證，否則請保留預設設定。 | DevOps | 
| 建立環境變數。 | 針對您要部署的每個 AWS 區域，提供 S3 儲存貯體名稱和區域名稱 （例如 us-east-1) 來建立環境變數。 | DevOps | 
| 如果不是 buildspec.yml，請提供 buildspec 檔案名稱。 | 如果檔案名稱為預設值 ，請將此欄位保留空白`buildspec.yaml`。如果您重新命名 buildspec 檔案，請在此處輸入名稱。請確定它符合 CodeCommit 儲存庫中的檔案名稱。 | DevOps | 
| 指定記錄。 | 若要查看 Amazon CloudWatch Events 的日誌，請保留預設設定。或者，您可以定義任何特定的群組或記錄器名稱。 | DevOps | 

### 略過部署階段
<a name="skip-the-deploy-phase"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 略過部署階段並完成管道的建立。 | 當您設定管道時，CodePipeline 只允許您在部署階段建立一個階段。若要部署到多個 AWS 區域，請略過此階段。建立管道之後，您可以新增多個部署階段。 | DevOps | 

### 部署階段：設定管道以部署到第一個區域
<a name="deploy-phase-configure-the-pipeline-for-deployment-to-the-first-region"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將階段新增至部署階段。 | 編輯管道，然後在部署階段中選擇**新增階段**。第一個階段適用於主要區域。 | 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將第二個階段新增至部署階段。 | 若要為第二個區域新增階段，請編輯管道，然後在部署階段中選擇**新增階段**。重要：建立第二個區域的程序與第一個區域的程序相同，但下列值除外。 | DevOps | 
| 提供第二個階段的動作名稱。 | 輸入反映第二個階段和第二個區域的唯一名稱。 | DevOps | 
| 設定第二個階段的區域。 | 選擇您要部署堆疊的第二個區域。 | DevOps | 
| 指定第二個區域的範本。 | 選取 CodeBuild 封裝並傾印至第二個區域的 S3 儲存貯體的區域特定套件名稱。 | DevOps | 

### 部署階段：設定管道以部署到第三個區域
<a name="deploy-phase-configure-the-pipeline-for-deployment-to-the-third-region"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將第三個階段新增至部署階段。 | 若要為第三個區域新增階段，請編輯管道，然後在部署階段中選擇**新增階段**。重要：建立第二個區域的程序與前兩個區域的相同，但下列值除外。 | DevOps | 
| 提供第三個階段的動作名稱。 | 輸入反映第三個階段和第三個區域的唯一名稱。 | DevOps | 
| 設定第三個階段的區域。 | 選擇您要部署堆疊的第三個區域。 | DevOps | 
| 指定第三個區域的範本。 | 選取 CodeBuild 封裝的區域特定套件名稱，並傾印到第三個區域的 S3 儲存貯體。 | DevOps | 

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


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 刪除 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 Serverless 應用程式模型](https://aws.amazon.com/serverless/sam/)
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)
+ [AWS CodePipeline 的 AWS CloudFormation 架構結構參考 AWS 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)