

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS CodePipeline、AWS CodeCommit、AWS CodeBuild を使用して、複数の AWS リージョンにコードをデプロイする
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild"></a>

*Amazon Web Services、Anand Krishna Varanasi*

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

このパターンは、AWS AWS CloudFormation を使用して複数のAmazon Web Services (AWS) リージョンにまたがるインフラストラクチャまたはアーキテクチャを構築する方法を示しています。　 これには、複数の AWS リージョンにわたる継続的インテグレーション (CI) / 継続的デプロイ (CD) が含まれており、デプロイを迅速に行うことができます。** **このパターンのステップは、例として 3 つの AWS リージョンにデプロイする AWS CodePipeline ジョブの作成でテストされています。ユースケースに基づいてリージョン数を変更できます。

## 前提条件と制限
<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 の 2 つの AWS Identity and Access Management (IAM) ロールには、アーティファクトのテスト、バンドル、パッケージ化、複数の AWS リージョンへのデプロイという CI タスクを並列して実行するための CodeBuild 用の適切なポリシーがあります。　　  CodePipeline によって作成されたポリシーをクロスチェックして、CodeBuild と AWS CloudFormation が CI フェーズと CD フェーズで適切なアクセス権限を持っていることを確認します。

## アーキテクチャ
<a name="deploy-code-in-multiple-aws-regions-using-aws-codepipeline-aws-codecommit-and-aws-codebuild-architecture"></a>

![3 つの AWS リージョンにデプロイする AWS CodePipeline ジョブ。](http://docs.aws.amazon.com/ja_jp/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 テンプレートをパッケージ化します。例えば、このパターンは 3 つの AWS リージョンに並列にデプロイされるため、CodeBuild は AWS CloudFormation テンプレートを、指定された各リージョンに 1 つずつ、合計 3 つの S3 バケットにパッケージ化します。S3 バケットは CodeBuild によってアーティファクトリポジトリとしてのみ使用されます。

1. CodeBuild は、3 つの 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) – AWS 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 (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) – AWS Identity and Access Management (IAM) は、AWS リソースへのアクセスをセキュアに制御するのに役立つウェブサービスです。
+ 「[Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html)」— Amazon Simple Storage Service (Amazon S3)は、インターネット用のストレージです。Web スケールのコンピューティングを開発者が容易にできるように設計されています。

**コード**

