

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

# 使用 AWS 程式碼服務和 AWS KMS 多區域金鑰，管理將微服務部署至多個帳戶和區域的藍/綠部署
<a name="manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys"></a>

*Balaji Vedagiri、Vanitha Dontireddy、Ashish Kumar、Faisal Shahdad、Vivek Thangamuthu 和 Anand Krishna Varanasi，Amazon Web Services*

## 摘要
<a name="manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys-summary"></a>

此模式說明如何根據藍/綠部署策略，將全域微服務應用程式從中央 AWS 帳戶部署到多個工作負載帳戶和區域。模式支援下列項目：
+ 軟體是在中央帳戶中開發，而工作負載和應用程式則分散在多個帳戶和 AWS 區域。
+ 單一 AWS Key Management System (AWS KMS) 多區域金鑰用於加密和解密，以涵蓋災難復原。
+ KMS 金鑰是區域特定的，必須在管道成品的三個不同區域中維護或建立。KMS 多區域金鑰有助於跨區域保留相同的金鑰 ID。
+ Git 工作流程分支模型使用兩個分支 （開發和主要） 實作，並使用提取請求 (PRs) 合併程式碼。從此堆疊部署的 AWS Lambda 函數會建立從開發分支到主分支的 PR。合併到主分支的 PR 會啟動 AWS CodePipeline 管道，協調持續整合和持續交付 (CI/CD) 流程，並在帳戶之間部署堆疊。

此模式 透過 AWS CloudFormation 堆疊提供做為程式碼 (IaC) 設定的範例基礎設施，以示範此使用案例。使用 AWS CodeDeploy 實作微服務的藍/綠部署。

## 先決條件和限制
<a name="manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys-prereqs"></a>

**先決條件**
+ 四個作用中的 AWS 帳戶：
  + 用於管理程式碼管道和維護 AWS CodeCommit 儲存庫的工具帳戶。
  + 部署微服務工作負載的三個工作負載 （測試） 帳戶。
+ 此模式使用下列區域。 如果您想要使用其他區域，您必須對 AWS CodeDeploy 和 AWS KMS 多區域堆疊進行適當的修改。
  + 工具 (AWS CodeCommit) 帳戶： `ap-south-1`
  + 工作負載 （測試） 帳戶 1： `ap-south-1`
  + 工作負載 （測試） 帳戶 2： `eu-central-1`
  + 工作負載 （測試） 帳戶 3： `us-east-1`
+ 每個工作負載帳戶中部署區域的三個 Amazon Simple Storage Service (Amazon S3) 儲存貯體。（這些在此模式中稱為 `S3BUCKETNAMETESTACCOUNT1``S3BUCKETNAMETESTACCOUNT2 `和`S3BUCKETNAMETESTACCOUNT3 `更新版本。)

  例如，您可以在具有唯一儲存貯體名稱的特定帳戶和區域中建立這些儲存貯體，如下所示 （以隨機數字取代 *xxxx* )：

  ```
  ##In Test Account 1
  aws s3 mb s3://ecs-codepipeline-xxxx-ap-south-1 --region ap-south-1
  ##In Test Account 2
  aws s3 mb s3://ecs-codepipeline-xxxx-eu-central-1 --region eu-central-1
  ##In Test Account 3
  aws s3 mb s3://ecs-codepipeline-xxxx-us-east-1 --region us-east-1
  
  #Example
  ##In Test Account 1
  aws s3 mb s3://ecs-codepipeline-18903-ap-south-1 --region ap-south-1
  ##In Test Account 2
  aws s3 mb s3://ecs-codepipeline-18903-eu-central-1 --region eu-central-1
  ##In Test Account 3
  aws s3 mb s3://ecs-codepipeline-18903-us-east-1 --region us-east-1
  ```

**限制**

模式使用 AWS CodeBuild 和其他組態檔案來部署範例微服務。如果您有不同的工作負載類型 （例如無伺服器），您必須更新所有相關組態。

