431 リクエスト ヘッダー フィールドが大きすぎる - TooBigHeaders

Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動します。
情報

症状

クライアント アプリケーションが、API 呼び出しに対するレスポンスとして、エラーコード protocol.http.TooBigHeaders 付きの HTTP ステータス コード 431 Request Header Fields Too Large を受け取ります。

エラー メッセージ

クライアント アプリケーションは、次のレスポンス コードを受け取ります。

HTTP/1.1 431 Request Header Fields Too Large

さらに、次のエラー メッセージも確認できます。

{
   "fault":{
      "faultstring":"request headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

考えられる原因

このエラーは、HTTP リクエストの一部としてクライアント アプリケーションから Apigee Edge に送信されたすべてのリクエスト ヘッダーの合計サイズが、 RFC 6585 のセクション 5: 431 Request Header Fields Too Large に準拠した Apigee Edge で許可されている上限を超えている場合に発生します。

このエラーの原因として、次のことが考えられます。

原因 説明 トラブルシューティングの実施対象
リクエスト ヘッダーのサイズが上限を超えている Apigee Edge への HTTP リクエストの一部としてクライアント アプリケーションによって送信されるすべてのヘッダーの合計サイズが、Apigee Edge で許可されている上限を超えている。 Edge Public Cloud と Private Cloud のユーザー

共通の診断手順

次のいずれかのツールまたは手法を使用して、このエラーを診断します。

API Monitoring

API Monitoring を使用してエラーを診断するには:

  1. 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
  2. 問題の調査対象となる組織に切り替えます。

  3. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した特定の期間を選択します。
  5. 障害コードと時間をプロットします。
  6. 次の図に示すように、障害コード protocol.http.TooBigHeaders とステータス コード 431 を含むセルを選択します。

    ( 大きい画像を表示)

  7. 以下のように、障害コード protocol.http.TooBigHeaders に関する情報が表示されます。

    ( 大きい画像を表示)

  8. [ログを表示] をクリックし、失敗したリクエストの行を開きます。

    ( 大きい画像を表示)

  9. [ログ] ウィンドウで、次の詳細を確認します。

    • ステータス コード: 431
    • 障害の原因: apigee
    • 障害コード: protocol.http.TooBigHeaders。
    • リクエストの長さ(バイト): 32150 (> 25 KB)
  10. Fault Source の値が apigee または MP で、Fault Code の値が protocol.http.TooBigHeaders で、Request Length が 25 KB を超えている場合、HTTP リクエストの一部としてクライアント アプリケーションによって送信されるすべてのリクエスト ヘッダーの合計サイズが、 Apigee で許可されている上限を超えていることを示します。

Trace ツール

NGINX

NGINX アクセスログを使用してエラーを診断するには:

  1. Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP 431 エラーに関する重要な情報を特定できます。
  2. NGINX アクセスログを確認します。

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    説明: ORG、ENV、PORT# は実際の値に置き換えられます。

  3. 特定の期間に 431 エラーが発生したかどうか(問題が過去に発生した場合)、または 431 で失敗したリクエストがまだあるかどうかを検索します。
  4. X-Apigee-fault-code が protocol.http.TooBigHeaders の値と一致する 431 エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。

    上記の NGINX アクセスログのサンプル エントリには、X-Apigee-fault-code と X-Apigee-fault-source に次の値が設定されています。

    レスポンス ヘッダー 値
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source MP

    リクエストの長さに注意: 40159(40 KB は 25 KB より大きいため、Apigee Edge のリクエスト ヘッダーで許可されている上限を超えています)

    上記のログエントリの例では、X-Apigee-fault-source の値は apigee または MP、X-Apigee-fault-code の値は protocol.http.TooBigHeaders、リクエストの長さは 40 KB で、Apigee で許可されている上限(25 KB)を超えています。これは、HTTP リクエストの一部としてクライアント アプリケーションによって送信されたすべてのリクエスト ヘッダーの合計サイズが、Apigee Edge で許可されている上限の 25 KB を超えていることを明確に示しています。

原因: リクエスト ヘッダーのサイズが許容上限を超えている

診断

  1. 一般的な診断手順で説明したように、API Monitoring または NGINX アクセスログを使用して、観測されたエラーの Fault Code、Fault Source、Request-Length size を特定します。
  2. Fault Source の値が apigee または MP、Fault Code の値が protocol.http.TooBigHeaders、Request Length が 25 KB を超えている場合、これは、クライアント アプリケーションから Apigee に送信されたリクエスト サイズが Apigee Edge で許可されている上限を超えていることを示します。
  3. リクエスト ヘッダーのサイズが許容上限の 25 KB を超えたことを確認するには、次のいずれかの方法を使用します。

    エラー メッセージ

    エラー メッセージを使用して検証するには:

    Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、faultstring を参照してください。faultstring は、リクエスト ヘッダーの合計サイズが 25 KB の上限を超えていることを示します。

    エラー メッセージの例:

    "faultstring":"request headers size exceeding 25,600"

    実際のリクエスト

    実際のリクエストを使用して検証するには:

    クライアント アプリケーションによって行われた実際のリクエストにアクセスできる場合は、次の手順を行います。

    1. リクエストで渡されたヘッダーのサイズを確認します。
    2. ヘッダーの合計サイズが Apigee Edge で許可されている上限を超えている場合は、それが問題の原因です。

      リクエストの例:

      curl -v https://HOSTALIAS/test -H "header0: 000000000000000000……..000000<trimmed>" -H "header1: 111111111111111111……..111111<trimmed>" -H "header2: 222222222222222222……..222222<trimmed>"-H "header3: 333333333333333333……..333333<trimmed>"
      

      上記の例では、ヘッダー header0、header1、header2、header3 の合計サイズが 25 KB を超えています。つまり、25 K を超える ASCII 文字(バイト)が含まれています。

      他のクライアントを使用している場合は、クライアント ログを確認して、Apigee Edge に送信されているリクエスト行のサイズを特定してください。

    Message Processor ログ

    Message Processor のログを使用して検証するには:

    Private Cloud ユーザーは、Message Processor ログを使用して、リクエスト ヘッダーのサイズが Apigee Edge で許可されている上限を超えていないかどうかを確認できます。

    1. Message Processor のログを確認します。

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. 特定の期間に 431 エラーが発生したかどうか(問題が過去に発生した場合)、または 431 で失敗したリクエストがまだあるかどうかを検索します。次の検索文字列を使用できます。
      grep -ri "exceeding"
      
      grep -ri "RequestHeadersTooLarge"
      
    3. system.log から次のような行が見つかります。
      2021-07-27 08:30:28,419  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() :
      Request:GET, uri:/test/, message Id:null,
      exception:com.apigee.errors.http.user.RequestHeadersTooLarge{
      code = protocol.http.TooBigHeaders, message = request headers size
      exceeding 25,600, associated contexts = []}, context:Context@9c5903
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.205.251:8443 Local:192.168.67.23:22188]@25130
      useCount=1 bytesRead=0 bytesWritten=15367 age=667062ms  lastIO=0ms
      isOpen=true)

      上記のエラー メッセージのテキスト message = request headers size exceeding 25,600 は、リクエスト ヘッダーの合計サイズが 25 KB を超えていることを示しています。そのため、Apigee Edge は例外 com.apigee.errors.http.user.RequestHeadersTooLarge をスローし、障害コード protocol.http.TooBigHeaders を含む 431 ステータス コードをクライアント アプリケーションに返します。

