複数環境からのアクセスのあるECSのBlue/Greenデプロイ(検討編)

1218
複数環境からのアクセスのあるECSのBlue/Greenデプロイ(検討編)
この記事は検討編です。解決した結果は書かれていません。
後に解決編をあげる予定です。

TLDR

  1. ECSをBlue/Greenデプロイできるようにしたかった。
  2. 複数ターゲットグループを持つ場合、Blue/Greenデプロイできないという制限に引っかかることがわかった。
  3. ロードバランサーを1つだけ紐付け、Blue/Greenデプロイをし、ターゲットグループの変更を検知して、もう片方をlambdaでリリースというやり方を考えた。
  4. 3のやり方だが、そもそも複数のロードバランサーから1つのターゲットグループを参照するということができなかったことに気づく。
  5. ターゲットグループの登録先のIPは複数参照されていても問題ないので、それを付け替える方法を考える。
  6. 5の方法がかなり複雑になる。また、うまく行かなそうだと思われる。
  7. NLBを用いる形に変更

解説

要件

図のように、1つのECSに対して、Public/Private ALB両方からアクセスできるようにしようとしてます。

問題

最初は、ECSサービスにロードバランサーを複数設定できるので、それで終わりかと思っていたのですが、複数のロードバランサーを1つのターゲットグループへ紐づけるということはできませんでした。なので、おのずと、ロードバランサーごとにターゲットグループを作成することとなります。
また、TLDRに書きましたが、複数のターゲットグループへはBlue/Greenデプロイができないという制限があります。
ECSサービスがロードバランサーを複数持つということは、ターゲットグループも複数持つということであり、複数ターゲットグループを持つということは、Blue/Greenデプロイできない。でも、したい。
というのが、今回の問題です。

以下、検討の流れを書いていきます。

検討1

仕方ないので、複数ロードバランサーを紐づけることは諦め、1つにします。
そして、blue/greenデプロイが終わるとターゲットグループが切り替わるので、それを検知して、もう片方のロードバランサーのターゲットグループを変更という流れで組もうと考えました。

1. ECSに1つロードバランサーを紐づける。CodeDeployからblue/greenデプロイ

2. ターゲットグループの変更を検知

検討2

検討1ですが、そもそもロードバランサーが使用中のターゲットグループを他のロードバランサーで使用することができなかった。
元々これはわかってたはずなのですが、この記事を書いている最中に気づきました。

検討3

一つのターゲットグループを複数のロードバランサーから参照することはできませんが、そのターゲットグループの登録先は、同じIPでも登録できます。
つまり、検討1を少し変形し、最初にlambdaでターゲットグループを切り替えるのではなくて、まず、ターゲットグループの中身を切り替えることを考えました。

手順

  1. codedeployにより、デプロイが開始される。
  2. 新しいタスクが作られる(画像では、Container2のこと)。
  3. 新しいタスクの生成をEventBridgeのイベントから検知する。(画像右下の説明の部分)
  4. 3の後にlamdaを起動し、Privateターゲットグループの現在紐づいていない方へタスクのIPを設定する。
  5. EventBridgeからデプロイの成功イベントを検知する。(画像右上の説明の部分)
  6. 5の後、lambdaを起動し、Privateターゲットグループを新しいタスクが紐づいている方へ切り替える。

4のIPの設定と6のターゲットグループの切り替えを同時に行わない理由は、blue/greenデプロイにおいて、ユーザーがそのデプロイを再ルーティングしない場合、元のコンテナへのルーティングのままとなります。その場合は、先に切り替えまで行なってしまうと、コンテナが見えなくなってしまうからです。
しかし、これにも問題があり、EventBridgeで使えるイベントにcodedeployのSUCCESS時のイベントしかありませんでした。codedeployによるblue/greenデプロイでは、新しいタスクへの再ルーティングと元々のコンテナの破棄を行なっており、コンテナ破棄出来次第、SUCCESSとなります。つまり、コンテナの再ルーティング時のイベントが欲しかったがなかった。
なので、このやり方だと、コンテナを破棄している間、privateからコンテナが見えなくなってしまうことになります。

検討4

privateからは、ALBではなく、NLBを使うこととしました。
NLBのターゲットグループにALBロードバランサーを設定するようにしました。

あとがき

さて、検討が終わりましたので、検討4のやり方で作っていこうと思います。
解決編では、このやり方で解決できたのかについて、書こうと思います。
解決編をお楽しみに!