ECSブルーグリーンデプロイメントをゼロから構築する。（その６：ブルーグリーンデプロイの実行）

# はじめに
過去５回にわたり、ブルーグリーンデプロイメントの設定を行ってきましたが、今回は実際にブルーグリーンデプロイの動作の確認や外部からのアクセスを試してみようと思います。

- 【前】[ECSブルーグリーンデプロイメントをゼロから構築する。（その５：ECSとCodeDeployの作成）](https://qiita.com/sakai00kou/items/7f3e2f3027573783b0c7)

# ECSブルーグリーンデプロイの実行
ブルーグリーンデプロイを試すため、「**新しいデプロイの強制**」（Force Deploy）を行うことでデプロイを行ってみようと思います。

「**Amazon Elastic Container Service**」ダッシュボードの「**クラスター**」より、作成済みのクラスタを選択し、作成済みのサービスのチェックボックスにチェック→「**更新**」で更新画面に遷移します。

![Monosnap_20231112_210029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/aeec07ce-c975-c968-4f66-6c150e230bd7.png)

「**新しいデプロイの強制**」にチェックを行うことで、ECSタスクが再度デプロイされるためチェックを行い、また、「**デプロイオプション**」で、`CodeDeploy`のアプリケーション名、デプロイグループ、デプロイ設定を選択します。

![Monosnap_20231112_182020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/627a70e7-d9a1-cd0d-5ae0-e0582fe8f1eb.png)

他の設定はデフォルトで問題ないため、設定できたら画面下の「**更新**」ボタンで更新します。

更新すると、画面上にデプロイ中のデプロイIDへのリンクが表示されるため、リンクを選択して`CodeDeploy`の画面に遷移します。

![Monosnap_20231112_210610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/e3525374-e03d-3b34-4756-cffe5f3bfbb7.png)

`CodeDeploy`の画面では、ロールバックやルーティングの変更、デプロイの中止等が行えるようになっており、予めテスト等を行い、問題ないことを確認してから新しいタスクにルーティングを切り替えるといったことができるようになっております。

今回は`CodeDeployDefault.ECSAllAtOnce`というデプロイ設定としているため、新しいタスクがデプロイされてすぐにルーティングを切り替える動作となりますが、デプロイ設定を変えると、テストトラフィックでのテストが完了するまで待機して、問題なければ手動で切り替えるといったこともできます。

新しいタスクに切り替えたことにより不要となる古いタスクは、「**元のタスクセットの終了**」を選択することで削除することができます。

![Monosnap_20231112_210828.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/5015be21-b50c-ab17-3830-1611cbad8d06.png)

## ブルーグリーンデプロイによるターゲットグループの遷移
ブルーグリーンデプロイにより、`ELB`のターゲットグループがどのように変化するかを見ていこうと思います。

`Fargate`の設定完了直後の状態では、ECSサービス設定時にリスナールールごとに別々のターゲットグループを指定しないと設定できないことからリスナールールに紐付けられているターゲットグループは以下のようになっています。

![Monosnap_20231112_181633.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/6cc6d0db-6712-cbb1-a168-c4d957c5a35b.png)

ブルーグリーンデプロイ実行完了後、ブルーのグループ、グリーンのグループ共に同じターゲットグループへの振り分けとなることから、各リスナールールに紐付けられているターゲットグループはどちらも同じターゲットグループに変化します。

![Monosnap_20231112_182424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/0677b245-76e2-0839-9597-bcce6f7c9520.png)

次のデプロイでは、もう一方のターゲットグループ（上記の場合`blue-green-blue-tg`）に新しいタスクのデプロイを行い、問題なければ本稼働用のリスナールールのターゲットグループも切り替える動作となります。

以下、デプロイを２回実施した場合のデプロイ時のリスナールール、ターゲットグループの遷移について表にまとめます。

尚、以下の表は何度かブルーグリーンデプロイの切り替えを行っている前提で、デプロイ前の状態がそれぞれ`blue-tg`からデプロイを実施した想定でまとめます。

||本稼働用ポート|テスト用ポート|
|:--|:--|:--|
|**デプロイ前**|blue-tg|blue-tg|
|**新タスクのデプロイ＆テスト(1回目)**|blue-tg|green-tg|
|**本稼働トラフィックの切り替え(1回目)**|green-tg|green-tg|
|**新タスクのデプロイ＆テスト(2回目)**|green-tg|blue-tg|
|**本稼働トラフィックの切り替え(2回目)**|blue-tg|blue-tg|

# 外部からのアクセス
[その３](https://qiita.com/sakai00kou/items/fc51cead539f2917bfb6)で外部からのアクセス用ドメインも作成したので、本稼働用ポート、テスト用ポートそれぞれにアクセスしてみようと思います。

「`www.aws.example.com`」 のようなレコードを設定したので、以下のようにアクセスすると`Fargate`のコンテナイメージに仕込んだ`index.html`の内容が表示されます。

![Monosnap_20231112_213934.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/1ae6be23-814c-7456-047e-0af49575939d.png)

また、テスト用ポートには「`https://www.aws.example.com:4430`」のようにポートまで指定することでテスト用ポートにアクセスすることができます。

# おわりに
ブルーグリーンデプロイメントの概念自体は、AWSに限らず使われる仕組みとなり、AWSの資格等にも出題されるため一般的なものとなりますが、実際に設定してみたいとなった場合、ハマりポイントも多く、一連の設定が体系的にまとまっている記事も少ないことから、設定するだけで一苦労だった方が多いのではないでしょうか。

今回の記事でブルーグリーンデプロイメントの設定に苦労する方が少しでも減れば幸いです。

また、今回は`ELB`でユーザからのアクセスを受け付ける構成としましたが、`CloudFront`も使用する構成でのブルーグリーンデプロイメントの方法も以下で紹介しているため、参考にして頂ければと思います。

- [CloudFront構成でもECSブルーグリーンデプロイメントを使えるようにする。](https://qiita.com/sakai00kou/items/13c93080467fb91b7eec)