## Architecture
<a name="manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys-architecture"></a>

**目標技術堆疊 **
+ AWS CloudFormation
+ AWS CodeCommit
+ AWS CodeBuild
+ AWS CodeDeploy
+ AWS CodePipeline

**目標架構 **

![\[將微服務部署到多個帳戶和區域的目標架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/a144c977-6823-4b08-a215-fae779b3ce7c/images/eedfabdb-f266-4190-b271-5caf7ac9b47b.png)


**自動化和擴展**

使用 AWS CloudFormation 堆疊範本 (IaC) 來自動化設定。它可以針對多個環境和帳戶輕鬆擴展。

## 工具
<a name="manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys-tools"></a>

**AWS 服務**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速一致地佈建資源，以及在整個 AWS 帳戶和區域的生命週期進行管理。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一項全受管建置服務，可協助您編譯原始程式碼、執行單元測試，並產生準備好部署的成品。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一種版本控制服務，可協助您私下存放和管理 Git 儲存庫，而無需管理您自己的來源控制系統。
+ [AWS CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html) 會自動部署到 Amazon Elastic Compute Cloud (Amazon EC2) 或內部部署執行個體、AWS Lambda 函數或 Amazon Elastic Container Service (Amazon ECS) 服務。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可協助您快速建模和設定軟體版本的不同階段，並自動化持續發行軟體變更所需的步驟。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) 是快速、可擴展的容器管理服務，可協助您執行、停止和管理叢集上的容器。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可協助您建立和控制密碼編譯金鑰，以協助保護您的資料。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。

