2023-12-17追記:気になることがあって続きを書いた
2023-12-17追記ここまで
こんな風にECSに入ってくるところにNLBを置いていて、サービスtoサービスの呼び出しにもNLBを挟んでいるような構成を考える。
デフォルトのNLBの設定だとターゲットグループに対する登録や登録解除にかかる時間がとても長いので、↓このトリさんの書いてくれている対応を(自分のアプリケーションの特性に合わせて)あてるのは必須。
それでもNLBのターゲットグループに対する登録と登録解除で数分かかってしまうため、アプリケーションのデプロイに10分ぐらいかかってしまう。
↓このあたりを読んでも、NLB周りで時間がかかるのは避けられなさそう。
https://github.com/kubernetes-sigs/aws-load-balancer-controller/issues/1834#issuecomment-781530724
でも、デプロイに10分は長いなぁ、5分以内に収めたいなぁという気持ち。欲を言えば3分以内。
ECS Service Connectを使うとどうなる?
じゃあ、サービスtoサービスの呼び出しにNLBを使うのをやめて、1年前に発表されたECS Service Connectを使うと、こうなるかな。
入口のNLBのところは変えたくないので、そこにはNginxを立ててプロキシする。アプリケーションへのアクセスはネームスペース経由になる。中身は確認してないけどEnvoyのサイドカーがデプロイされるらしい。
こうするとアプリケーションのデプロイ時にはNLBに対する登録と登録解除がいらなくなるので、数分速くなる。
Nginxの部分はNLBにつながってるので、そこのデプロイには変わらず10分くらいかかるだろうけど、そこはあんまり更新がないという想定。バージョンアップやセキュリティアップデートくらいかな。
簡単に確認
そんなことを頭の中で想像してみたので、実際に動くのかなぁと思ってウェブコンソールから手でポチポチして環境を作って遊んでみた。NginxからApp1への呼び出しはECS Service Connectを使うとこんな感じで書けて便利だった。
proxy_pass http://app1-80-tcp.my-ecs-cluster:80;
デプロイにはecspressoを使って、かかった時間はこんな感じだった。
NLBにつながってるアプリのデプロイ
❯ \time ecspresso deploy ... 524.80 real 0.28 user 0.13 sys
NLBにつながってないアプリのデプロイ
❯ \time ecspresso deploy ... 273.19 real 0.14 user 0.09 sys
こんな構成にできたらアプリケーションのデプロイを5分以内にはできそう。Drainingに2,3分かかってるっぽいから、そこがもう少し速くできたら3分以内には終わりそうなんだけどなー。いまのところ、ECS(Fargate)だとこれくらいまでかな。
面白かった!
カフェでAWS触って遊んでいて、目に入ったものをリソース名にしてたら、almond(ECSサービス), suger(NLB), cake(ECSタスク), cafe(API Gateway)みたいになって、どれがどれか分からん(自業自得)
— SHIIBA Mitsuyuki (@bufferings) December 16, 2023
(ツイートTypoしてた。sugar。)