ECSブルーグリーンデプロイメントをゼロから構築する。（その１：ネットワークの設定）

# はじめに
`AWS`のドキュメントや`AWS`の試験対策本を見ると、アプリケーションのデプロイ方式としてよく紹介されているブルーグリーンデプロイメントですが、実際に構成を作って試そうと思ってもハマりどころが色々あり、簡単にはできない場合が多いと思います。

私も検証でゼロから作成する場合に毎回どこかでつまづいて、すんなりいかないことが多いので、`ECS`（`Fargate`）でブルーグリーンデプロイメントを行う際の手順をまとめてみようと思います。

- 【次】[ECSブルーグリーンデプロイメントをゼロから構築する。（その２：ドメイン、証明書設定）](https://qiita.com/sakai00kou/items/07e6dd96213257a9c6c4)

# ブルーグリーンデプロイメントとは
アプリケーションをデプロイする際、例えばオンプレミスな物理サーバ上で動作するアプリケーションの場合、メンテナンス日を設けて一時的にサービス停止させたりしてサーバ上で動作するアプリケーションを入れ替えたりすることが多いかと思います。

ブルーグリーンデプロイメントはアプリケーションをデプロイする際のデプロイ方式の１つで`AWS`等のクラウドサービスでアプリケーションをデプロイする場合、クラウドのメリットの１つとなるサービス作成・廃棄することが簡単にできることを活かして、もう１セットのサービスを用意して、テストしてから切り替えることで安全に、ダウンタイムもほぼ無いリリースができる技術となります。

`AWS`の場合、アプリケーションデプロイを行うサービスとなる`CodeDeploy`サービスを利用することで、ブルーグリーンデプロイの構成を作成することができますが、`AWS`の様々なサービスが連携する構成となるため、仕組みをきちんと理解できていない初見の状態ではハードルが高いサービスになるかと思います。

今回は、複雑なブルーグリーンデプロイメントの構成を紐解きつつ、ハンズオン的に構成を作っていきたいと思います。

# ブルーグリーンデプロイメントの仕組みについて
ブルーグリーンデプロイメントと言うと、実際には色々とパターンが存在しますが、今回は`CodeDeploy`のブルーグリーンデプロイ設定で作成できる構成について説明します。

もし他のブルーグリーンデプロイの構成についても知りたい場合は以下を参照してください。

- [Blue/Green Deployments on AWS ](https://d1.awsstatic.com/whitepapers/AWS_Blue_Green_Deployments.pdf)
- [AWSのホワイトペーパーから学ぶブルーグリーンデプロイメント](https://blog.serverworks.co.jp/tech/2018/07/18/aws_blue_green_deployments/)

実際に`CodeDeploy`を利用したブルーグリーンデプロイはどのような仕組みで行われるのかをざっくりと説明した図が以下です。

![blue_green_deploy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/3c1c3f64-04ae-db54-d6ec-153cbe6c6077.png)

デプロイの制御は`CodeDeploy`で行われ、新しいサービスの作成や`ELB`のターゲットグループの紐づけ、ドメインの紐づけの切り替え等を行います。（上図１、２）

また、`CodeDeploy`でブルーグリーンデプロイの設定を行った場合は、`ELB`に開発者アクセス用のリスナールールを作成する必要があり、開発者アクセス用ルールのターゲットとして、新しく作成されたサービスを指定することで、開発者のみアクセスできる構成が作られます。（上図３）
※技術的には開発者アクセス用の待受ポート番号を設定したリスナールールを`ELB`に追加することで、一般ユーザと開発者のアクセスを分ける方法となります。

開発者から新しいサービスへのアクセスを行って、動作に問題が無いようであれば、一般ユーザ用リスナールールに紐づいているターゲットグループをBlue Group側からGreen Group側に切り替えることで一般ユーザも新しいサービスにアクセスできるようになります。（上図４、５）

最終的に不要となったBlue Group（に紐づいているサービス）を削除することでブルーグリーンデプロイメントの一連の操作は完了となります（上図６）

次回、更に新しいサービスをデプロイする際には、Blue Group側にデプロイを行って、Green GroupからBlue Groupに切り替える操作となります。

# 今回作成する構成
今回から数回にわたり、以下の構成を作成していこうと思います。

![blue_green_deploy_全体構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/d0037998-c382-0c65-f75b-5c7efe084901.png)

## ネットワークの設定
今回はゼロから始めるため、`VPC`から作成を行います。

AWSマネジメントコンソールより、VPCダッシュボードに移動し、「**VPC dashboard**」の「**VPCを作成**」より一通りのネットワーク設定を行います。

![Monosnap_20231022_163220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/21f16dd6-cde2-8447-28d6-16507836d7e7.png)

上図左側の設定は以下で設定を行いました。

|項目|設定|備考|
|:--|:--|:--|
|作成するリソース|VPCなど|まとめて作成するため、VPCなどを選択|
|名前タグの自動生成|自動生成にチェック||
|名前タグ|blue-green|任意の名前を指定|
|IPv4 CIDRブロック|10.0.0.0/16|任意のブロックを指定|
|IPv6 CIDRブロック|IPv6 CIDRブロックなし||
|テナンシー|デフォルト||
|アベイラビリティゾーン(AZ)の数|2|今回はテストのため2を指定|
|AZのカスタマイズ|ー|今回はカスタマイズはしない|
|パブリックサブネットの数|2|NATゲートウェイを使うため、2つ作成|
|プライベートサブネットの数|2|ECSを配置するプライベートサブネットを２つ作成|
|サブネットCIDRブロックをカスタマイズ|ー|今回はカスタマイズはしない|
|NATゲートウェイ|1AZ内|インターネットへのアウトバウンド通信を通すため1AZのみ設定|
|VPCエンドポイント|S3ゲートウェイ|今回は使わないがデフォルトのまま進める|
|DNSホスト名を有効化|チェック|DNSを有効にする必要があるため、チェック（デフォルト設定）|
|DNS解決を有効化|チェック|DNSを有効にする必要があるため、チェック（デフォルト設定）|
|追加のタグ|ー|今回はタグの追加はしない|

上記のようにまとめて作成を行うと、以下のように基本的なネットワーク設定がまとめて行われます。

![Monosnap_20231022_164734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/1a7a90b4-7e6b-fb64-1587-589b317083b3.png)

以前は１つ１つ設定する必要がありましたが、一度にまとめて作成することができ、作成後も、「**Your VPCs**」の「**リソースマップ**」タブから各リソースの紐づけが確認できるので、`AWS`のネットワーク構成が分かりやすくなりました。

![Monosnap_20231022_165122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/c7ca65a0-5f5f-0c79-97cd-651d5564661a.png)

# おわりに
今回はブルーグリーンデプロイメントの仕組みと、ネットワークの設定まで行いました。

次回はブルーグリーンデプロイメントとは若干外れますが、今後の通信確認等で必要なサービスとなる`Route53`や`ECR`といった付帯サービスの設定を行っていきます。