**其他工具**
+ [Git](https://git-scm.com/docs) 是一種開放原始碼的分散式版本控制系統，可與 AWS CodeCommit 儲存庫搭配使用。
+ [Docker](https://www.docker.com/) 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。此模式使用 Docker 在本機建置和測試容器映像。
+ [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) 和 [cfn-nag](https://github.com/stelligent/cfn_nag) 是開放原始碼工具，可協助您檢閱 CloudFormation 堆疊是否有任何錯誤和安全問題。

**程式碼儲存庫**

此模式的程式碼可在多個區域和帳戶儲存庫的 GitHub 全域藍/綠部署中使用。 [https://github.com/aws-samples/ecs-blue-green-global-deployment-with-multiregion-cmk-codepipeline](https://github.com/aws-samples/ecs-blue-green-global-deployment-with-multiregion-cmk-codepipeline)

## 史詩
<a name="manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys-epics"></a>

### 設定環境變數
<a name="set-up-environment-variables"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 匯出 CloudFormation 堆疊部署的環境變數。 | 定義稍後在此模式中將用作 CloudFormation 堆疊輸入的環境變數。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.html) | AWS DevOps | 

### 封裝和部署基礎設施的 CloudFormation 堆疊
<a name="package-and-deploy-the-cloudformation-stacks-for-the-infrastructure"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 將[範例儲存庫](https://github.com/aws-samples/ecs-blue-green-global-deployment-with-multiregion-cmk-codepipeline)複製到您工作位置的新儲存庫中：<pre>##In work location<br />git clone https://github.com/aws-samples/ecs-blue-green-global-deployment-with-multiregion-cmk-codepipeline.git</pre> | AWS DevOps | 
| 封裝 Cloudformation 資源。 | 在此步驟中，您會封裝 CloudFormation 範本參考的本機成品，以建立 Amazon Virtual Private Cloud (Amazon VPC) 和 Application Load Balancer 等服務所需的基礎設施資源。範本可在程式碼儲存庫的 `Infra`資料夾中使用。<pre>##In TestAccount1##<br />aws cloudformation package \<br />    --template-file mainInfraStack.yaml \<br />    --s3-bucket $S3BUCKETNAMETESTACCOUNT1 \<br />    --s3-prefix infraStack \<br />    --region $TESTACCOUNT1REGION \<br />    --output-template-file infrastructure_${TESTACCOUNT1}.template</pre><pre>##In TestAccount2##<br />aws cloudformation package \<br />    --template-file mainInfraStack.yaml \<br />    --s3-bucket $S3BUCKETNAMETESTACCOUNT2 \<br />    --s3-prefix infraStack \<br />    --region $TESTACCOUNT2REGION \<br />    --output-template-file infrastructure_${TESTACCOUNT2}.template</pre><pre>##In TestAccount3##<br />aws cloudformation package \<br />    --template-file mainInfraStack.yaml \<br />    --s3-bucket $S3BUCKETNAMETESTACCOUNT3 \<br />    --s3-prefix infraStack \<br />    --region $TESTACCOUNT3REGION \<br />    --output-template-file infrastructure_${TESTACCOUNT3}.template</pre> | AWS DevOps | 
| 驗證套件範本。 | 驗證套件範本：<pre>aws cloudformation validate-template \<br />    --template-body file://infrastructure_${TESTACCOUNT1}.template<br /><br />aws cloudformation validate-template \<br />    --template-body file://infrastructure_${TESTACCOUNT2}.template<br /><br />aws cloudformation validate-template \<br />    --template-body file://infrastructure_${TESTACCOUNT3}.template</pre> | AWS DevOps | 
| 將套件檔案部署到工作負載帳戶， | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.html) | AWS DevOps | 

### 推送範例映像並擴展 Amazon ECS
<a name="push-a-sample-image-and-scale-amazon-ecs"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將範例映像推送至 Amazon ECR 儲存庫。 | 將範例 (NGINX) 映像推送至名為 `web`（如參數中設定） 的 Amazon Elastic Container Registry (Amazon ECR) 儲存庫。您可以視需要自訂映像。若要登入並設定將映像推送到 Amazon ECR 的登入資料，請遵循 [Amazon ECR 文件](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)中的指示。命令包括：<pre>  docker pull nginx<br />  docker images<br />  docker tag <imageid> aws_account_id.dkr.ecr.region.amazonaws.com/<web>:latest<br />  docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<web>:tag </pre> | AWS DevOps | 
| 擴展 Amazon ECS 並驗證存取。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.html) | AWS DevOps | 

### 設定程式碼服務和資源
<a name="set-up-code-services-and-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在工具帳戶中建立 CodeCommit 儲存庫。 | 使用位於 GitHub 儲存庫`code`資料夾的 `codecommit.yaml` 範本，在工具帳戶中建立 CodeCommit 儲存庫。您只能在計劃開發程式碼的單一區域中建立此儲存庫。<pre>aws cloudformation deploy --stack-name codecommitrepoStack --parameter-overrides  CodeCommitReponame=$CODECOMMITREPONAME \<br />ToolsAccount=$TOOLSACCOUNT --template-file codecommit.yaml  --region $TOOLSACCOUNTREGION \<br />--capabilities CAPABILITY_NAMED_IAM</pre> | AWS DevOps | 
| 建立 S3 儲存貯體以管理 CodePipeline 產生的成品。 | 使用位於 GitHub 儲存庫 `code` 資料夾中的 `pre-reqs-bucket.yaml` 範本，建立 S3 儲存貯體來管理 CodePipeline 產生的成品。堆疊必須部署在所有三個工作負載 （測試） 和工具帳戶和區域中。<pre>aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \<br />TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \<br />TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \<br />--template-file pre-reqs_bucket.yaml --region $TESTACCOUNT1REGION --capabilities CAPABILITY_NAMED_IAM<br /><br />aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \<br />TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \<br />TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \<br />--template-file pre-reqs_bucket.yaml --region $TESTACCOUNT2REGION --capabilities CAPABILITY_NAMED_IAM<br /><br />aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \<br />TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \<br />TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \<br />--template-file pre-reqs_bucket.yaml --region $TESTACCOUNT3REGION --capabilities CAPABILITY_NAMED_IAM<br /><br />aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \<br />TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \<br />TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \<br />--template-file pre-reqs_bucket.yaml --region $TOOLSACCOUNTREGION --capabilities CAPABILITY_NAMED_IAM</pre> | AWS DevOps | 
| 設定多區域 KMS 金鑰。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.html) | AWS DevOps | 
| 在工具帳戶中設定 CodeBuild 專案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.html) | AWS DevOps | 
| 在工作負載帳戶中設定 CodeDeploy。 | 使用 GitHub 儲存庫 `code` 資料夾中的 `codedeploy.yaml` 範本，在所有三個工作負載帳戶中設定 CodeDeploy。的輸出`mainInfraStack`包含 Amazon ECS 叢集的 Amazon Resource Name (ARNs) 和 Application Load Balancer 接聽程式。基礎設施堆疊的值已匯出，因此它們是由 CodeDeploy 堆疊範本匯入。<pre>##WorkloadAccount1##<br />aws cloudformation deploy --stack-name ecscodedeploystack \<br />--parameter-overrides  ToolsAccount=$TOOLSACCOUNT mainInfrastackname=mainInfrastack \<br />--template-file codedeploy.yaml  --region $TESTACCOUNT1REGION --capabilities CAPABILITY_NAMED_IAM<br /><br />##WorkloadAccount2##<br />aws cloudformation deploy --stack-name ecscodedeploystack \<br />--parameter-overrides ToolsAccount=$TOOLSACCOUNT mainInfrastackname=mainInfrastack \<br />--template-file codedeploy.yaml  --region $TESTACCOUNT2REGION --capabilities CAPABILITY_NAMED_IAM<br /><br />##WorkloadAccount3##<br />aws cloudformation deploy --stack-name ecscodedeploystack \<br />--parameter-overrides ToolsAccount=$TOOLSACCOUNT mainInfrastackname=mainInfrastack \<br />--template-file codedeploy.yaml  --region $TESTACCOUNT3REGION --capabilities CAPABILITY_NAMED_IAM</pre> | AWS DevOps | 

