ALB からの HTTP エラーを迅速にトラブルシューティングするには、ALB アクセスログを有効にすることをお勧めします。まず、アクセスログで ALB ステータスコード (status フィールド) とバックエンドステータスコード (upstream_status フィールド) を比較します。値が同じ場合、ALB がバックエンドサーバーからのステータスコードをそのまま渡したと考えられます。この場合、バックエンドサービスのトラブルシューティングを優先する必要があります。
5つのクイックチェック
ステータスコード別にトラブルシューティングを行う前に、まず次の5つの項目を確認してください。これらは ALB 障害における最も一般的な根本原因です。
-
ALB インスタンス診断ツールを実行します。 インスタンス ページで対象のインスタンスを見つけ、インスタンスの診断 列で 診断 をクリックし、インスタンス設定、リスナー、およびバックエンドサービスに関する一般的な問題のワンクリックチェックを実行します。
-
リスナーの ヘルスチェックステータス が 正常 であることを確認します。 リスナーの詳細 ページで、バックエンドサーバーグループの ヘルスチェックステータス を確認します。 ステータスが 異常 の場合は、「ALB のヘルスチェックの失敗のトラブルシューティング」をご参照ください。
-
バックエンド ECS で、ALB インスタンスが配置されている VSwitch の CIDR ブロックがブロックされないようにしてください。 ALB は、その VSwitch によって割り当てられた Local IP を使用してバックエンドサーバーと通信します。 バックエンド ECS インスタンス上の iptables ルールまたはサードパーティのセキュリティソフトウェアによって VSwitch の CIDR ブロックがブロックされると、ALB はバックエンドに到達できなくなり、502 や 504 などのエラーが発生する可能性があります。
-
サーバーグループのバックエンドサーバーに設定されているポートが、バックエンドサービスが実際にリッスンしているポートと一致することを確認してください。 ALB サーバーグループの各バックエンドサーバーに設定されているポートは、アプリケーションプロセスがリッスンしているポートと一致する必要があります。 例えば、サーバーグループでポートが
8080に設定されていても、バックエンドサービスがポート80でリッスンしている場合、接続は失敗します。 バックエンド ECS でss -tlnp | grep ':<port> 'またはnetstat -tlnp | grep ':<port> 'を実行して確認できます。 -
HTTPS リスナーの場合、証明書の有効期限が切れていないこと、およびそのドメインがアクセスドメインと一致していることを確認します。リスナーの詳細 ページで、バインドされた証明書とその有効期限を確認します。証明書の有効期限切れやドメインの不一致は、SSL ハンドシェイクの失敗やエラーステータスコードが返される原因となることがあります。
502 Bad Gateway
このエラーは、HTTP または HTTPS リスナーがクライアントリクエストを受信したものの、ALB がバックエンドサーバーにリクエストを転送できない、またはバックエンドサーバーから応答を受信できない場合に発生します。
トラブルシューティング方法: まず、アクセスログの upstream_status フィールドの値を確認し、次のステップを決定します。
-
upstream_status= 502 の場合: ALB はバックエンドサーバーから 502 ステータスコードを渡しました。問題はバックエンドサービス自体にあります。バックエンドサービスを調査してください。たとえば、バックエンドの Nginx またはゲートウェイレイヤーが、到達不能なアップストリームへのリバースプロキシを試みていないか確認してください。 -
もし
upstream_statusが別の値 (504、444、または500など) の場合: ALB がクライアントに返すstatusはupstream_statusとは異なり、ALB がステータスコードを変更したことを意味します。バックエンドの Nginx、ゲートウェイ、またはアプリケーションのログを確認して、バックエンドサービスがその特定のステータスコードを返している理由を調査してください。 -
もし
upstream_statusが-または空の場合: ALB はバックエンドからレスポンスを受信しませんでした。これは、リクエストがバックエンドに到達しなかったか、あるいはレスポンスが送信される前にバックエンド接続が異常終了したことを意味します。以下の原因を順番に確認してください。-
ALB とバックエンドサーバー間の TCP 通信が失敗しています。バックエンドサービスが実行されていること、サービスポートが正しくリッスンしていること、およびバックエンド ECS 上の iptables ルールやサードパーティのセキュリティソフトウェアが、ALB インスタンスが配置されている VSwitch の CIDR ブロックをブロックしていないことを確認してください。ALB は、VSwitch によって割り当てられたLocal IP を使用してバックエンドサーバーと通信します。パケットをキャプチャして、TCP ハンドシェイクが成功しているかどうかを確認できます。
-
バックエンドサーバーのバックログがいっぱいになっています。これにより、サーバーは新しい接続リクエストをドロップします。バックエンドサーバーで
netstat -s | grep -i listenを実行し、dropカウンターを確認します。 -
バックエンドサーバーが期限内にリクエストを処理できなかった:バックエンドサーバーのログを確認し、CPU およびメモリ使用率を確認して、パフォーマンスのボトルネックを特定してください。
-
クライアントリクエストのパケットサイズがバックエンドサーバーの MTU を超えている:この場合、短いパケット(ヘルスチェックなど)は成功する一方で、長いパケットは失敗する可能性があります。バックエンドサーバーでパケットキャプチャを実施し、パケット長が必要な制限内に収まっているかを分析してください。
-
バックエンドサーバーの応答形式が無効、または無効な HTTP ヘッダーが含まれている:バックエンドサーバーでパケットキャプチャを実施し、応答形式が標準に準拠しているかを分析してください。
-
400 Bad Request
リクエスト形式が無効です。
-
バックエンドが直接 400 を返す: アクセスログを確認してください。
upstream_statusが400の場合、ALB がバックエンドからのステータスコードをパススルーした可能性が高いです。バックエンドサービスを調査してください。 -
HTTP リクエストが HTTPS リスナーに送信される: ALB HTTPS リスナーは、非 HTTPS リクエストを拒否し、
400ステータスコードを返します。クライアントが誤って HTTP リクエストを HTTPS ポートに送信していないか確認してください。 -
リクエストヘッダーのサイズが制限を超えています: ALB では、各 HTTP リクエストヘッダーのサイズが 32 KB 以下である必要があります。この制限を超えた場合、ALB はステータスコード
400を返します。リクエストヘッダーのサイズを小さくしてください。 -
クライアントがリクエスト全体を送信していない:クライアントが HTTP リクエストの送信完了前に接続をクローズしました。クライアント側でパケットキャプチャを実施し、原因を特定してください。
-
リクエストヘッダーの形式が無効です: 例えば、
Content-Lengthの値がリクエストボディの実際の長さと一致しません。クライアントでパケットをキャプチャし、HTTP リクエストの形式を分析して、有効なリクエストと比較します。
405 Method Not Allowed
リクエストメソッドがサポートされていません。
-
ALB の制限: ALB は
TRACEリクエストメソッドをサポートしていません。別のメソッドを使用してください。 -
バックエンドサービスの制限:
TRACEを除き、他のリクエストメソッドがサポートされているかどうかは、バックエンドサーバーに依存します。確認するには、curl -X METHOD http://<backend_service_IP>:<service_port>を実行します。ここで、METHODはクライアントが使用するリクエストメソッドです。
408 Request Timeout
リクエストがタイムアウトしたため、ALB は接続をクローズします。
-
クライアントのデータ送信が遅い: クライアントから ALB へのリクエストタイムアウト期間 (デフォルト: 60 秒) 内に、クライアントが
HTTP Headerのみ送信してHTTP Bodyを送信しないなど、データの一部しか送信しませんでした。クライアントでパケットをキャプチャして、パフォーマンスのボトルネックやその他の問題がないか確認してください。 -
クライアントと ALB 間のネットワーク品質の低下:TCP ラウンドトリップタイム (RTT) が高いか、パケットロスなどの他のネットワーク問題が発生しています。 アクセスログの
request_timeとtcpinfo_rttフィールドを確認するか、クライアントでネットワーク診断を実行することをお勧めします。 -
ALB インスタンスの帯域幅スロットリング:ALB インスタンスへの高トラフィックにより、帯域幅のスロットリングとパケットロスが発生しました。Cloud Monitor で
アウトバウンド帯域幅とドロップされた接続のメトリクスを確認してください。
413 Request Entity Too Large
リクエストボディが大きすぎます。まず、アクセスログの upstream_status フィールドの値を確認し、413 ステータスコードが ALB によって返されたか、バックエンドサーバーから渡されたかを判断します。
-
upstream_status= 413 の場合、バックエンドサーバーが 413 ステータスコードを返し、ALB がそれをそのまま転送したことを示します。 これは、より一般的なケースです。 これは通常、Nginx などのバックエンドプロキシサーバーで設定されたリクエストボディサイズの制限が原因です。 バックエンドサービスの関連設定 (たとえば Nginx のclient_max_body_sizeパラメーター) を調査してください。 -
もし
upstream_statusが-または空の場合: ALB は 413 ステータスコード自体を返します。これは、リクエストボディが ALB 自身のサイズ制限 (50 GB) を超えていることを意味します。このケースは稀です。クライアントリクエストボディのサイズを小さくすることを推奨します。
414 URI Too Long
リクエスト URI の長さが上限を超えているため、ALB またはバックエンドサーバーがリクエストを拒否します。
-
ALB の制限: ALB では、リクエスト URI は 32 KB 以下である必要があります。この長さを超えると、
414ステータスコードが返されます。URI を短くしてください。大量のデータを送信するには、POSTメソッドを使用してデータをリクエストボディに含めることができます。ALB は、最大 50 GB のPOSTリクエストボディに対応しています。 -
バックエンドサービスの制限: URI の長さが ALB の制限を超えていなくても、バックエンドサービスにさらに厳しい制限がある場合、ALB はバックエンドから返された
414ステータスコードをパススルーします。バックエンドサービスを調査してください。
463
463 ステータスコードは、リスナーが IP タイプのサーバーグループに関連付けられている場合にのみ返されます。
リクエストパスにループが存在します。リクエストが ALB を通過すると、システムは HTTP ヘッダー に ALICLOUD-ALB-TRACE フィールドを追加します。フィールド値は、ルール ID から生成された 16 文字のハッシュです。重複するルール ID が検出された場合、または ALICLOUD-ALB-TRACE フィールドの数が 16 を超えた場合、ALB はループを識別します。その後、ALB はネットワークストームを防ぐためにリクエストの転送を停止し、463 ステータスコードを返します。
-
バックエンドサービスの設定不備:バックエンドサービスの設定不備により、リクエストがループして ALB に戻されています。ALB のバックエンドサービス設定を確認してください。
-
ネットワークアーキテクチャの欠陥:たとえば、単一リクエストの転送パス上に複数の SLB インスタンスが存在するケースです。ネットワークアーキテクチャを最適化することを推奨します。
499 Client Closed Request
クライアントが接続をクローズしました。
-
クライアントと ALB 間のネットワーク品質の低下: TCP RTT が高いか、パケットロスなどの他のネットワーク問題が発生しています。アクセスログの
request_timeおよびtcpinfo_rttフィールドを確認するか、クライアントでネットワーク診断を実行することをお勧めします。 -
ALB インスタンスの帯域幅スロットリング:ALB インスタンスへの大量のトラフィックにより、帯域幅のスロットリングとパケットロスが発生しています。Cloud Monitor で
アウトバウンド帯域幅とドロップされた接続のメトリクスを確認してください。 -
バックエンド処理時間が長い:バックエンドの処理時間がクライアントのタイムアウト期間を超過しました。アクセスログの
upstream_response_timeフィールドを確認してください。このフィールドは、バックエンドの処理時間を示します。この値が一貫して高い場合は、バックエンド サービスのパフォーマンスのボトルネックを調査してください。 -
クライアントリクエストのタイムアウトが短すぎます: クライアントがリクエストの送信を完了する前にタイムアウトし、接続がクローズされました。アクセスログの
request_timeフィールドで合計リクエスト時間を確認します。この値を参考にして、より適切なクライアント側のリクエストタイムアウトを設定します。 -
クライアント側の不明な問題:クライアントがリクエスト完了前に接続をクローズします。早期に接続がクローズされる可能性のあるクライアントの挙動を調査してください。
500 Internal Server Error
バックエンドサーバーで内部エラーが発生し、リクエストを処理できませんでした。
-
バックエンドから直接 500 が返される: アクセスログを確認し、
upstream_statusが500の場合は、ALB がバックエンドからのステータスコードをパススルーした可能性があります。バックエンドサービスを調査してください。 -
バックエンドサーバーが予期せず接続をクローズした場合:バックエンドサーバーが完全な応答を送信する前に接続をクローズします。バックエンドサーバーでパケットキャプチャを実施し、予期しない接続クローズの原因を特定してください。
503 Service Temporarily Unavailable
サーバーが一時的に利用できません。通常は、トラフィックが上限を超えている、またはバックエンドサービスが利用できないことが原因です。
-
バックエンドが直接 503 を返す: アクセスログを確認してください。
upstream_statusが503の場合、ALB がバックエンドのステータスコードをパススルーした可能性が高いです。バックエンドサービスを調査してください。 -
クライアントリクエストが ALB のスロットリングをトリガーしている:
-
Cloud Monitor で、
Requests per secondメトリックを確認します。 -
Cloud Monitor は分単位のデータを表示するため、秒単位のスパイクが反映されない場合があります。アクセスログを確認してください。
upstream_statusフィールドが-の場合、リクエストはバックエンドサーバーに到達していません。 -
レスポンスパケットヘッダーを確認します。それに
ALB-QPS-Limited:Limitedフィールドが含まれている場合、リクエストが ALB スロットリングをトリガーしたことを示します。
-
-
IP アドレスへの直接アクセス、または DNS 名前解決の異常:これにより、少数の IP アドレスにトラフィックが集中し、スロットリングが発生する可能性があります。ドメイン名経由で ALB にアクセスし(「ALB インスタンスの CNAME の設定」 を参照)、DNS 名前解決が想定どおりに動作していることを確認してください。
-
リスナーにバックエンドサーバーが設定されていないか、設定されたバックエンドサーバーのウェイトが
0です。
ALB Ingress のデフォルト転送ルールによる 503 エラー
ACK クラスターに ALB Ingress コンポーネントをインストールすると、コンポーネントは ALB インスタンス配下にデフォルトの転送ルールと対応するサーバーグループを自動的に作成します。サーバーグループは初期状態では空です。
リクエストが ALB に到達したものの、設定済みのドメインベースの Ingress 転送ルールに一致しない場合、リクエストはこのデフォルト転送ルールにルーティングされます。デフォルトのサーバーグループが空であるため、ALB は転送先のバックエンドを持たず、503 Service Temporarily Unavailable エラーを返します。
これは想定どおりの動作であり、デフォルト転送ルールを手動で削除する必要はありません。問題を解決するには、ACK クラスターで正しいドメインベースの Ingress 転送ルールを設定し、業務トラフィックを対応するバックエンドサーバーグループにルーティングしてください。
不適切なワイルドカードパス設定による 503 エラー
ALB 転送ルールのパス一致タイプが [完全一致とワイルドカード] の場合、ワイルドカード文字 * は任意の長さの文字列に一致します。 パス /zhpt/* は、/zhpt/ で始まるパス (/zhpt/test など) には一致しますが、ベースパス /zhpt 自体は含みません。 したがって、ルールが /zhpt/* のみで設定されている場合、/zhpt へのリクエストはルールに一致せず、デフォルトの転送アクションにフォールスルーします。 デフォルトのサーバーグループが空の場合、ALB は 503 Service Temporarily Unavailable エラーを返します。 パス一致ルールの詳細については、「転送ルールの設定例とドメイン名およびパスの一致ルール」をご参照ください。
解決策:一致させたいパス範囲に応じて、次のいずれかを選択してください。
-
ベースパス
/zhptのみに一致させる必要がある場合は、ルールパスを/zhpt/*から/zhptに変更します。 -
ベースパス
/zhptとそのサブパス/zhpt/*の両方にマッチさせる必要がある場合は、2 つの個別の転送ルール (/zhptと/zhpt/*) を設定し、ルールの順序に注意してください。 -
より柔軟なパスマッチングが必要な場合は、一致タイプを [正規表現一致] に変更し、パスを正規表現として記述します (たとえば、
/zhptとそのサブパスの両方に一致させるには、^/zhpt(/.*)?$を使用します)。正規表現を^と$でアンカーすることで、/zhptxxxのような意図しない一致を回避できます。
504 Gateway Timeout
ALB がバックエンドサーバーからの応答待ちでタイムアウトしました。
-
バックエンドが 504 を直接返す: アクセスログを確認してください。
upstream_statusが504の場合、ALB がバックエンドのステータスコードをパススルーしたと考えられます。 バックエンドサービスを調査してください。 -
ALB からバックエンドサーバーへの接続試行がタイムアウトする: このタイムアウトはデフォルトで 5 秒であり、変更できません。パケットをキャプチャして、バックエンドサーバーが時間内に応答しない理由を特定してください。
-
バックエンドのレスポンスタイムアウト: 接続リクエストのタイムアウトは、デフォルトで 60 秒です。バックエンドサーバーのレスポンスがタイムアウトしたかどうかは、Cloud Monitor の
UpstreamResponseTimeメトリック、およびアクセスログのupstream_response_timeフィールドを確認することで判断できます。