Application Load Balancer (ALB) からの HTTP エラーを迅速に特定するには、ALB アクセスログを有効化します。status フィールドの ALB 状態コードと、アクセスログ内の upstream_status フィールドのアップストリーム状態コードが一致しているか確認してください。一致する場合、その状態コードはバックエンドサービスからそのまま渡されたものです。バックエンドサービスのトラブルシューティングを優先してください。
HTTP 400:不正なリクエスト
不正な形式のリクエストを示します。
バックエンドサーバーが直接 400 状態コードを返す:アクセスログを確認します。
upstream_statusフィールドの値が400の場合、ALB はバックエンドサーバーから受け取った状態コードをそのままクライアントに渡しています。バックエンドサービスをトラブルシューティングしてください。HTTP リクエストが HTTPS リスナーに送信される:ALB インスタンスの HTTPS リスナーは非 HTTPS リクエストを拒否し、
400状態コードを返します。クライアントが HTTPS ポートに HTTP リクエストを送信していないか確認してください。リクエストヘッダーのサイズが制限を超える:ALB では、各 HTTP リクエストヘッダーのサイズが 32 KB を超えてはなりません。この制限を超えた場合、ALB は
400状態コードを返します。リクエストヘッダーのサイズを小さくしてください。リクエストが完全に送信されない:HTTP リクエストが完全に送信される前にクライアントが接続を閉じました。クライアント側でパケットキャプチャを行い、早期切断の原因を特定してください。
リクエストヘッダーが不正な形式である:たとえば、
Content-Lengthヘッダーの値がリクエスト本文の実際のサイズと一致していません。クライアント側でパケットキャプチャを行い、HTTP リクエストのフォーマットを分析し、有効なリクエストと比較してください。
HTTP 405:メソッドが許可されていません
サポートされていないリクエストメソッドを示します。
ALB の制限:ALB は
TRACEリクエストメソッドをサポートしていません。別のメソッドを使用してください。バックエンドサービスの制限:
TRACEを除き、他のリクエストメソッドのサポートはバックエンドサーバーに依存します。確認するには、次のコマンドを実行してバックエンドサーバーに直接接続テストを行ってください:curl -X METHOD http://<Backend-Server-IP>:<Port>。ここでMETHODはクライアントが使用しているリクエストメソッドです。
HTTP 408:リクエストタイムアウト
リクエストがタイムアウトし、ALB が接続を閉じたことを示します。
クライアントからの遅いデータ送信: クライアントから ALB へのリクエストタイムアウト期間(デフォルトは 60 秒)内に、クライアントが部分的なデータのみを送信する場合があります。たとえば、
Request Headerは送信されるが、Request Bodyは送信されないといった状況です。パフォーマンスボトルネックやその他のエラーを確認するために、クライアントでパケットをキャプチャします。クライアントと ALB 間のネットワーク品質が不良:TCP 往復時間(RTT)が長いか、ネットワーク上でパケット損失が発生しています。アクセスログの
request_timeフィールドおよびtcpinfo_rttフィールドを確認するか、クライアント側でネットワーク診断を実行してください。ALB インスタンスでの帯域幅速度制限:ALB インスタンスへのトラフィックが帯域幅制限を超え、速度制限とパケット損失が発生しています。CloudMonitor を使用して、
アウトバウンド帯域幅およびDropped Connectionsメトリックを確認してください。
HTTP 414:URI が長すぎます
リクエスト URI が長すぎて、ALB またはバックエンドサーバーによって拒否されたことを示します。
ALB の制限:ALB ではリクエスト URI の長さが 32 KB を超えてはなりません。この制限を超えた場合、ALB は
414状態コードを返します。URI を短縮してください。大量のデータを転送する必要がある場合は、POSTメソッドを使用し、データをリクエスト本文に配置します。ALB は最大 50 GB のPOSTリクエスト本文をサポートしています。バックエンドサービスの制限:URI は ALB の制限を超えていませんが、バックエンドサービスに設定されたより厳しい制限を超えています。このシナリオでは、ALB はバックエンドサーバーから返された
414状態コードをそのまま渡します。バックエンドサービスをトラブルシューティングしてください。
HTTP 463:リクエストループを検出
このカスタム状態コードは、リクエストパス内で転送ループが検出されたことを示します。リクエストを転送する際、ALB は リクエストヘッダー に ALICLOUD-ALB-TRACE フィールドを追加します。このフィールドの値は、転送ルール ID から生成された 16 文字のハッシュです。重複するルール ID が見つかるか、ALICLOUD-ALB-TRACE フィールドの数が 16 を超えると、ALB はループを検出します。ループが検出されると、ネットワークストームによるリソース枯渇を防ぐため、ALB はリクエストの転送を停止し、463 状態コードを返します。
バックエンドサービスの誤った構成:バックエンドサービスの誤った構成により、リクエストが同じ ALB インスタンスに再びルーティングされ、ループが発生しています。ALB インスタンス用のバックエンドサービス構成を確認・修正してください。
ネットワークアーキテクチャ設計の欠陥:たとえば、単一のリクエストパスに複数のロードバランサーインスタンスが関与しています。ネットワークアーキテクチャを最適化してください。
HTTP 499:クライアントがリクエストを閉じました
この非標準の状態コードは、サーバーが応答する前にクライアントが接続を閉じたことを示します。
クライアントと ALB 間のネットワーク品質が不良:TCP 往復時間(RTT)が長いか、ネットワーク上でパケット損失が発生しています。アクセスログの
request_timeフィールドおよびtcpinfo_rttフィールドを確認するか、クライアント側でネットワーク診断を実行してください。ALB インスタンスでの帯域幅速度制限:ALB インスタンスへのトラフィックが帯域幅制限を超え、速度制限とパケット損失が発生しています。CloudMonitor を使用して、
アウトバウンド帯域幅およびDropped Connectionsメトリックを確認してください。バックエンドサービスのリクエスト処理に時間がかかりすぎる:バックエンドサービスの処理時間がクライアントのタイムアウト設定を超えています。アクセスログの
upstream_response_timeフィールド(バックエンドサービスのリクエスト処理時間を記録)を確認してください。この値が常に高い場合は、バックエンドサービスにパフォーマンスボトルネックがないか調査してください。クライアントのリクエストタイムアウトが短すぎる:リクエストが完了する前にタイムアウトによりクライアントが接続を閉じています。アクセスログの
request_timeフィールド(クライアントリクエストの合計持続時間を表す)を確認し、この値を参考にしてクライアント側のタイムアウトをより適切な値に設定してください。クライアントに不明な問題が発生:リクエストが完了する前にクライアントが意図せず接続を早期に閉じています。クライアントの動作を調査し、意図的に接続を早期に閉じているかどうかを確認してください。
HTTP 500:内部サーバーエラー
バックエンドサーバーで内部エラーが発生し、リクエストを処理できなかったことを示します。
バックエンドサーバーが直接 500 状態コードを返す:アクセスログを確認します。
upstream_statusフィールドが500の場合、ALB はバックエンドサーバーから受け取った状態コードをそのままクライアントに渡しています。バックエンドサービスをトラブルシューティングしてください。バックエンドサーバーが予期せず接続を閉じる:バックエンドサーバーが完全な応答を送信する前に予期せず接続を閉じました。バックエンドサーバー側でパケットキャプチャを行い、予期しない接続切断の原因を調査してください。
HTTP 502:不正なゲートウェイ
このエラーは、HTTP または HTTPS リスナーがリクエストを受信したものの、ALB がそれをバックエンドサーバーに転送できない、またはバックエンドサーバーからの応答を受信できない場合に発生します。
バックエンドサーバーが直接 502 状態コードを返す:アクセスログを確認します。
upstream_statusフィールドが502の場合、ALB はバックエンドサーバーから受け取った状態コードをそのままクライアントに渡しています。バックエンドサービスをトラブルシューティングしてください。バックエンドサーバーが異なるエラーコードを返す:たとえば、バックエンドサーバーが
504または444状態コードを返しているにもかかわらず、ALB がクライアントに502状態コードを返しています。アクセスログのstatusフィールドとupstream_statusフィールドを比較し、バックエンドサーバーが実際に返した状態コードに基づいて問題をトラブルシューティングしてください。ALB とバックエンドサーバー間の TCP 通信エラー:バックエンドサービスが実行中であること、サービスポートが正しくリッスンしていること、TCP ハンドシェイクが成功することを確認してください。パケットキャプチャを使用して TCP ハンドシェイクを分析できます。
バックエンドサーバーのバックログキューがいっぱいになり、新しい接続リクエストが拒否または破棄されています。バックエンドサーバーでコマンド
netstat -s | grep -i listenを実行し、増加しているdropカウンターを確認してください。リクエストパケットサイズがバックエンドサーバーの MTU を超える:これは、ヘルスチェックなどの小さいパケットは正常に配信されるが、大きなデータパケットが失敗するという形で現れる可能性があります。バックエンドサーバー側でパケットキャプチャを行い、パケット長が必要な制限内にあるかどうかを分析してください。
バックエンドサーバーの応答が不正な形式である、または無効な HTTP ヘッダーを含む:バックエンドサーバー側でパケットキャプチャを行い、応答パケットのフォーマットが有効かどうかを分析してください。
バックエンドサーバーがリクエストをタイムリーに処理しなかった:バックエンドサーバーのログを確認し、CPU およびメモリ使用率をモニターしてください。
HTTP 503:サービスは一時的に利用できません
このエラーは、サーバーが一時的に利用できないことを示します。多くの場合、トラフィックが制限を超えたか、バックエンドサービスが利用できないことが原因です。
バックエンドサーバーが直接 503 状態コードを返す:アクセスログを確認します。
upstream_statusフィールドが503の場合、ALB はバックエンドサーバーから受け取った状態コードをそのままクライアントに渡しています。バックエンドサービスをトラブルシューティングしてください。クライアントのリクエストレートが ALB の速度制限をトリガー:
CloudMonitor の
Requests per secondメトリックを確認してください。CloudMonitorは 1 分単位の粒度でデータを表示するため、秒単位のレート制限を検出できない場合があります。アクセスログを確認してください。upstream_statusフィールドの値が-の場合、リクエストはバックエンドサーバーに送信されていません。応答パケットヘッダーを確認してください。
ALB-QPS-Limited:Limitedフィールドが含まれている場合、そのリクエストは ALB インスタンスの速度制限をトリガーしています。
クライアントが ALB IP に直接アクセスしている、または DNS 解決に失敗している:これにより、トラフィックが少数の IP アドレスに集中し、それらの制限を超えてしまう可能性があります。クライアントは ALB インスタンスにドメイン名経由でアクセスする必要があります。詳細については、「ALB インスタンスの CNAME レコードの設定」をご参照ください。CNAME 解決が正しく機能していることを確認してください。
リスナーにバックエンドサーバーが設定されていない、または設定されているすべてのバックエンドサーバーの重みが
0です。
HTTP 504:ゲートウェイタイムアウト
バックエンドサーバーがタイムアウト期間内に応答しなかったことを示します。
バックエンドサーバーが直接 504 状態コードを返す:アクセスログを確認します。
upstream_statusフィールドが504の場合、ALB はバックエンドサーバーから受け取った状態コードをそのままクライアントに渡しています。バックエンドサービスをトラブルシューティングしてください。ALB からバックエンドサーバーへの接続試行がタイムアウト:接続確立のタイムアウトは 5 秒で、変更できません。バックエンドサーバーが 5 秒のタイムアウト内に接続試行に応答しない理由を調査するために、パケットキャプチャを実行してください。
バックエンドサーバーの応答がタイムアウト:接続リクエストタイムアウト のデフォルト値は 60 秒です。CloudMonitor の
UpstreamResponseTimeメトリックおよびアクセスログのupstream_response_timeフィールドを確認し、バックエンドサーバーの応答がタイムアウトしたかどうかを判断してください。