【AWS】【トラブル】ELB / ALB に関するトラブル「HTTP 502: Bad Gateway」が表示

■ はじめに

 * AWSのロードバランササービスである
 ELB (Elastic Load Balancing) のトラブルシューティング
 について、纏める。

目次

【1】トラブル概要
【2】HTTP 502: Bad Gatewayの発生原因
【3】切り分け方法
 1)構成例
【4】切り分けするために確認方法 / 確認項目
 1)ロードバランサのアクセスログをONにする
 2)ロードバランサの状態は「healthy」になっているか確認
 3)サーバ側のアクセスログを確認
 4)サーバ側のTCPのダンプをとる
 5)netstatコマンドで、ポートが枯渇していないか確認

 【1】トラブル概要

AWSのロードバランササービスであるELB (Elastic Load Balancing)
を使ってて「HTTP 502: Bad Gateway」が表示された

【2】HTTP 502: Bad Gatewayの発生原因

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html#http-502-issues

より抜粋

考えられる原因

* 接続の確立を試みているときに、ロードバランサーがターゲットから TCP RST を受信した。
* ロードバランサーにターゲットへの未処理のリクエストがあるときに、
 ターゲットが TCP RST または TCP FIN との接続を閉じた。
* ターゲットのレスポンス形式が正しくないか、有効でない HTTP ヘッダーが含まれている。
* 新しいターゲットグループが使用されたが、
 最初のヘルスチェックに合格したターゲットがまだない。
 ターゲットが正常と見なされるには、1 つのヘルスチェックに合格する必要があります。

【3】切り分け方法

 * 『「ロードバランサ(又はサーバ外)」が原因』なのか
 『「サーバ側(EC2)」が原因』なのかを切り分ける必要がある

1)構成例

+----------------+       +----------------+       +----------------+       +----------------+
| クライアント側 | <===> | ロードバランサ | <===> | サーバ側(EC2)  | <===> | データベース側 |
+----------------+       +----------------+       +----------------+       +----------------+

【4】切り分けするために確認方法 / 確認項目

1)ロードバランサのアクセスログをONにする
2)ロードバランサの状態は「healthy」になっているか確認
3)サーバ側のアクセスログを確認
4)サーバ側のTCPのダンプをとる
5)netstatコマンドで、ポートが枯渇していないか確認

1)ロードバランサのアクセスログをONにする

 * ロードバランサのアクセスログは、デフォルトで無効なので
   AWSマネジメントコンソールから有効化にしておく

2)ロードバランサの状態は「healthy」になっているか確認

* 「healthy」以外の場合、ヘルスチェックの条件やヘルスチェック先を確認し、
 『3)サーバ側のアクセスログを確認』を行う
* Cloud Watch の HealthyHostCount/UnHealthyHostCount でも確認可能

3)サーバ側のアクセスログを確認

* 「サーバ側(EC2)」のアクセスログを確認し、
 該当する時間帯に対象のリクエストが来ているか確認する

* できれば処理時間を表示できるといい
  => ヘルスチェックの条件の規定値内にレスポンスが返っていないか確かめるため

4)サーバ側のTCPのダンプをとる

【目的】

 * 上記の原因(「TCP RST」を送信していないか)を確認するため
  => RST送っていたら、「サーバ側(EC2)」以降が原因で、
  ログ(syslogなど)で原因究明を試みる

【方法】

* Linuxの場合、tcpdumpでTCPダンプログをとり、
 そのログをWiresharkなどのソフトで開き、確認

【補足】

* ハードディスクの空き容量を確認し、十分に空きがあることを確認してから行う事
 => 容易にハードディスクが枯渇できるので、
  不要なログをとらないようにフィルタするようにする

5)netstatコマンドで、ポートが枯渇していないか確認

 * ポートが枯渇していないかnetstatコマンドで確認
 => 例えば、「netstat -an | wc -l」など
 => 詳細は、以下の関連記事を参照の事

netstatコマンドで TIME_WAIT が大量に発生する
https://dk521123.hatenablog.com/entry/2018/01/14/212835

関連記事

ELB / ALB ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2017/02/17/232855
ELB / ALB ~ 基本編 / Auto Scaling ~
https://dk521123.hatenablog.com/entry/2019/10/19/212241
ELB / ALB ~ 基本編 / パスベースのルーティング ~
https://dk521123.hatenablog.com/entry/2017/02/27/234919
netstatコマンドで TIME_WAIT が大量に発生する
https://dk521123.hatenablog.com/entry/2018/01/14/212835