Application Load Balancer のトラブルシューティング
以下の情報は、Application Load Balancer の問題のトラブルシューティングに役立ちます。
問題点
登録されたターゲットが実行中でない
ターゲットが InService
状態になるまでに予想以上に時間がかかっている場合、ヘルスチェックに合格していない可能性があります。ターゲットは、ヘルスチェックに合格するまで実行されません。詳細については、「ターゲットグループのヘルスチェック」を参照してください。
インスタンスがヘルスチェックに合格していないことを確認したら、以下の点を確認します。
- セキュリティグループでトラフィックが許可されていない
-
インスタンスに関連付けられたセキュリティグループでは、ヘルスチェックポートとヘルスチェックプロトコルを使用してロードバランサーからのトラフィックを許可する必要があります。インスタンスセキュリティグループにルールを追加して、ロードバランサーセキュリティグループからのすべてのトラフィックを許可できます。また、ロードバランサーのセキュリティグループは、インスタンスへのトラフィックを許可する必要があります。
- ネットワークアクセスコントロールリスト (ACL) ではトラフィックが許可されない
-
インスタンスのサブネットに関連付けられたネットワーク ACL では、ヘルスチェックポートでインバウンドトラフィックを許可し、一時ポート (1024-65535) でアウトバウンドトラフィックを許可する必要があります。ロードバランサーノードのサブネットに関連付けられたネットワーク ACL では、一時ポートでインバウンドトラフィックを許可し、ヘルスチェックおよび一時ポートでアウトバウンドトラフィックを許可する必要があります。
- ping パスが存在しない
-
ヘルスチェックのターゲットページを作成し、そのパスを ping パスとして指定します。
- 接続がタイムアウトする
-
最初に、ターゲットのプライベート IP アドレスとヘルスチェックプロトコルを使用して、ネットワーク内から直接ターゲットに接続できることを確認します。接続できない場合は、インスタンスの使用率が高すぎないかどうかを確認し、ビジー状態で応答できない場合はさらにターゲットをターゲットグループに追加します。接続できる場合、ヘルスチェックのタイムアウト時間の前に、ターゲットページが応答していない可能性があります。ヘルスチェック用のよりシンプルなターゲットページを選択するか、ヘルスチェックの設定を調整します。
- ターゲットが正常なレスポンスコードを返さなかった
-
デフォルトの成功コードは 200 ですが、ヘルスチェックを設定するときにオプションで成功コードを追加して指定できます。ロードバランサーで予期される成功コードを確認し、成功時にアプリケーションがそれらのコードを返すよう設定されていることを確認します。
クライアントがインターネット向けロードバランサーに接続できない
ロードバランサーがリクエストに応答しない場合は、以下の点を確認します。
- インターネット向けロードバランサーがプライベートサブネットにアタッチされている
-
ロードバランサーのパブリックサブネットを指定する必要があります。パブリックサブネットには Virtual Private Cloud (VPC) のインターネットゲートウェイへのルートがあります。
- セキュリティグループまたはネットワーク ACL でトラフィックが許可されていない
-
ロードバランサーのセキュリティグループ、およびロードバランサーサブネットのネットワーク ACL で、クライアントからのインバウンドトラフィックとクライアントへのアウトバウンドトラフィックをリスナーポートで許可する必要があります。
ロードバランサーが異常なターゲットにリクエストを送信する
ターゲットグループに少なくとも 1 つの正常なターゲットがある場合、ロードバランサーはその正常なターゲットにのみリクエストをルーティングします。ターゲットグループに異常なターゲットのみが含まれている場合、ロードバランサーはその異常なターゲット間でリクエストをルーティングします。
ロードバランサーは、レスポンスコード 000 を送信します。
HTTP/2 接続では、いずれかのヘッダーの圧縮された長さが 8K を超えると、ロードバランサーが GOAWAY フレームを送信し、TCP FIN を使用して接続を閉じます。
ロードバランサーが HTTP エラーを生成する
次の HTTP エラーは、ロードバランサーで生成されます。ロードバランサーはクライアントに HTTP コードを送信し、アクセスログにリクエストを保存して、HTTPCode_ELB_4XX_Count
または HTTPCode_ELB_5XX_Count
メトリクスを増やします。
エラー
- HTTP 400: Bad request
- HTTP 401: Unauthorized
- HTTP 403: Forbidden
- HTTP 405: Method not allowed
- HTTP 408: Request timeout
- HTTP 413: Payload too large
- HTTP 414: URI too long
- HTTP 460
- HTTP 463
- HTTP 500: Internal server error
- HTTP 501: Not implemented
- HTTP 502: Bad gateway
- HTTP 503: Service unavailable
- HTTP 504: Gateway timeout
- HTTP 561: Unauthorized
HTTP 400: Bad request
考えられる原因:
-
クライアントが HTTP 仕様を満たさない誤った形式のリクエストを送信した。
-
リクエストヘッダーが、リクエスト行あたり 16K、1 つのヘッダーあたり 16K、またはヘッダー全体に対して 64K を超えている。
HTTP 401: Unauthorized
ユーザーを認証するようリスナールールを設定しましたが、以下のいずれかが該当しません。
-
OnUnauthenticatedRequest
が認証されていないユーザーを拒否するように設定されているか、IdP によってアクセスが拒否されました。 -
ロードバランサーは、IdP トークンのエンドポイントまたは IdP ユーザー情報エンドポイントと通信できません。ロードバランサーのセキュリティグループおよび VPC のネットワーク ACL がこれらのエンドポイントに対するアウトバウンドアクセスを許可していることを検証します。VPC がインターネット接続されていることを確認します。内部向けロードバランサーがある場合は、NAT ゲートウェイを使用してインターネットアクセスを有効にします。
-
IdP によって返されるクレームのサイズが、ロードバランサーによってサポートされる最大サイズを超えています。
-
クライアントがホストヘッダーなしで HTTP/1.0 リクエストを送信し、ロードバランサーはリダイレクト URL を生成できませんでした。
-
クライアントが HTTP プロトコルなしでリクエストを送信し、ロードバランサーはリダイレクト URL を生成できませんでした。
-
リクエストされたスコープで ID トークンが返さません。
HTTP 403: Forbidden
Application Load Balancer へのリクエストをモニタリングするよう AWS WAF ウェブアクセスコントロールリスト (ウェブ ACL) を設定し、リクエストがブロックされました。
HTTP 405: Method not allowed
クライアントが、Application Load Balancer でサポートされていない TRACE メソッドを使用しました。
HTTP 408: Request timeout
アイドルタイムアウト期間の期限が切れる前に、クライアントからデータが送信されませんでした。TCP キープアライブを送信しても、このタイムアウトを防ぐことはできません。各アイドルタイムアウト期間が経過する前に、1 バイト以上のデータを送信します。必要に応じて、アイドルタイムアウト期間を長くします。
HTTP 413: Payload too large
ターゲットは Lambda 関数で、リクエストボディが 1 MB を超えています。
HTTP 414: URI too long
リクエストの URL またはクエリ文字列パラメータが大きすぎます。
HTTP 460
ロードバランサーはクライアントからリクエストを受信したが、クライアントはアイドルタイムアウトが経過する前に、ロードバランサーとの接続を閉じました。
クライアントのタイムアウト期間がロードバランサーのアイドルタイムアウト期間より長いかどうか確認してください。クライアントのタイムアウト期間が経過する前に、ターゲットがクライアントにレスポンスを返すことを確認するか、クライアントがサポートする場合は、クライアントのタイムアウト期間を増やしてロードバランサーのアイドルタイムアウトに合わせます。
HTTP 463
30 以上の IP アドレスを含む X-Forwarded-For リクエストヘッダーがロードバランサーに送信されました。
HTTP 500: Internal server error
AWS WAF のウェブアクセスコントロールリスト (ウェブ ACL) を設定し、ウェブ ACL ルールの実行でエラーが発生しました。
HTTP 501: Not implemented
サポートされていない値を含む Transfer-Encoding ヘッダーがロードバランサーに送信されました。Transfer-Encoding のサポートされていない値は、chunked
と identity
です。代わりに、Content-Encoding ヘッダーを使用することができます。
HTTP 502: Bad gateway
考えられる原因:
-
接続の確立を試みているときに、ロードバランサーがターゲットから TCP RST を受信した。
-
接続の確立を試みているときに、ロードバランサーがターゲットから予期しないレスポンスを受信した (例: 「ICMP Destination unreachable (Host unreachable) (ICMP 送信先に到達できません (ホストに到達できません))」など)。ターゲットポートでロードバランサーサブネットからターゲットへのトラフィックが許可されているかどうかを確認します。
-
ロードバランサーにターゲットへの未処理のリクエストがあるときに、ターゲットが TCP RST または TCP FIN との接続を閉じた。ターゲットのキープアライブ期間がロードバランサーのアイドルタイムアウト値よりも短いことを確認します。
-
ターゲットのレスポンス形式が正しくないか、有効でない HTTP ヘッダーが含まれている。
-
ロードバランサーがターゲットに接続するときに、SSL ハンドシェイクエラーまたは SSL ハンドシェイクタイムアウト (10 秒) が発生しました。
-
登録解除されたターゲットによって処理されていたリクエストで登録解除の遅延期間が経過しました。時間のかかるオペレーションが完了できるように、遅延期間を増やします。
-
ターゲットは Lambda 関数で、レスポンスボディが 1 MB を超えています。
-
ターゲットは、設定されたタイムアウトに達する前に応答しなかった Lambda 関数です。
HTTP 503: Service unavailable
ロードバランサーのターゲットグループに登録済みターゲットがありません。
HTTP 504: Gateway timeout
考えられる原因:
-
ロードバランサーは、接続タイムアウトが期限切れになる (10 秒) 前にターゲットへの接続の確立に失敗した。
-
ロードバランサーはターゲットへの接続を確立したが、アイドルタイムアウト期間が経過する前にターゲットが応答しなかった。
-
サブネットのネットワーク ACL で、ターゲットから一時ポート (1024-65535) のロードバランサーノードへのトラフィックが許可されなかった。
-
ターゲットがエンティティ本文より大きな Content-Length ヘッダーを返した。ロードバランサーが欠落しているバイトを待機してタイムアウトした。
-
ターゲットは Lambda 関数であり、接続タイムアウトが期限切れになる前に Lambda サービスが応答しませんでした。
HTTP 561: Unauthorized
リスナールールがユーザーを認証するように設定されていますが、IdP がユーザーの認証時にエラーコードを返しました。
ターゲットが HTTP エラーを生成する
ロードバランサーはターゲットからの有効な HTTP レスポンスを、HTTP エラーを含めてクライアントに転送します。ターゲットによって生成された HTTP エラーは、HTTPCode_Target_4XX_Count
および HTTPCode_Target_5XX_Count
メトリクスに記録されます。