解決策

サイズを固定

オプション 1 [推奨]: 許可されている上限を超える合計サイズのリクエスト ヘッダーを送信しないようにクライアント アプリケーションを修正する

  1. 上限で定義されているように、特定のクライアントがリクエスト ヘッダーを送信する理由を分析します。このリクエスト ヘッダーのサイズが大きいため、ヘッダーの合計サイズが許容上限を超えています。
  2. 望ましくない場合は、許可されている上限よりも小さいサイズのリクエスト ヘッダーを送信するようにクライアント アプリケーションを変更します。

    上記の例では、リクエストの本文/ペイロードの一部として長いヘッダー値パラメータを渡すことで、問題を解決できます。

    curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
    
  3. 望ましい場合で、許可された上限を超えてヘッダーを送信する場合は、次のオプションに進みます。

CwC

オプション 2 : CwC プロパティを使用してリクエスト行の上限を引き上げる

Apigee には、リクエスト ラインのサイズ上限を引き上げることができる CwC プロパティが用意されています。詳細については、 Message Processor のリクエスト行の制限を設定するをご覧ください。

上限

Apigee は、クライアント アプリケーションとバックエンド サーバーが、Apigee Edge の上限でリクエスト/レスポンス ヘッダー サイズの上限として記載されている上限を超えるリクエスト/レスポンス ヘッダーを送信しないことを想定しています。

  1. パブリック クラウド ユーザーの場合、リクエスト ヘッダーとレスポンス ヘッダーの最大サイズは、Apigee Edge の上限のリクエスト ヘッダーとレスポンス ヘッダーのサイズに記載されているとおりです。
  2. Private Cloud ユーザーの場合、 リクエスト ヘッダーとレスポンス ヘッダーのサイズのデフォルトの最大制限を変更している可能性があります(推奨される方法ではありません)。最大リクエスト ヘッダー サイズの上限は、現在の上限を確認する方法の手順に沿って確認できます。

現在の制限を確認する方法

このセクションでは、Message Processor でプロパティ HTTPRequest.headers.limit が新しい値で更新されたことを確認する方法について説明します。

  1. Message Processor マシンで、/opt/apigee/edge-message-processor/conf ディレクトリの HTTPRequest.headers.limit プロパティを検索し、次のように設定されている値を確認します。
    grep -ri "HTTPRequest.headers.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上記のコマンドの出力例は次のとおりです。
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.headers.limit=25k
  3. 上記の出力例では、HTTPRequest.headers.limit プロパティが http.properties の値 25k で設定されています。

    これは、Apigee for Private Cloud で構成されたリクエスト ヘッダーのサイズの上限が 25 KB であることを示します。

仕様

Apigee Edge は、クライアント アプリケーションがリクエストの一部としてサイズの大きいヘッダーを送信しないことを想定しています。リクエストに指定された上限を超えるサイズのヘッダーが含まれている場合、Apigee は次の RFC 仕様に従って 431 Request Header Fields Too Large をスローします。

仕様
RFC 6585、セクション 5: 431 Request Header Fields Too Large

Apigee サポートのサポートが必要な場合は、診断情報の収集が必要な場合をご覧ください。

診断情報の収集が必要な場合

次の診断情報を収集して、Apigee Edge サポートにお問い合わせください。

Public Cloud ユーザーの場合は、次の情報を提供してください。

  • 組織名
  • 環境名
  • API プロキシ名
  • 431 エラーを再現するために使用される完全な curl コマンド
  • API リクエストのトレース ファイル

Private Cloud ユーザーの場合は、次の情報を提供してください。

  • 失敗したリクエストで確認されたエラー メッセージの全文
  • 組織名
  • 環境名
  • API プロキシ バンドル
  • 失敗した API リクエストのトレース ファイル
  • 431 エラーを再現するために使用される完全な curl コマンド
  • NGINX アクセスログ /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    説明: ORG、ENV、PORT# は実際の値に置き換えます。

  • Message Processor のシステムログ /opt/apigee/var/log/edge-message-processor/logs/system.log