本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AWS 程式碼服務和 AWS KMS 多區域金鑰,管理微服務的藍/綠部署至多個帳戶和區域
由 Balaji Vedagiri (AWS)、Ashish Kumar (AWS)、Faisal Shahdad (AWS)、Anand Krishna Varanasi (AWS)、Vanitha Dontireddy (AWS) 和 Vivek Thangamuthu (AWS) 建立
Summary
注意: AWS CodeCommit 不再提供給新客戶。的現有客戶 AWS CodeCommit 可以繼續正常使用服務。進一步了解
此模式說明如何根據藍/綠部署策略,將全域微服務應用程式從中央 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 實作。
先決條件和限制
先決條件
四個作用中的 AWS 帳戶:
此模式使用下列區域。如果您想要使用其他區域,則必須對 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):
aws s3 mb s3://ecs-codepipeline-xxxx-ap-south-1 --region ap-south-1
aws s3 mb s3://ecs-codepipeline-xxxx-eu-central-1 --region eu-central-1
aws s3 mb s3://ecs-codepipeline-xxxx-us-east-1 --region us-east-1
aws s3 mb s3://ecs-codepipeline-18903-ap-south-1 --region ap-south-1
aws s3 mb s3://ecs-codepipeline-18903-eu-central-1 --region eu-central-1
aws s3 mb s3://ecs-codepipeline-18903-us-east-1 --region us-east-1
限制
此模式使用 AWS CodeBuild 和其他組態檔案來部署範例微服務。如果您有不同的工作負載類型 (例如無伺服器),則必須更新所有相關組態。
架構
目標技術堆疊
AWS CloudFormation
AWS CodeCommit
AWS CodeBuild
AWS CodeDeploy
AWS CodePipeline
目標架構
自動化和擴展
使用 AWS CloudFormation 堆疊範本 (IaC) 來自動化設定。它可以輕鬆地針對多個環境和帳戶進行擴展。
AWS 服務
其他工具
Git 是一種開放原始碼的分散式版本控制系統,可與 AWS CodeCommit 儲存庫搭配使用。
Docker 是一組平台即服務 (PaaS) 產品,在作業系統層級使用虛擬化在容器中交付軟體。此模式使用 Docker 在本機建置和測試容器映像。
cfn-lint 和 cfn-nag 是開放原始碼工具,可協助您檢閱 CloudFormation 堆疊是否有任何錯誤和安全問題。
程式碼儲存庫
此模式的程式碼可在多個區域和帳戶儲存庫的 GitHub Global Blue/Green 部署中使用。 https://github.com/aws-samples/ecs-blue-green-global-deployment-with-multiregion-cmk-codepipeline
史詩
任務 | 描述 | 所需的技能 |
---|
匯出 CloudFormation 堆疊部署的環境變數。 | 定義環境變數,此變數稍後會在此模式中做為 CloudFormation 堆疊的輸入。 更新您在三個帳戶和區域中建立的儲存貯體名稱,如先決條件一節中所述: export S3BUCKETNAMETESTACCOUNT1=<S3BUCKETACCOUNT1>
export S3BUCKETNAMETESTACCOUNT2=<S3BUCKETACCOUNT2>
export S3BUCKETNAMETESTACCOUNT3=<S3BUCKETACCOUNT3>
定義隨機字串以建立成品儲存貯體,因為儲存貯體名稱在全球必須是唯一的: export BUCKETSTARTNAME=ecs-codepipeline-artifacts-19992
定義和匯出帳戶 IDs 和區域: export TOOLSACCOUNT=<TOOLSACCOUNT>
export CODECOMMITACCOUNT=<CODECOMMITACCOUNT>
export CODECOMMITREGION=ap-south-1
export CODECOMMITREPONAME=Poc
export TESTACCOUNT1=<TESTACCOUNT1>
export TESTACCOUNT2=<TESTACCOUNT2>
export TESTACCOUNT3=<TESTACCOUNT3>
export TESTACCOUNT1REGION=ap-south-1
export TESTACCOUNT2REGION=eu-central-1
export TESTACCOUNT3REGION=us-east-1
export TOOLSACCOUNTREGION=ap-south-1
export ECRREPOSITORYNAME=web
| AWS DevOps |
任務 | 描述 | 所需的技能 |
---|
複製儲存庫。 | 將範例儲存庫複製到您工作位置的新儲存庫中:
git clone https:
| AWS DevOps |
封裝 Cloudformation 資源。 | 在此步驟中,您會封裝 CloudFormation 範本參考的本機成品,以建立 Amazon Virtual Private Cloud (Amazon VPC) 和 Application Load Balancer 等服務所需的基礎設施資源。 範本可在程式碼儲存庫的 Infra 資料夾中取得。 ##In TestAccount1##
aws cloudformation package \
##In TestAccount2##
aws cloudformation package \
##In TestAccount3##
aws cloudformation package \
| AWS DevOps |
驗證套件範本。 | 驗證套件範本: aws cloudformation validate-template \
--template-body file:
aws cloudformation validate-template \
--template-body file:
aws cloudformation validate-template \
--template-body file:
| AWS DevOps |
將套件檔案部署到工作負載帳戶, | 根據您的設定更新 infraParameters.json 指令碼中的預留位置值和帳戶名稱。 將套件範本部署到您的三個工作負載帳戶。 ##In TestAccount1##
aws cloudformation deploy \
##In TestAccount2##
aws cloudformation deploy \
##In TestAccount3##
aws cloudformation deploy \
| AWS DevOps |
任務 | 描述 | 所需的技能 |
---|
將範例映像推送至 Amazon ECR 儲存庫。 | 將範例 (NGINX) 映像推送至名為 web (如參數中設定) 的 Amazon Elastic Container Registry (Amazon ECR) 儲存庫。您可以視需要自訂映像。 若要登入並設定將映像推送至 Amazon ECR 的登入資料,請遵循 Amazon ECR 文件中的指示。 命令包括: docker pull nginx
docker images
docker tag <imageid> aws_account_id.dkr.ecr.region.amazonaws.com/<web>:latest
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<web>:tag
| AWS DevOps |
擴展 Amazon ECS 並確認存取。 | 擴展 Amazon ECS 以建立兩個複本: aws ecs update-service --cluster QA-Cluster --service Poc-Service --desired-count 2
其中 Poc-Service 是指您的範例應用程式。 使用瀏覽器的完整網域名稱 (FQDN) 或 DNS 或使用 curl 命令,確認可從 Application Load Balancer 存取服務。
| AWS DevOps |
任務 | 描述 | 所需的技能 |
---|
在工具帳戶中建立 CodeCommit 儲存庫。 | 使用位於 GitHub 儲存庫code 資料夾的 codecommit.yaml 範本,在工具帳戶中建立 CodeCommit 儲存庫。您只能在計劃開發程式碼的單一區域中建立此儲存庫。 aws cloudformation deploy --stack-name codecommitrepoStack --parameter-overrides CodeCommitReponame=$CODECOMMITREPONAME \
ToolsAccount=$TOOLSACCOUNT --template-file codecommit.yaml --region $TOOLSACCOUNTREGION \
--capabilities CAPABILITY_NAMED_IAM
| AWS DevOps |
建立 S3 儲存貯體以管理 CodePipeline 產生的成品。 | 使用位於 GitHub 儲存庫code 資料夾中的 pre-reqs-bucket.yaml 範本,建立 S3 儲存貯體來管理 CodePipeline 產生的成品。堆疊必須部署在所有三個工作負載 (測試) 和工具帳戶和區域中。 aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \
TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \
--template-file pre-reqs_bucket.yaml --region $TESTACCOUNT1REGION --capabilities CAPABILITY_NAMED_IAM
aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \
TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \
--template-file pre-reqs_bucket.yaml --region $TESTACCOUNT2REGION --capabilities CAPABILITY_NAMED_IAM
aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \
TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \
--template-file pre-reqs_bucket.yaml --region $TESTACCOUNT3REGION --capabilities CAPABILITY_NAMED_IAM
aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \
TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \
--template-file pre-reqs_bucket.yaml --region $TOOLSACCOUNTREGION --capabilities CAPABILITY_NAMED_IAM
| AWS DevOps |
設定多區域 KMS 金鑰。 | 使用 CodePipeline 將使用的主要金鑰和複本金鑰來建立多區域 KMS 金鑰。在我們的範例中, ToolsAccount1region - ap-south-1 將是主要區域。 aws cloudformation deploy --stack-name ecs-codepipeline-pre-reqs-KMS \
--template-file pre-reqs_KMS.yaml --parameter-overrides \
TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT --region $TOOLSACCOUNTREGION
設定要傳遞至 CodeBuild 專案的 CMKARN 變數。這些值可在 ecs-codepipeline-pre-reqs-KMS 範本堆疊的輸出中使用 (金鑰 ID 在所有區域中都會相同,並以 開頭mrk- )。或者,您可以從工具帳戶取得 CMKARN 值。在所有帳戶工作階段中匯出它們: export CMKARN1=arn:aws:kms:ap-south-1:<TOOLSACCOUNTID>:key/mrk-xxx
export CMKARN2=arn:aws:kms:eu-central-1:<TOOLSACCOUNTID>:key/mrk-xxx
export CMKARN3=arn:aws:kms:us-east-1:<TOOLSACCOUNTID>:key/mrk-xxx
export CMARNTOOLS=arn:aws:kms:ap-south-1:<TOOLSACCOUNTID>:key/mrk-xxx
| AWS DevOps |
在工具帳戶中設定 CodeBuild 專案。 | 使用 GitHub 儲存庫code 資料夾中的 codebuild_IAM.yaml 範本,在工具帳戶中的單一區域中設定 AWS CodeBuild 的 AWS Identity and Access Management (IAM): AWS CodeBuild #In ToolsAccount
aws cloudformation deploy
使用 codebuild.yaml 範本為您的建置專案設定 CodeBuild。在全部三個區域中部署此範本,如下所示: aws cloudformation deploy --stack-name ecscodebuildstack --parameter-overrides ToolsAccount=$TOOLSACCOUNT \
CodeCommitRepoName=$CODECOMMITREPONAME ECRRepositoryName=$ECRREPOSITORYNAME APPACCOUNTID=$TESTACCOUNT1 \
TestAccount3=$TESTACCOUNT3 CodeCommitRegion=$CODECOMMITREGION CMKARN=$CMKARN1 \
--template-file codebuild.yaml --region $TESTACCOUNT1REGION --capabilities CAPABILITY_NAMED_IAM
aws cloudformation deploy --stack-name ecscodebuildstack --parameter-overrides ToolsAccount=$TOOLSACCOUNT \
CodeCommitRepoName=$CODECOMMITREPONAME ECRRepositoryName=$ECRREPOSITORYNAME APPACCOUNTID=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitRegion=$CODECOMMITREGION CMKARN=$CMKARN2 \
--template-file codebuild.yaml --region $TESTACCOUNT2REGION --capabilities CAPABILITY_NAMED_IAM
aws cloudformation deploy --stack-name ecscodebuildstack --parameter-overrides ToolsAccount=$TOOLSACCOUNT \
CodeCommitRepoName=$CODECOMMITREPONAME ECRRepositoryName=$ECRREPOSITORYNAME APPACCOUNTID=$TESTACCOUNT3 \
CodeCommitRegion=$CODECOMMITREGION CMKARN=$CMKARN3 \
--template-file codebuild.yaml --region $TESTACCOUNT3REGION --capabilities CAPABILITY_NAMED_IAM
| AWS DevOps |
在工作負載帳戶中設定 CodeDeploy。 | 使用 GitHub 儲存庫code 資料夾中的 codedeploy.yaml 範本,在三個工作負載帳戶中設定 CodeDeploy。的輸出mainInfraStack 包含 Amazon ECS 叢集的 Amazon Resource Name (ARNs) 和 Application Load Balancer 接聽程式。 基礎設施堆疊的值已匯出,因此它們是由 CodeDeploy 堆疊範本匯入。 ##WorkloadAccount1##
aws cloudformation deploy
##WorkloadAccount2##
aws cloudformation deploy
##WorkloadAccount3##
aws cloudformation deploy
| AWS DevOps |
任務 | 描述 | 所需的技能 |
---|
在工具帳戶中建立程式碼管道。 | 在工具帳戶中,執行 命令: aws cloudformation deploy --stack-name ecscodepipelinestack --parameter-overrides \
TestAccount1=$TESTACCOUNT1 TestAccount1Region=$TESTACCOUNT1REGION \
TestAccount2=$TESTACCOUNT2 TestAccount2Region=$TESTACCOUNT2REGION \
TestAccount3=$TESTACCOUNT3 TestAccount3Region=$TESTACCOUNT3REGION \
CMKARNTools=$CMKTROOLSARN CMKARN1=$CMKARN1 CMKARN2=$CMKARN2 CMKARN3=$CMKARN3 \
CodeCommitRepoName=$CODECOMMITREPONAME BucketStartName=$BUCKETSTARTNAME \
--template-file codepipeline.yaml --capabilities CAPABILITY_NAMED_IAM
| AWS DevOps |
在 AWS KMS 金鑰政策和 S3 儲存貯體政策中提供 CodePipeline 和 CodeBuild 角色的存取權。 | 在 AWS KMS 金鑰政策中提供 CodePipeline 和 CodeBuild 角色的存取權: aws cloudformation deploy --stack-name ecs-codepipeline-pre-reqs-KMS \
--template-file pre-reqs_KMS.yaml --parameter-overrides \
CodeBuildCondition=true TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT --region $TOOLSACCOUNTREGION
更新 S3 儲存貯體政策以允許 CodePipeline 和 CodeDeploy 角色的存取: aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \
PutS3BucketPolicy=true TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \
--template-file pre-reqs_bucket.yaml --region $TESTACCOUNT1REGION --capabilities CAPABILITY_NAMED_IAM
aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \
PutS3BucketPolicy=true TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \
--template-file pre-reqs_bucket.yaml --region $TESTACCOUNT2REGION --capabilities CAPABILITY_NAMED_IAM
aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \
PutS3BucketPolicy=true TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \
--template-file pre-reqs_bucket.yaml --region $TESTACCOUNT3REGION --capabilities CAPABILITY_NAMED_IAM
aws cloudformation deploy --stack-name pre-reqs-artifacts-bucket --parameter-overrides BucketStartName=$BUCKETSTARTNAME \
PutS3BucketPolicy=true TestAccount1=$TESTACCOUNT1 TestAccount2=$TESTACCOUNT2 \
TestAccount3=$TESTACCOUNT3 CodeCommitAccount=$CODECOMMITACCOUNT ToolsAccount=$TOOLSACCOUNT \
--template-file pre-reqs_bucket.yaml --region $TOOLSACCOUNTREGION --capabilities CAPABILITY_NAMED_IAM
| AWS DevOps |
任務 | 描述 | 所需的技能 |
---|
將變更推送至 CodeCommit 儲存庫。 | codecommitrepoStack 使用 git clone 命令複製在 中建立的 CodeCommit 儲存庫,如 AWS CodeCommit 文件所述。
使用必要的詳細資訊更新輸入成品: 修改 index.html 檔案以對首頁進行一些次要變更。 將下列檔案複製到儲存庫並遞交: index.html
Dockerfile
buildspec.yaml
appspec_<accountid>.yaml (3 files - one per account )
taskdef<accountid>.json (3 files - one per account)
啟動或重新啟動管道並驗證結果。 使用 FQDN 或 DNS 從 Application Load Balancer 存取服務,並確認已部署更新。
| |
任務 | 描述 | 所需的技能 |
---|
清除所有部署的資源。 | 將 Amazon ECS 縮減至零執行個體: aws ecs update-service --cluster QA-Cluster --service Poc-Service --desired-count 0
刪除每個帳戶和區域中的 CloudFormation 堆疊: ##In Tools Account##
aws cloudformation delete-stack --stack-name ecscodepipelinestack --region $TOOLSACCOUNTREGION
aws cloudformation delete-stack --stack-name ecscodebuildstack --region $TESTACCOUNT1REGION
aws cloudformation delete-stack --stack-name ecscodebuildstack --region $TESTACCOUNT2REGION
aws cloudformation delete-stack --stack-name ecscodebuildstack --region $TESTACCOUNT3REGION
aws cloudformation delete-stack --stack-name ecs-codepipeline-pre-reqs-KMS --region $TOOLSACCOUNTREGION
aws cloudformation delete-stack --stack-name codecommitrepoStack --region $TOOLSACCOUNTREGION
aws cloudformation delete-stack --stack-name pre-reqs-artifacts-bucket --region $TESTACCOUNT1REGION
aws cloudformation delete-stack --stack-name pre-reqs-artifacts-bucket --region $TESTACCOUNT2REGION
aws cloudformation delete-stack --stack-name pre-reqs-artifacts-bucket --region $TESTACCOUNT3REGION
aws cloudformation delete-stack --stack-name pre-reqs-artifacts-bucket --region $TOOLSACCOUNTREGION
aws cloudformation delete-stack --stack-name ecs-codebuild-iam --region $TOOLSACCOUNTREGION
##NOTE: Artifact buckets will not get deleted if there are artifacts so it has to be emptied manually before deleting.##
aws cloudformation delete-stack --stack-name ecscodedeploystack --region $TESTACCOUNT1REGION
aws cloudformation delete-stack --stack-name mainInfrastack --region $TESTACCOUNT1REGION
aws cloudformation delete-stack --stack-name ecscodedeploystack --region $TESTACCOUNT2REGION
aws cloudformation delete-stack --stack-name mainInfrastack --region $TESTACCOUNT2REGION
aws cloudformation delete-stack --stack-name ecscodedeploystack --region $TESTACCOUNT3REGION
aws cloudformation delete-stack --stack-name mainInfrastack --region $TESTACCOUNT3REGION
| |
故障診斷
相關資源