### 在工具帳戶中設定 CodePipeline
<a name="set-up-codepipeline-in-the-tools-account"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在工具帳戶中建立程式碼管道。 | 在工具帳戶中，執行 命令：<pre>aws cloudformation deploy --stack-name ecscodepipelinestack --parameter-overrides  \<br />TestAccount1=$TESTACCOUNT1 TestAccount1Region=$TESTACCOUNT1REGION \<br />TestAccount2=$TESTACCOUNT2 TestAccount2Region=$TESTACCOUNT2REGION \<br />TestAccount3=$TESTACCOUNT3 TestAccount3Region=$TESTACCOUNT3REGION \<br />CMKARNTools=$CMKTROOLSARN CMKARN1=$CMKARN1 CMKARN2=$CMKARN2 CMKARN3=$CMKARN3 \<br />CodeCommitRepoName=$CODECOMMITREPONAME BucketStartName=$BUCKETSTARTNAME \<br />--template-file codepipeline.yaml --capabilities CAPABILITY_NAMED_IAM</pre> | AWS DevOps | 
| 在 AWS KMS 金鑰政策和 S3 儲存貯體政策中提供 CodePipeline 和 CodeBuild 角色的存取權。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.html) | AWS DevOps | 

### 呼叫並測試管道
<a name="call-and-test-the-pipeline"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將變更推送至 CodeCommit 儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.html) |  | 

### 清除
<a name="clean-up"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 清除所有已部署的資源。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.html) |  | 

## 疑難排解
<a name="manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 您遞交給儲存庫的變更並未部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.html) | 

## 相關資源
<a name="manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys-resources"></a>
+ [推送 Docker 映像](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html) (Amazon ECR 文件）
+ [連線至 AWS CodeCommit 儲存庫](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-connect.html) (AWS CodeCommit 文件）
+ [故障診斷 AWS CodeBuild ](https://docs.aws.amazon.com/codebuild/latest/userguide/troubleshooting.html)(AWS CodeBuild 文件）