CloudFormationではじめる初めてのECS（with Blue/Green Deployment）

## はじめに
先日、2018年8月に書いた「[LaravelアプリケーションをローカルでもAWSでもDockerで動かす](https://qiita.com/imunew/items/1e4826030d725beb4710)」という記事が`100` `LGTM`に到達しました。
2021年2月現在、私が書いた記事の中では、もっとも`LGTM`されている記事でして、今年に入ってからも`LGTM`されていることから関心の高い内容なのかなと思っています。
とはいえ、3年近く経過している記事ではありますので、構築方法も含めアップデートしたいと思います。
この記事では、`CloudFormation`を使って、いくつかコマンドを叩くことで、短いステップで`ECS`環境を構築していきます。

## 構築をはじめる前にやっておくこと
構築をはじめる前にやっておくことを以下に示します。

- `AWS CLI`のインストール
  - [AWS CLI バージョン 2 のインストール、更新、アンインストール - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)
- `aws configure --profile=$(profile)`による認証情報の設定
  - [設定ファイルと認証情報ファイルの設定 - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)
- `Docker`のインストール
  - [Get Started with Docker | Docker](https://www.docker.com/get-started)
  - `ECR`に`Docker`イメージをプッシュする際に必要になります
- `Windows`の場合、`Make`コマンドを使えるようにしておく
  - [Windows10でmakeしたい - Qiita](https://qiita.com/taki-ikat/items/f501f44a8d44e3fd6987)
- `github`の`personal access token`を作成
  - [個人アクセストークンを使用する - GitHub Docs](https://docs.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token)
  - `repo`と`admin:repo_hook`権限を選択しておきます
  - `CodePipeline`によるデプロイで必要になります

## いざ、構築
あらかじめ、`CloudFormation`のテンプレートと簡単なアプリケーションを[imunew/ecs-blue-green-demo](https://github.com/imunew/ecs-blue-green-demo)にて用意しています。
リポジトリを`fork`し、`git clone`しておきます。

```bash
$ git clone git@github.com:{forkしたアカウント}/ecs-blue-green-demo.git
$ cd ecs-blue-green-demo
```

以下、`imunew/ecs-blue-green-demo`を使って構築していきます。

### 1. `VPC`、`Subnet`、...`LoadBalancer`の構築
以下のように、`make`コマンドを実行していきます。

```bash
$ make deploy-vpc-subnet profile=$(profile)
$ make deploy-nat-instance profile=$(profile)
$ make deploy-network profile=$(profile)
$ make deploy-security-group profile=$(profile)
$ make deploy-load-balancer profile=$(profile)
```

### 2. `ECR`リポジトリの作成、および`Docker`イメージのプッシュ
まずは、`ECR`リポジトリを作成します。

```bash
$ make deploy-ecs-ecr profile=$(profile)
```

次に、`Docker`イメージをビルドし、`ECR`にプッシュします。

```bash
$ make push-docker-images profile=$(profile)
```

### 3. `ECS`クラスターとサービスの構築
`ECS`クラスターとサービスを構築します。

```bash
$ make deploy-ecs-cluster profile=$(profile)
$ make deploy-ecs-service profile=$(profile)
```

`ECS`サービスが正常に構築できていれば、その時点で`LoadBalancer`の`DNS`からエンドポイントにアクセス可能となるはずです。
（`phpinfo()`してるページが表示されるはずです。）

![ecs_demo_app_screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26422/49d39252-9b2c-a055-b7b4-77ccfac5ad3c.png)

### 4. `GitHub`プライベートアクセストークンを`Secrets Manager`に登録する
`access-token`には、事前に作成しておいたプライベートアクセストークンを指定します。

```bash
$ make deploy-secrets-github profile=$(profile) access-token=$(access-token)
```

### 5. `CodeDeploy`アプリケーションとデプロイグループの作成
`CodeDeploy`アプリケーションとデプロイグループを作成します。

```bash
$ make deploy-code-deploy profile=$(profile)
```

### 6. `CodePipeline`の作成
`CodePipeline`を作成します。

```bash
$ make deploy-code-pipeline profile=$(profile)
```

## Blue/Green デプロイ
フォークしたリポジトリに、コードをプッシュすると、下記のように、`CodePipeline`が動き出します。

![code-pipeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26422/2e020e8c-6e76-4cbe-bda2-837e1acd17bf.png)

`Deploy`ステージの`詳細`リンクをクリックすると、`Blue/Greenデプロイ`の詳細を下記のように確認できます。

![code-deploy-blue-green.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26422/fc042d86-3ac5-0c20-5840-2fb7bbce5420.png)

## おわりに
`ECS`環境の構築はできたでしょうか？
フォークしたリポジトリを色々カスタマイズしたりして、自分なりのテンプレートを作ってみてください。
何か詰まったところがあったり、ご意見などありましたら、この記事にコメントいただくか、`imunew/ecs-blue-green-demo`に`issue`か`pull-request`ください。

ではでは。