翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS コードサービスと AWS KMS マルチリージョンキーを使用して、複数のアカウントとリージョンへのマイクロサービスのブルー/グリーンデプロイを管理
作成者:Balaji Vedagiri (AWS)、Ashish Kumar (AWS)、Faisal Shahdad (AWS)、Anand Krishna Varanasi (AWS)、Vanitha Dontireddy (AWS) と Vivek Thangamuthu (AWS)
概要
注意: AWS CodeCommit は新規顧客には利用できなくなりました。の既存のお客様は、通常どおりサービスを AWS CodeCommit 引き続き使用できます。詳細はこちら
このパターンは、ブルー/グリーンデプロイ戦略に従い、中央のAWS アカウントから複数のワークロードアカウントとリージョンにグローバルマイクロサービスアプリケーションをデプロイする方法を説明しています。このパターンは以下をサポートします。
ソフトウェアは中央アカウントで開発されますが、ワークロードとアプリケーションは複数のアカウントと AWS リージョンに分散されます。
ディザスタリカバリとして、単一の AWS キー管理システム (AWS KMS) マルチリージョンキーが暗号化と復号に使用されます。
KMS キーはリージョン固有であり、パイプラインアーティファクト用に 3 つの異なるリージョンで管理しまたは作成する必要があります。KMS マルチリージョンキーは、リージョン間で同じキー ID を保持することに役立ちます。
Git ワークフローの分岐モデルは 2 つのブランチ (開発とメイン) で実装され、コードはプルリクエスト (PR) でマージされます。このスタックからデプロイされる AWS Lambda 関数は、開発ブランチからメインブランチへの PR を作成します。メインブランチにマージするPR は、AWS CodePipeline パイプラインを開始します。これにより、継続的インテグレーションと継続的デリバリー (CI/CD) フローをオーケストレーションし、アカウントにスタックをデプロイします。
このパターンは、AWS CloudFormation スタックによるコードとしての Infrastructure as Code (IaC) 設定のサンプルを提供され、このユースケースを説明します。マイクロサービスのブルー/グリーンデプロイは、AWS CodeDeploy を使用して実装されます。
前提条件と制限
前提条件
4 つのアクティブな AWS アカウント:
このパターンでは次のリージョンを使用します。他のリージョンを使用する場合は、AWS CodeDeploy と AWS KMS マルチリージョンスタックに適切な変更を加える必要があります。
ツール (AWS CodeCommit) アカウント: ap-south-1
ワークロード (テスト) アカウント 1: ap-south-1
ワークロード (テスト) アカウント 2: eu-central-1
ワークロード (テスト) アカウント 3: us-east-1
各ワークロードアカウントのデプロイ用の 3 つの 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」は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信するPlatform as a Service (PaaS) 製品のセットです。このパターンでは、Docker でコンテナイメージをローカルでビルドしてテストします。
「cfn-lint」と「cfn-nag」は、CloudFormation スタックにエラーやセキュリティ上の問題がないかを確認することに役立つオープンソースツールです。
コードリポジトリ
このパターンのコードは、GitHub 内の「複数のリージョンとアカウントのグローバルブルー/グリーンデプロイ」リポジトリで利用できます。
エピック
タスク | 説明 | 必要なスキル |
---|
CloudFormation スタックデプロイ用の環境変数を出力します。 | このパターンの後半で CloudFormation スタックへの入力として使用する環境変数を定義します。 前述の「前提条件」セクションで説明したように、3 つのアカウントとリージョンで作成したバケット名を更新します。 export S3BUCKETNAMETESTACCOUNT1=<S3BUCKETACCOUNT1>
export S3BUCKETNAMETESTACCOUNT2=<S3BUCKETACCOUNT2>
export S3BUCKETNAMETESTACCOUNT3=<S3BUCKETACCOUNT3>
バケット名はグローバルに一意である必要があるため、ランダムな文字列を定義してアーティファクトバケットを作成します。 export BUCKETSTARTNAME=ecs-codepipeline-artifacts-19992
アカウント ID とリージョンを定義して出力します。 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 |
パッケージファイルをワークロードアカウントにデプロイ | 設定に基づき、i nfraParameters.json スクリプトのプレースホルダー値とアカウント名を更新します。 パッケージテンプレートを 3 つのワークロードアカウントにデプロイします。 ##In TestAccount1##
aws cloudformation deploy \
##In TestAccount2##
aws cloudformation deploy \
##In TestAccount3##
aws cloudformation deploy \
| AWS DevOps |
タスク | 説明 | 必要なスキル |
---|
Amazon ECR リポジトリにサンプルイメージをプッシュします | (パラメータで設定されているように) web という Amazon Elastic Container Registry (Amazon ECR) リポジトリに、サンプル (NGINX) イメージをプッシュします。このイメージは必要に応じてカスタマイズできます。 ログインして、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 をスケールして 2 つのレプリカを作成します。 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 リポジトリを作成します。このリポジトリは、コードを開発する予定の 1 つのリージョンにのみ作成する必要があります。 aws cloudformation deploy --stack-name codecommitrepoStack --parameter-overrides CodeCommitReponame=$CODECOMMITREPONAME \
ToolsAccount=$TOOLSACCOUNT --template-file codecommit.yaml --region $TOOLSACCOUNTREGION \
--capabilities CAPABILITY_NAMED_IAM
| AWS DevOps |
CodePipeline によって生成されたアーティファクトを管理するための S3 バケットを作成します。 | GitHub リポジトリの code フォルダにある pre-reqs-bucket.yaml テンプレートを使用して、CodePipeline によって生成されたアーティファクトを管理するための S3 バケットを作成します。スタックは 3 つのワークロード (テスト) とツールのアカウントとリージョンにすべてデプロイする必要があります。 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
CMKARN 変数を設定して CodeBuild プロジェクトに渡します。この値は 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 アイデンティティとアクセス管理 (IAM) を設定します。 #In ToolsAccount
aws cloudformation deploy
codebuild.yaml テンプレートを使用して、ビルドプロジェクト用に CodeBuild を設定します。このテンプレートを 3 つのリージョンに次のようにすべてデプロイします。
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 テンプレートを使用して、3 つのワークロードアカウントにすべて CodeDeploy を設定します。mainInfraStack の出力には、Amazon ECS クラスターの Amazon リソースネーム (ARN) と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
CodePipeline と CodeDeploy ロールへのアクセスを許可するように S3 バケットポリシーを更新します。 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 リポジトリにプッシュします。 | 「AWS CodeCommit のドキュメント」の説明に従い、codecommitrepoStack で git clone コマンドを使用して作成された 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
| |
トラブルシューティング
問題 | ソリューション |
---|
リポジトリにコミットした変更はデプロイされません。 | |
関連リソース