CloudFormationでECSクラスター(開発、QA、本番)へのビルド・デプロイパイプライン構築の自動化

ECSのクラスターに対するパイプラインのリファレンス・アーキテクチャについては以下のGithubリポジトリで公開されています。
[ECS Reference Architecture: Continuous Deployment](https://github.com/awslabs/ecs-refarch-continuous-deployment/blob/master/README.md)
![alt](https://raw.githubusercontent.com/awslabs/ecs-refarch-continuous-deployment/master/images/architecture.png)
こちらで公開されているCloudFormationテンプレートでは本番環境を想定したECSクラスターに対してコンテナイメージのビルド・デプロイを自動化するパイプラインを構築し、パイプラインを実際に動作させるために必要な以下のAWSリソースが自動的に作成されます。

- [DeploymentPipeline](https://github.com/awslabs/ecs-refarch-continuous-deployment/tree/master/templates/deployment-pipeline.yaml):デプロイメント・パイプラインを構成するCodeBuildプロジェクト、CodePipelineパイプライン、CodePipelineのアーティファクト・ストア用のS3バケット、これらのサービスに必要なIAMロールを含めたAWSリソース、サンプルアプリケーションのためのECRリポジトリ(このテンプレートはCodePipelineパイプラインが継続的にサンプル・アプリケーションをデプロイするターゲットとして使用される)

- [Service](https://github.com/awslabs/ecs-refarch-continuous-deployment/tree/master/templates/service.yaml):  ECSタスク定義、ECSサービス、IAMロール

- [Cluster](https://github.com/awslabs/ecs-refarch-continuous-deployment/tree/master/templates/ecs-cluster.yaml):ECSクラスター（起動タイプでEC2を選択した場合はECS最適化されたAMIで起動されたEC2インスタンスのAutoScaling Groupも含む）

- [Load Balancer](https://github.com/awslabs/ecs-refarch-continuous-deployment/tree/master/templates/load-balancer.yaml):サンプル・アプリケーションへのトラフィックに使用されるApplication Load Balancer

- [VPC](https://github.com/awslabs/ecs-refarch-continuous-deployment/tree/master/templates/vpc.yaml):VPCと異なる2つのAvailability Zoneに分離された2つのパプリック・サブネット、インターネット・ゲートウェイ、パプリック・インターネントへのデフォルト・ルートを伴うルート・テーブル

このリファレンス・アーキテクチャのサンプルではパイプラインのデモをする際に必要なすべてのリソースが作成されてしまうためプロジェクトではそのまま使用できないため以下の拡張を行いました。

- 前述のリソースのうちDeploymentPipeline以外のリソースを除外（別チームが担当するため）
- 前述のDeploymentPipeline内のIAMロールおよびS3バケット（別チームが担当するため）
- パイプラインを実行環境（開発、QA、本番）の数分作成するように拡張
- パイプラインのビルド・ステージに単体テスト用のCodeBuildプロジェクト実行ステップを追加
- 本番用のパイプラインのビルド・ステージの先頭で承認ステップを追加し、承認がないとパイプラインが実行されないように拡張。なお、承認依頼の通知が指定のAmazon SNSトピックに飛ぶように構成
- パイプライン内で使用するCodeBuildプロジェクトは各環境用のパイプラインで共通に使用できるためテンプレートを分離

この拡張の結果作成したテンプレートについては以下のGithubリポジトリで公開しています。
[ECS Continuous Deployment Architecture](https://github.com/strada501/aws-ecs-pipeline)
![alt](https://raw.githubusercontent.com/strada501/aws-ecs-pipeline/master/images/architecture.png)

こちらで公開している手順でパイプラインを構築することで、上図で示されるパイプラインが実行環境ごとに作成されます。

手順はGithubリポジトリの方にも記載していますが、この記事には画面ショットも含めたステップ・バイ・ステップの形式で手順を記載します。

# 0. 前提条件
- ECSクラスタの実行環境が構築済みであること
    - パイプラインテスト用ECS実行環境構築手順は[こちら](#（参考）パイプラインテスト用ECS実行環境構築手順)を参照してください
- ECRリポジトリが作成済みであること
    - 開発用、QA用、本番用の3つのECRリポジトリが必要
- 本番環境パイプラインにおける承認通知用のSNSトピックが作成済みであること
    - 実際の通知が不要な場合はSNSトピックのみ作成でもOK
    - 通知が必要な場合はお好きな通知方法でトピックに紐付けるサブスクリプションを追加
- CodePipelineのアーティファクトストア用S3バケットが作成済みであること
    - 任意の名前でS3バケットを作成
    - この名前を
- CodePipelineおよびCodeBuild、CloudWatch events用のIAMロールが設定済みであること
    - CodePipeline用のIAMロールに関してはGithubに記載のもののままでOK
    - CloudWatch events用のIAMロールに関してはGithubに記載のもののままでOK
    - CodeBuild用のIAMロールに関してはGithubに記載のものの環境固有の情報を置換したものを設定

以下の**AWS Account ID**をご自身のIDに置換し、**nodejs-build-project-name**および**containerImage-build-project-name**を後ほど作成するNodeJSアプリケーションビルド用CodeBuildプロジェクト名とコンテナ・イメージビルド用CodeBuildプロジェクト名に置換します。

```
"Resource": [
    "arn:aws:logs:ap-northeast-1:<AWS Account ID>:log-group:/aws/codebuild/<nodejs-build-project-name>",
    "arn:aws:logs:ap-northeast-1:<AWS Account ID>:log-group:/aws/codebuild/<nodejs-build-project-name>:*",
    "arn:aws:logs:ap-northeast-1:<AWS Account ID>:log-group:/aws/codebuild/<containerImage-build-project-name>",
    "arn:aws:logs:ap-northeast-1:<AWS Account ID>:log-group:/aws/codebuild/<containerImage-build-project-name>:*"
],
```

以下の**s3-bucket-name**を任意のシステム名接頭語に置換します。

```
"Resource": [
    "arn:aws:s3:::<s3-bucket-name>*"
],
```
# 1. AWS CodeBuildプロジェクトの作成
前述したとおりパイプライン内で使用するCodeBuildプロジェクトは全てのパイプラインから共通で使用可能であるため、パイプライン本体のCloudFormationスタックとは別に作成します。

## 1.1. NodeJSアプリケーションビルド用CodeBuildプロジェクトの作成

- Githubの[手順4](https://github.com/strada501/aws-ecs-pipeline/blob/master/README.md#4-create-the-cloudformation-stack-of-a-codebuild-project-for-building-sample-app)の下のデプロイアイコンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/49513f86-d6b7-7fa9-5ed2-899bde810f99.png)

- スタックのクイック作成画面に以下のパラメータを入力して**スタックの作成**をクリック

| パラメータの説明 | パラメータの値 |
|:---------------|:-------------|
| What is the CodeBuild Project Name for Node.js application build?| NodeJSアプリケーションビルド用CodeBuildプロジェクトの名前|
| Which CodeBuild service role should be used?| [前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成したCodeBuild用のIAMロール名|
![screencapture-ap-northeast-1-console-aws-amazon-cloudformation-home-2020-06-17-18_35_55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/92fc608b-85ee-ca9d-12e0-e001c9dd5fd8.jpeg)

- イベントテーブルの一番上の行の論理IDが前の手順で入力したスタック名でステータスが**CREATE_COMPLETE**と表示されればOK
![screencapture-ap-northeast-1-console-aws-amazon-cloudformation-home-2020-06-18-10_32_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/ada5a1c8-938b-829b-7ac3-86749fef3d93.jpeg)

## 1.2. コンテナ・イメージビルド用CodeBuildプロジェクトの作成

- Githubの[手順5](https://github.com/strada501/aws-ecs-pipeline/blob/master/README.md#5-create-the-cloudformation-stack-of-a-codebuild-project-for-building-a-container-image)の下のデプロイアイコンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/b53112db-b90b-50bc-c9f8-f86417e10c45.png)

- スタックのクイック作成画面に以下のパラメータを入力して**スタックの作成**をクリック

| パラメータの説明 | パラメータの値 |
|:---------------|:-------------|
| What is the CodeBuild Project Name for Container images build?| コンテナ・イメージビルド用CodeBuildプロジェクトの名前|
| Which CodeBuild service role should be used?| [前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成したCodeBuild用のIAMロール名|
![screencapture-ap-northeast-1-console-aws-amazon-cloudformation-home-2020-06-18-10_47_53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/761d0db2-8bee-380b-dfdb-cbc091aca5d3.jpeg)

- イベントテーブルの一番上の行の論理IDが前の手順で入力したスタック名でステータスが**CREATE_COMPLETE**と表示されればOK
![screencapture-ap-northeast-1-console-aws-amazon-cloudformation-home-2020-06-18-10_48_55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/53dce6ff-4859-48c9-79a7-091190c1c00e.jpeg)


# 2. AWS CodeCommitリポジトリの整備
ここではパイプラインのSourceステージの入力となるソースコード管理のリポジトリとしてAWS CodeCommitのリポジトリを作成します。

## 2.1. AWS CodeCommitリポジトリの作成

- AWS CodeCommitのコンソールを開く
- **リポジトリの作成**をクリック
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-2020-06-18-11_04_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/195a10cc-6fba-9170-c371-dc1c81d02f58.jpeg)

- 任意のリポジトリ名を入力し、**作成**をクリック
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repository-create-2020-06-18-11_04_53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/4027e262-04b6-0edb-1460-c883f199ab96.jpeg)

- リポジトリの作成が成功したことを確認
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-setup-2020-06-18-11_05_18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/a7977e65-c2ed-a56e-2b3a-ad035febd8b4.jpeg)

## 2.2. AWS CodeCommitリポジトリへのパイプライン用ファイルの配置
- [サンプル・アプリケーションのGithubリポジトリ](https://github.com/strada501/aws-ecs-pipeline-sample-app)の内容をダウンロードする

- ローカルコンピュータへ[2.1](#21-aws-codecommit%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90)で作成したCodeCommitリポジトリのクローンを作成する

（参考）AWS CodeCommit リポジトリに接続する - AWS CodeCommit
リポジトリのクローンを作成して CodeCommit リポジトリに接続する
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-connect.html#how-to-connect-http

- CodeCommitのリポジトリにサンプル・アプリケーションの内容をPUSHする

（参考）AWS CodeCommit でコミットを作成する - AWS CodeCommit
	https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-create-commit.html

## 2.3. AWS CodeCommitリポジトリのブランチ作成
- AWS CodeCommitのコンソールを開き、[2.1](#21-aws-codecommit%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90)で作成したCodeCommitリポジトリを選択し左メニューから**ブランチ**を選択する

- ブランチ一覧の右上にある**ブランチの作成**をクリックする
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-branches-2020-06-18-11_19_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/a05b4488-cf05-90d4-e8f7-e4ca2bad0fc5.jpeg)

- ブランチ名にQA環境用のブランチ名を入力し、**ブランチ元**に**master**を入力し、**ブランチの作成**をクリックする
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-branches-2020-06-18-11_20_31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/f29f56c2-af16-9af4-121d-abd1e37c6424.jpeg)

- 同様の手順で本番環境用のブランチも作成する

# 3. AWS CodePipelineパイプラインの作成
ここではメインとなるCodePipelineのパイプラインをCloudFormationのテンプレートから作成します

## 3.1 開発、QA、本番環境用パイプラインの作成
- Githubの[手順6](https://github.com/strada501/aws-ecs-pipeline/blob/master/README.md#6-create-the-cloudformation-stack-of-3-codepipeline-pipelines-devqaproduction)の下のデプロイアイコンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/67489c75-65b5-32d5-0836-c6c17961e803.png)

- スタックのクイック作成画面に以下のパラメータを入力して**スタックの作成**をクリック

| パラメータの説明 | パラメータの値 |
|:---------------|:-------------|
|What is the Code Pipeline Name for the development environment? |開発環境用パイプライン名 |
|What is the Code Pipeline Name for the quality assurance environment? |QA環境用パイプライン名 |
|What is the Code Pipeline Name for the production environment? |本番環境用パイプライン名 |
|Which CodePipeline service role should be used? | [前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成したCodePipeline用のIAMロール名 |
|Which s3 bucket should be used for a codepipeline artifact store? | [前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成したCodePipelineのアーティファクトストア用S3バケット |
|Which SNS Topic should be used for the approval of a production deployment? | [前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成した本番環境パイプラインにおける承認通知用のSNSトピック |
|Which Role should be used for CloudWatch Event? | [前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成したCloudWatch events用のIAMロール名 |
|Which CodeCommit Repository should be used? | [2.1](#21-aws-codecommit%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90)で作成したCodeCommitリポジトリ名 |
|Which CodeCommit Branch should be used for the development environment? |master |
|Which CodeCommit Branch should be used for the quality assurance environment? |[2.3](#23-aws-codecommit%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E4%BD%9C%E6%88%90)で作成したQA環境用のブランチ名 |
|Which CodeCommit Branch should be used for the production environment? |[2.3](#23-aws-codecommit%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E4%BD%9C%E6%88%90)で作成した本番環境用のブランチ名 |
|Which CodeBuild Project should be used for Node.js application build? |[1.1](#11-nodejs%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%93%E3%83%AB%E3%83%89%E7%94%A8codebuild%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)で作成したNodeJSアプリケーションビルド用CodeBuildプロジェクト名 |
|Which CodeBuild Project should be used for container image build? |[1.2](#12-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%83%93%E3%83%AB%E3%83%89%E7%94%A8codebuild%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)で作成したコンテナ・イメージビルド用CodeBuildプロジェクト名 |
|What is the ECR Repository Name for the development environment? |開発環境用のECRリポジトリ名 |
|What is the ECR Repository Name for the quality assurance environment? |QA環境用のECRリポジトリ名 |
|What is the ECR Repository Name for the production environment? |本番環境用のECRリポジトリ名 |
|What is the ECS Container Name? |現在ECSで稼働しているタスク定義上のアプリケーションがデプロイされているコンテナの名前 |
|Describe lifecycle policy text for the development environment? |開発環境用のECRリポジトリに適用されるライフサイクルポリシーのJSON文字列。デフォルト値では最大5つまでのイメージを保持する設定となっているため設定変更が不要であれば修正不要 |
|Describe lifecycle policy text for the quality assurance environment? |QA環境用のECRリポジトリに適用されるライフサイクルポリシーのJSON文字列 |
|Describe lifecycle policy text for the production environment? |本番環境用のECRリポジトリに適用されるライフサイクルポリシーのJSON文字列 |
|Which ECS Cluster should a container image be deployed to for the development environment? | [前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成した開発環境用のECSクラスター名 |
|Which ECS Cluster should a container image be deployed to for the quality assurance environment? |[前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成したQA環境用のECSクラスター名 |
|Which ECS Cluster should a container image be deployed to for the production environment? |[前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成した本番環境用のECSクラスター名 |
|Which ECS Service should a container image be deployed to for the development environment? |[前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成した開発環境用のECSサービス名 |
|Which ECS Service should a container image be deployed to for the quality assurance environment? |[前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成したQA環境用のECSサービス名 |
|Which ECS Service should a container image be deployed to for the production environment? |[前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成した本番環境用のECSサービス名 |
![screencapture-ap-northeast-1-console-aws-amazon-cloudformation-home-2020-06-18-14_32_14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/45efeb8b-bf1f-d892-31f9-548b66bbc39e.jpeg)

- イベントテーブルの一番上の行の論理IDが前の手順で入力したスタック名でステータスが「CREATE_COMPLETE」と表示されればOK
![screencapture-ap-northeast-1-console-aws-amazon-cloudformation-home-2020-06-18-13_10_43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/86d92515-7e5a-62ca-4cc8-c0e243216a90.jpeg)

# 4. パイプラインの動作確認
ここでは作成された各環境のパイプラインの動作を確認します。
※パイプラインは作成したタイミングで自動的に初回実行されるため注意が必要。開発環境用のパイプラインに関しては設定に問題がなければこの時点で全て成功で完了するはず。QAと本番はブランチにソースがマージされていないために失敗する想定。

# 4.1. 開発環境へのデプロイ
開発環境のパイプラインはCodeCommitリポジトリのmasterブランチへのPUSHをトリガーとしているため、サンプル・アプリケーションを変更してPUSHすることで、パイプラインが変更内容をECSに自動的に反映することを確認します。

- [2.1](#21-aws-codecommit%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90)で作成したCodeCommitリポジトリにアクセスし、**app.js**を表示する
    - 現在は**Hello world**が応答されることが確認できる
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-browse-refs-heads-master-app-js-2020-06-18-13_44_46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/5a90f296-aafe-b60d-ae15-d22df53dfffa.jpeg)

- **Hello world**を**Hello ECS Continuous Delivery World**に変更し、**変更のコミット**をクリックする
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-files-edit-refs-heads-master-app-js-2020-06-18-13_45_20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/f665dd83-3cf9-fe04-0f0d-216664ca68bf.jpeg)

- CodePipelineのコンソールを開き、開発環境用のパイプラインが**進行中**となっていることを確認し、パイプライン名を選択して開く

![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codepipeline-pipelines-2020-06-18-13_49_15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/0620bddc-ad53-6e3b-429d-60f0d0ebe6cb.jpeg)

- 全てのステージが完了するまで待機
    -  [前提条件](#0-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)で作成したIAMロールの権限に問題がある場合には失敗してしまうので、不足している権限をログから確認して正しく設定すること
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codepipeline-pipelines-ECSNodeJSSamplePipeline-dev-view-2020-06-18-13_56_25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/d6359eb4-0697-731d-6b02-66f90038958a.jpeg)

- 全てのステージが完了したことを確認
    - Deployステージが完了するのに結構時間がかかります
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codepipeline-pipelines-ECSNodeJSSamplePipeline-dev-view-2020-06-18-14_52_33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/f5b530f1-ecb4-4c8b-3958-2a3997627a1f.jpeg)

- パイプラインが完了したら開発環境のECSサービスのエンドポイントにアクセスし、サンプル・アプリケーションの応答メッセージが変更されていればOK
![screencapture-ec2co-ecsel-p6lngwcgf3as-1704426259-ap-northeast-1-elb-amazonaws-8080-2020-06-18-14_48_43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/2ed2c548-d276-4da3-5916-de383a593670.jpeg)


## 4.2. QA環境へのデプロイ
QA環境のパイプラインはCodeCommitリポジトリのQA環境用ブランチへのPUSHをトリガーとしているため、masterブランチでの変更をマージすることで、パイプラインが変更内容をECSに自動的に反映することを確認します。
※CodeCommitの機能の都合上プルリクエストを使用してマージする手順で記載しています。

- [2.1](#21-aws-codecommit%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90)で作成したCodeCommitリポジトリにアクセスし、**プルリクエストの作成**をクリックする

- プルリクエストの作成画面でターゲットに**QA環境用ブランチ**を選択し、ソースに**master**を選択し、**比較**をクリックする
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-pull-requests-new-master-2020-06-18-15_01_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/19886236-27d2-1eda-2b97-02f79c233444.jpeg)

- 変更内容を確認の上プルリクエストのタイトルを入力し、**プルリクエストの作成**をクリックする
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-pull-requests-new-refs-heads-qa-refs-heads-master-2020-06-18-15_10_55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/1b0c4399-96f8-8662-40a2-7b6a667295f6.jpeg)

- **マージ**をクリックし、QA環境用ブランチへマージする
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-pull-requests-4-details-2020-06-18-15_11_55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/6f6d0422-ad2c-8600-c0d1-c8b1968c2f98.jpeg)

- マージ戦略で任意の方法を選択し、**プルリクエストのマージ**をクリックする
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-pull-requests-4-merge-2020-06-18-15_12_59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/733d8826-8bbd-0f14-090c-4db2e7b5426d.jpeg)

- マージが正しく完了したことを確認する
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codecommit-repositories-NodeJS-Sample-pull-requests-4-details-2020-06-18-15_14_51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/fab90cb9-fcd0-78dd-2482-ba8cb3982e90.jpeg)

- CodePipelineのコンソールを開き、**QA環境用のパイプライン**が実行されていることを確認
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codepipeline-pipelines-ECSNodeJSSamplePipeline-qa-view-2020-06-18-15_15_43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/9eac405a-64b7-6000-2b82-511b876c38e9.jpeg)

- 以降の手順は開発環境のパイプラインと同様で、パイプラインが完了したらECSサービスのエンドポイントにアクセスし、サンプル・アプリケーションの応答メッセージが変更されていればOK

## 4.3. 本番環境へのデプロイ
本番環境についてはマージ先のブランチが異なる以外は基本的にQA環境と同様の手順で確認できますが、パイプラインが開始したらパイプライン実行の承認が必要となります。パイプラインの承認は以下の手順で実施してください。

- CodePipelineのコンソールを開き、**本番環境用のパイプライン**が実行されており、**Build**ステージの**Approval**ステップで**承認を待機中**となっていることを確認
![screencapture-ap-northeast-1-console-aws-amazon-codesuite-codepipeline-pipelines-ECSNodeJSSamplePipeline-prod-view-2020-06-18-15_52_54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/5602701f-f7ba-66c2-24bb-03095f09556f.jpeg)

- **Approval**ステップ内の**レビュー**をクリックし、表示されたダイアログで**承認します**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/32c22d5f-ca53-3eac-d792-3a771a8ed9d5.png)


# （参考）パイプラインテスト用ECS実行環境構築手順
## 前提条件

- 任意のECRのリポジトリに [サンプル・アプリケーションのGithubリポジトリ](https://github.com/strada501/aws-ecs-pipeline-sample-app)のコンテナイメージが登録されていること

- AWS管理ポリシー「AmazonECSTaskExecutionRolePolicy」がアタッチされたECS実行用のタスクロールが定義されていること

## ECSクラスターの作成
以下の手順でdev用のECSクラスターを作成します

- Amazon ECSのコンソールよりクラスターの画面表示し、**今すぐ始める**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/a7070f8e-c158-2bef-d4c3-e07f63dfd527.png)

- コンテナの定義セクションにてcustomの**設定**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/017f2352-754c-a17c-899f-08afddb49d75.png)

- コンテナの編集画面で**コンテナ名**、**イメージ**を入力する
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/86c35693-549f-ebea-47b9-afefde4b8fa4.png)

- 下部に移動し、**ポートマッピング**に**8080**を入力し、**更新**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/8d6536e5-c6c2-c70c-f871-2de422c7075c.png)

- 設定が反映されたことを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/ac00519e-d713-8305-5cd4-1bd036b0b0fb.png)
 
- 続いて**タスク定義**セクションの**編集**をクリックする
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/4f8ee027-8b4b-4045-c0d9-39b6307edeac.png)

- タスク定義の設定画面で**タスク定義名**を入力し、**タスク実行ロール**を選択の上、**保存**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/3b5eddbb-60f9-6087-653b-c3f047223561.png)
 
- 最下部の**次**をクリックする
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/895a70f5-2f09-285d-a0b4-f8f4f63b48b8.png)

- 続いてサービスを定義するセクションにて**ロードバランサーの種類**に**Application Load Balancer**を選択し、**次**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/483dd2bb-fe59-3986-15fc-6fae51e82267.png)

- 続いてクラスターの設定セクションにて**クラスター名**を入力し、**次**をクリックする
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/3d205db0-c43a-e09d-30ca-169269434194.png)

- 確認画面で設定を確認の上**作成**をクリックする
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/4b8b612a-45c2-0c07-e376-77973a495ba4.png)

- 以下の画面にてすべての項目が完了になるまで待機し、完了になったら**ロードバランサー**のリンクをクリックする
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/8f6dfedf-6571-7128-12bd-ba8a2e423588.png)

- ロードバランサーの説明タブより**DNS名**をコピーする
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/e059339f-8523-723d-799a-b0db1efa4b83.png)

- ブラウザからコピーしたDNS名の8080ポートにアクセスし、サンプルアプリケーションにアクセスできることを確認する
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5259/1dd9a24f-8813-d4dd-0218-1ee5f1e39880.png)

- 同様の手順で**qa**、**production**のクラスターを作成する