🤔
NLB+ECSでSquidプロキシを組んだら特定のURLでのみ503エラーが起きる
TLDR
- NLBのターゲットグループの「維持設定」を有効にすべし
概要
各アプリケーションVPCからインターネットへ出る通信を集約し、アクセス可能なURLを統制するため、NLB+ECSを使ったSquidプロキシを構築し、Transit Gatewayを経由してアクセスできるようにしていました。
しかし、ある特定のURLにアクセスするときだけ、アプリケーションからプロキシを経由したリクエスト(CONNECTメソッドによるリクエスト)が503エラーとなる事象が発生しました。
対処
一見して原因が不明だったため、調査は難航しましたが、挙動的に負荷分散が良くない影響を与えているのではと考え、メトリクスを確認しスペックに余裕があることを確認してから、タスク数を1に減らし、実質負荷分散していない状態にしてみたところ、症状がパタリとなくなりました。
これはしたりということで、NLBのターゲットグループ「維持設定」を有効化することで、無事一件落着となりました。
推測
curl等でプロキシを経由したHTTPSリクエストが行われるとき、CONNECT
という聞き慣れないHTTPメソッドによって、暗号化されたトンネルを確立する処理が行われます。その後、そのトンネルを経由して実際のリクエストが実行されるので、この2リクエスト間で異なるサーバーが使われた場合、こういった症状になるのでは?と推測しました。
ただ、先程も言った通り、これは「特定のURLでのみ起きる」事象であるため、他のURL向けの通信もバンバン行われているこの仕組みで、ロードバランサーの設定を変えたら治る、というのはどうもしっくり来ませんでした。
この事象が発生するURLの内部では、nginxリバースプロキシが使われていたので、もしかすると、宛先URLのアーキテクチャによっても挙動が変わるのかもしれません。
Discussion