次のサンプルコードは `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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| デプロイするプライマリ AWS リージョンを選択します。 | AWS アカウントにサインインして、デプロイするプライマリリージョンを選択します。CodeCommit リポジトリはプライマリ リージョンにあります。 | DevOps | 
| CodeCommit リポジトリを作成します。 | CodeCommit リポジトリを作成し、必要なコードをプッシュします。コードには通常、AWS CloudFormation または AWS SAM テンプレート、Lambda コード (ある場合)、および AWS CodePipeline への入力としての CodeBuild `buildspec.yaml` ファイルが含まれます。 | DevOps | 
| コードを CodeCommit リポジトリにプッシュします。 | 「*添付ファイル*」セクションで、この例のコードをダウンロードし、必要なコードをそのコードにプッシュします。通常、コードには、パイプラインへの入力として AWS CloudFormation または AWS SAM テンプレート、Lambda コード、および CodeBuild `buildspec.yaml` ファイルを含めることができます。 | DevOps | 

### ソースフェーズ: パイプラインを作成する　
<a name="source-phase-create-the-pipeline"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| CodePipeline ジョブを作成します。　 | CodePipeline コンソールで、[**パイプラインの作成**] を選択します。 | DevOps | 
| CodePipeline ジョブに名前を付け、サービスロール設定を選択します。 | ジョブの名前を入力し、デフォルトのサービスロール設定のままにして、CodePipeline が必要なポリシーをアタッチしたロールを作成します。 | DevOps | 
| アーティファクトストアの場所を指定します。 | [**詳細設定**] では、デフォルトのオプションをそのまま使用して、CodePipeline がコードアーティファクトストレージに使用する S3 バケットを作成します。代わりに既存の S3 バケットを使用する場合、そのバケットは最初のエピックで指定したプライマリリージョンにある必要があります。　 | DevOps | 
| 暗号化キーを指定します。　 | デフォルトのオプションである**デフォルトの AWS マネージドキー**をそのまま使用するか、AWS Key Management Service (AWS KMS) のカスタマーマネージドキーを使用します。 | DevOps | 
| ソースプロバイダを指定します。 | [**ソースプロバイダ**] には、**AWS CodeCommit** を選択します。 | DevOps | 
| リポジトリを指定します。 | 最初のエピックで作成した CodeCommit リポジトリを選択します。ブランチにコードを配置した場合は、ブランチを選択します。 | DevOps | 
| コード変更の検出方法を指定します。 | CodeCommit が CodePipeline ジョブを開始するための変更トリガーとして、デフォルトの **Amazon CloudWatch Events** ままにします。 | DevOps | 

### ビルドフェーズ:パイプラインを設定する
<a name="build-phase-configure-the-pipeline"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ビルドプロバイダを指定します。 | [ビルドプロバイダ] には、[**AWS CodeBuild**] を選択します。 | DevOps | 
| AWS リージョンを指定します。 | 最初のエピックで指定したプライマリ リージョンを選択します。 | DevOps | 

### ビルドフェーズ:プロジェクトを作成して設定する
<a name="build-phase-create-and-configure-the-project"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| プロジェクトの作成 | プロジェクトの名前を入力し、[**プロジェクトの作成**] を選択します。 | DevOps | 
| 環境イメージを指定します。 | このパターンのデモンストレーションでは、デフォルトの CodeBuild マネージドイメージを使用します。　 また、カスタムの Docker イメージがある場合は、使用することもできます。 | DevOps | 
| オペレーティングシステムを指定します。 | Amazon Linux 2 または Ubuntu のいずれかを選択します。Amazon Linux 2 のサポートは間もなく終了します。詳細については、「[Amazon Linux 2 に関するよくある質問](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 Events のログを表示するには、デフォルト設定のままにします。または、特定のグループ名やロガー名を定義することもできます。 | DevOps | 

### デプロイフェーズをスキップします。
<a name="skip-the-deploy-phase"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| デプロイフェーズをスキップして、パイプラインの作成を完了します。 | パイプラインを設定すると、CodePipeline ではデプロイフェーズに 1 つのステージのみ作成できます。複数の AWS リージョンにデプロイするには、このフェーズをスキップしてください。パイプラインを作成した後、複数のデプロイ フェーズ段階を追加できます。 | DevOps | 

### デプロイフェーズ: パイプラインを最初のリージョンにデプロイするように設定します。
<a name="deploy-phase-configure-the-pipeline-for-deployment-to-the-first-region"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| デプロイ フェーズにステージを追加します。　 | パイプラインを編集し、デプロイ フェーズで**ステージを追加**を選択します。この第 1 ステージはプライマリ リージョン用です。 | DevOps | 
| ステージのアクション名を指定します。 | 最初の（プライマリ）ステージおよびリージョンを反映する一意の名前を入力します。たとえば、 **primary\_<リージョン>\_deploy** と入力します。 | DevOps | 
| アクションプロバイダを指定します。 | [**アクションプロバイダ**] で、AWS CloudFormation を選択します。 | DevOps | 
| 第 1 ステージのリージョンを設定します。　 | 第 1 (プライマリ) リージョンは、CodePipeline と CodeBuild が設定されているのと同じリージョンを選択します。これは、スタックをデプロイするプライマリ リージョンです。 | DevOps | 
| 入力アーティファクトを指定します。 | **BuildArtifact** を選択します。これはビルドフェーズの出力です。 | DevOps | 
| 必要なアクションを指定します。 | [**アクションモード**] で、[**スタックを作成または更新する**] をクリックします。 | DevOps | 
| CloudFormation スタックの名前を入力します。 |  | DevOps | 
| 第 1 リージョンのテンプレートを指定します。 | CodeBuild によってパッケージ化され、第 1 (プライマリ) リージョンの S3 バケットにダンプされたリージョン固有のパッケージ名を選択します。　 | DevOps | 
| 機能を指定します。 | スタックテンプレートに IAM リソースがある場合やマクロを含むテンプレートから直接スタックを作成する場合に、機能が必要です。このパターンでは、CAPABILITY\_IAM、CAPABILITY\_NAMED\_IAM、CAPABILITY\_AUTO\_EXPAND を使用します。 | DevOps | 

### デプロイフェーズ:パイプラインを第 2 リージョンにデプロイするように設定します。
<a name="deploy-phase-configure-the-pipeline-for-deployment-to-the-second-region"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| デプロイ フェーズに第 2 ステージを追加します。　 | 第 2 リージョンにステージを追加するには、パイプラインを編集し、デプロイ フェーズで [**ステージを追加**] を選択します。重要: 第 2 リージョンの作成プロセスは、次の値を除いて第 1 リージョンの作成プロセスと同じです。 | DevOps | 
| 第 2 ステージのアクション名を指定します。 | 第 2 ステージと第 2 リージョンを表す一意の名前を入力します。 | DevOps | 
| 第 2 ステージのリージョンを設定します。　 | スタックをデプロイする第 2 リージョンを選択します。 | DevOps | 
| 第 2 リージョンのテンプレートを指定します。 | CodeBuild によってパッケージ化され、第 2 リージョンの S3 バケットにダンプされたリージョン固有のパッケージ名を選択します。　 | DevOps | 

### デプロイフェーズ:パイプラインを第 3 リージョンにデプロイするように設定します。
<a name="deploy-phase-configure-the-pipeline-for-deployment-to-the-third-region"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| デプロイ フェーズにステージを追加します。　 | 第 3 リージョンにステージを追加するには、パイプラインを編集し、デプロイフェーズで [**ステージを追加**] を選択します。重要: 第 2 リージョンの作成プロセスは、次の値を除いて、これまでの 2 つのリージョンの作成プロセスと同じです。 | DevOps | 
| 第 3 ステージのアクション名を指定します。 | 第 3 ステージと第 3 リージョンを表す一意の名前を入力します。 | DevOps | 
| 第 3 ステージのリージョンを設定します。　 | スタックをデプロイする第 3 リージョンを選択します。 | DevOps | 
| 第 3 リージョンのテンプレートを指定します。 | CodeBuild によってパッケージ化され、第 3 リージョンの S3 バケットにダンプされたリージョン固有のパッケージ名を選択します。　 | DevOps | 

### デプロイをクリーンアップする
<a name="clean-up-the-deployment"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 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 CodePipeline 用の AWS CloudFormation アーキテクチャ構造リファレンス](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)」