この記事は検討編です。解決した結果は書かれていません。
後に解決編をあげる予定です。
TLDR
- ECSをBlue/Greenデプロイできるようにしたかった。
- 複数ターゲットグループを持つ場合、Blue/Greenデプロイできないという制限に引っかかることがわかった。
- ロードバランサーを1つだけ紐付け、Blue/Greenデプロイをし、ターゲットグループの変更を検知して、もう片方をlambdaでリリースというやり方を考えた。
- 3のやり方だが、そもそも複数のロードバランサーから1つのターゲットグループを参照するということができなかったことに気づく。
- ターゲットグループの登録先のIPは複数参照されていても問題ないので、それを付け替える方法を考える。
- 5の方法がかなり複雑になる。また、うまく行かなそうだと思われる。
- 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でターゲットグループを切り替えるのではなくて、まず、ターゲットグループの中身を切り替えることを考えました。
手順
- codedeployにより、デプロイが開始される。
- 新しいタスクが作られる(画像では、Container2のこと)。
- 新しいタスクの生成をEventBridgeのイベントから検知する。(画像右下の説明の部分)
- 3の後にlamdaを起動し、Privateターゲットグループの現在紐づいていない方へタスクのIPを設定する。
- EventBridgeからデプロイの成功イベントを検知する。(画像右上の説明の部分)
- 5の後、lambdaを起動し、Privateターゲットグループを新しいタスクが紐づいている方へ切り替える。
4のIPの設定と6のターゲットグループの切り替えを同時に行わない理由は、blue/greenデプロイにおいて、ユーザーがそのデプロイを再ルーティングしない場合、元のコンテナへのルーティングのままとなります。その場合は、先に切り替えまで行なってしまうと、コンテナが見えなくなってしまうからです。
しかし、これにも問題があり、EventBridgeで使えるイベントにcodedeployのSUCCESS時のイベントしかありませんでした。codedeployによるblue/greenデプロイでは、新しいタスクへの再ルーティングと元々のコンテナの破棄を行なっており、コンテナ破棄出来次第、SUCCESSとなります。つまり、コンテナの再ルーティング時のイベントが欲しかったがなかった。
なので、このやり方だと、コンテナを破棄している間、privateからコンテナが見えなくなってしまうことになります。
検討4
privateからは、ALBではなく、NLBを使うこととしました。
NLBのターゲットグループにALBロードバランサーを設定するようにしました。
あとがき
さて、検討が終わりましたので、検討4のやり方で作っていこうと思います。
解決編では、このやり方で解決できたのかについて、書こうと思います。
解決編をお楽しみに!