🤔

NLB+ECSでSquidプロキシを組んだら特定のURLでのみ503エラーが起きる

2024/05/02に公開

TLDR

  • NLBのターゲットグループの「維持設定」を有効にすべし

概要

各アプリケーションVPCからインターネットへ出る通信を集約し、アクセス可能なURLを統制するため、NLB+ECSを使ったSquidプロキシを構築し、Transit Gatewayを経由してアクセスできるようにしていました。
アーキテクチャ図

しかし、ある特定のURLにアクセスするときだけ、アプリケーションからプロキシを経由したリクエスト(CONNECTメソッドによるリクエスト)が503エラーとなる事象が発生しました。
503エラー発生時のログ

対処

一見して原因が不明だったため、調査は難航しましたが、挙動的に負荷分散が良くない影響を与えているのではと考え、メトリクスを確認しスペックに余裕があることを確認してから、タスク数を1に減らし、実質負荷分散していない状態にしてみたところ、症状がパタリとなくなりました。

これはしたりということで、NLBのターゲットグループ「維持設定」を有効化することで、無事一件落着となりました。

推測

curl等でプロキシを経由したHTTPSリクエストが行われるとき、CONNECTという聞き慣れないHTTPメソッドによって、暗号化されたトンネルを確立する処理が行われます。その後、そのトンネルを経由して実際のリクエストが実行されるので、この2リクエスト間で異なるサーバーが使われた場合、こういった症状になるのでは?と推測しました。

ただ、先程も言った通り、これは「特定のURLでのみ起きる」事象であるため、他のURL向けの通信もバンバン行われているこの仕組みで、ロードバランサーの設定を変えたら治る、というのはどうもしっくり来ませんでした。

この事象が発生するURLの内部では、nginxリバースプロキシが使われていたので、もしかすると、宛先URLのアーキテクチャによっても挙動が変わるのかもしれません。

Discussion