<ph type="x-smartling-placeholder"></ph>
現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント。 詳細
症状
クライアント アプリケーションが HTTP ステータス コード 413 Request Entity Too Large を取得します。
API 呼び出しのレスポンスとしてエラーコード protocol.http.TooBigBody が返されます。
エラー メッセージ
クライアント アプリケーションが次のレスポンス コードを受け取ります。
HTTP/1.1 413 Request Entity Too Large
また、次のエラー メッセージが表示される場合があります。
{
"fault":{
"faultstring":"Body buffer overflow",
"detail":{
"errorcode":"protocol.http.TooBigBody"
}
}
}考えられる原因
このエラーは、サービス アカウントの一部としてクライアント アプリケーションから Apigee Edge に送信されたペイロード サイズが HTTP リクエストが Apigee Edge で許可されている上限を超えています。
このエラーには、次の原因が考えられます。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| リクエストのペイロード サイズが上限を超えている | クライアント アプリケーションから Apigee Edge への HTTP リクエストの一部として送信されるペイロード サイズは、 Apigee Edge で許可されている上限を超えています。 | Edge Public Cloud ユーザーと Edge Private Cloud ユーザー |
| 終了後にリクエストのペイロード サイズが上限を超えた場合 解凍 | HTTP の一部としてクライアント アプリケーションによって圧縮形式で送信されたペイロード サイズ Apigee Edge への解凍時に許容される上限を超えています。 | Edge Public Cloud ユーザーと Edge Private Cloud ユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
<ph type="x-smartling-placeholder">API Monitoring を使用してエラーを診断するには:
- <ph type="x-smartling-placeholder"></ph> Apigee Edge UI にログインするユーザーとして、 付与します。
問題を調査する組織に切り替えます
- [Analyze] >API モニタリング >Investigate ページをご覧ください。
- エラーが発生した期間を選択します。
- [Proxy] フィルタを選択して、障害コードを絞り込むことができます。
- 障害コードを Time に対してプロットします。
障害コードが
protocol.http.TooBigBodyのセルを選択し、 Status Code413:
障害コード
protocol.http.TooBigBodyに関する情報が次のように表示されます。 下に示します。
- [ログを表示] をクリックし、失敗したリクエストの行を開きます。次に、
[Logs] ウィンドウが表示されたら、次の詳細情報をメモします。
非圧縮
シナリオ #1: リクエスト ペイロードが圧縮されていない形式で送信される
[ログ] ウィンドウで、次の情報をメモします。
- ステータス コード:
413 - 障害の発生元:
proxy - 障害コード:
protocol.http.TooBigBody - リクエストの長さ(バイト):
15360440(約 15 MB)
Fault Source の値が
proxyの場合、Fault Code 値はprotocol.http.TooBigBody、Request Length には が 10 MB を超えている場合は、クライアントからの HTTP リクエストに リクエストのペイロード サイズが、Apigee で許可されている上限よりも大きい。圧縮
シナリオ #2: リクエスト ペイロードが圧縮形式で送信される
[ログ] ウィンドウで、次の詳細をメモします。
- ステータス コード:
413 - 障害の発生元:
proxy - 障害コード:
protocol.http.TooBigBody - リクエストの長さ(バイト):
15264(~ 15 KB)
Fault Source の値が
proxyの場合、Fault Code 値はprotocol.http.TooBigBodyで、Request Length は 10 MB 未満である場合、クライアントからの HTTP リクエストに リクエスト ペイロードのサイズが、圧縮形式で許容される上限を下回っているものの、 Apigee で圧縮されていないときのペイロード サイズが、許容される上限を超えている。 - ステータス コード:
トレース
<ph type="x-smartling-placeholder">Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にし、以下のいずれかを行います。
<ph type="x-smartling-placeholder">
- </ph>
413 Request Entity Too Largeエラーが発生するのを待つ、または- 問題を再現できる場合は、API 呼び出しを行い、
413 Request Entity Too Large件のエラー
[Show all Flow Infos] が有効になっていることを確認します。
- 失敗したリクエストのいずれかを選択し、トレースを調べます。
- フェーズ「Request Received from Client」に進みます。
非圧縮
シナリオ #1: リクエスト ペイロードが圧縮されていない形式で送信される
次の点に注意してください。
- Content-Encoding: なし
- コンテンツの長さ:
15360204
圧縮
シナリオ #2: リクエスト ペイロードが圧縮形式で送信される
次の点に注意してください。
- Content-Encoding:
gzip - コンテンツの長さ:
14969 - コンテンツ タイプ:
application/x-gzip
- トレースのさまざまなフェーズを移動して、エラーが発生した場所を特定します。
このエラーは通常、[Request Received from クライアント フェーズを以下に示します。
- トレースのエラーの値をメモします。上記のサンプル トレースから、次のことがわかります。
<ph type="x-smartling-placeholder">
- </ph>
- エラー:
Body buffer overflow - error.class:
com.apigee.errors.http.user.RequestTooLarge
- エラー:
[Response Sent to Client] に移動し、 表示されます。以下のトレース例が表示されます。
- エラー:
413 Request Entity Too Large - エラーの内容:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- エラー:
- トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。
[Phase Details] セクションで、[Variables Read] までスクロールします。
- 変数 client.received.content.length の値を確認します。
<ph type="x-smartling-placeholder">
- </ph>
- 非圧縮形式で送信された場合のリクエスト ペイロードの実際のサイズ。
- Apigee による解凍時のリクエスト ペイロードのサイズ(ペイロードが 圧縮して送信します。この値は常に許可される 上限(10 MB)です。
非圧縮
シナリオ #1: 非圧縮形式のペイロードをリクエストする
client.received.content.length 変数:
15360204圧縮
シナリオ #2: 圧縮形式のペイロードをリクエストする
client.received.content.length 変数:
10489856 - 次の表に、Apigee で
413エラーが返される理由をまとめます。 client.received.content.length 変数の値に基づいて、次の 2 つのシナリオがあります。シナリオ client.received.content.length の値 失敗の理由 非圧縮形式のリクエスト ペイロード ~ 15 MB サイズ >上限は 10 MB です。 圧縮形式のリクエスト ペイロード ~ 10 MB 解凍時にサイズ上限を超過
<ph type="x-smartling-placeholder">
NGINX
<ph type="x-smartling-placeholder">NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、
HTTP
413エラーに関する重要な情報。 NGINX アクセスログを確認します。
<ph type="x-smartling-placeholder">/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- 特定の期間に
413エラーがないかどうかを確認(例: 過去に発生したことがある)か、引き続き Cloud Logging によって413。 - X-Apigee-fault-code が一致する
413エラーがある場合protocol.http.TooBigBodyの値を取得してから、 X-Apigee-fault-source.非圧縮
シナリオ #1 : 非圧縮形式のリクエストのペイロード サイズ
NGINX アクセスログの上記のサンプル エントリでは、X-Apigee-fault-code と X-Apigee-fault-code の値が次のようになっています。
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.TooBigBodyX-Apigee-fault-sourc policyリクエストの長さ:
15360440(14.6 MB > 上限)に注意してください。圧縮
シナリオ 2 : 圧縮形式のリクエストのペイロード サイズ
NGINX アクセスログの上記のサンプル エントリには、次の値が含まれます。 X-Apigee-fault-code と X-Apigee-fault-code
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.TooBigBodyX-Apigee-fault-source policy[Request Length](リクエストの長さ)に注意してください。
15264(14.9 K < 上限)このシナリオでは、Apigee Edge が
413を返していても、 [リクエストの長さ] が上限を下回っています。リクエストには、 圧縮形式で送信され、ペイロードのサイズが Apigee Edge による解凍で制限されます。
原因: リクエストのペイロード サイズが上限を超えている
診断
- [Fault Code]、[Fault Source]、[Request Payload Size] の値を確認します。 API Monitoring、Trace Tool、または NGINX アクセスログを使用して確認されたエラー シナリオ 1(非圧縮)の一般的な診断手順
- [Fault Source] の値が
policyまたはproxyの場合、 クライアント アプリケーションから Apigee に送信されるリクエスト ペイロード サイズが Apigee Edge で許可されている上限。 - ステップ 1 で決定したリクエストのペイロード サイズを確認します。
- ペイロード サイズが >上限の 10 MB である場合、これがエラーの原因です。
- ペイロード サイズが上限が 10 MB である場合、そのリクエストは 圧縮された形式で渡されます。<ph type="x-smartling-placeholder"></ph> 原因: 解凍後にリクエストのペイロード サイズが上限を超えている
- リクエスト ペイロードのサイズが本当に大きいか検証することもできます。上限 10 MB
次の手順に沿って実際のリクエストを確認します。
<ph type="x-smartling-placeholder">
- </ph>
- クライアント アプリケーションから行われた実際のリクエストにアクセスできない場合は、 解決策。
- クライアント アプリケーションから行われた実際のリクエストにアクセスできる場合は、
手順は次のとおりです。
<ph type="x-smartling-placeholder">
- </ph>
- リクエストで渡されたペイロードのサイズを確認します。
- ペイロードのサイズが Apigee Edge で許容される上限である場合、それが問題の原因になります。
リクエストの例:
curl http://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile -v
上記の場合、ファイル
test15mbfileのサイズは約 15 MB です。もし 他のクライアントを使用している場合は、クライアント ログを取得して、送信されたペイロード サイズを確認します。
解決策
解決策に進みます。
原因: 解凍後にリクエストのペイロード サイズが上限を超えている
リクエスト ペイロードが圧縮形式で送信され、リクエスト ヘッダーが
Content-Encoding が gzip, に設定されている。Apigee がリクエストを解凍
記述できます。解凍プロセス中に、Apigee によってペイロードのサイズが大きくなると
10 MB 未満、
<ph type="x-smartling-placeholder"></ph>
上限に到達したら、それ以上の解凍を停止して、レスポンスを返します。
413 Request Entity Too Large(エラーコードあり)で即座に
protocol.http.TooBigBody。
診断
- 障害コード、障害ソース、リクエスト ペイロードのサイズを確認します。 API Monitoring、Trace Tool、または NGINX Access のログを使用して、 シナリオ 2(圧縮)の一般的な診断手順
- [Fault Source] の値が
policyまたはproxyの場合: これは、クライアント アプリケーションから Apigee に送信されるリクエスト ペイロード サイズが大きいことを示します。 Apigee Edge で許可されている上限を超えています。 - ステップ 1 で特定した Request Payload Size を確認します。
- ペイロード サイズが >上限の 10 MB である場合、これがエラーの原因です。
- ペイロード サイズが上限が 10 MB である場合、そのリクエストは 圧縮された形式で渡されます。この場合は、Cloud Storage バケットの非圧縮サイズを 圧縮されたリクエスト ペイロードが渡されます。
- クライアントからのリクエストが圧縮形式で送信されたかどうかと、
次のいずれかの方法を使用して、非圧縮サイズが上限を超えています
メソッド:
トレース
Trace ツールを使用して検証するには:
- 失敗したリクエストのトレースをキャプチャした場合は、
Traceと
<ph type="x-smartling-placeholder">
- </ph>
- client.received.content.length 変数の値を確認します。
- クライアントからのリクエストに Content-Encoding:
gzipヘッダー
- client.received.content.length 変数の値が
10 MB、
<ph type="x-smartling-placeholder"></ph>
、リクエスト ヘッダー Content-Encoding:
gzip、 場合、それがこのエラーの原因です。
実際のリクエスト
実際のリクエストを使用して検証するには:
- クライアント アプリケーションから行われた実際のリクエストにアクセスできない場合は、 解決策。
- クライアント アプリケーションから行われた実際のリクエストにアクセスできる場合は、
手順は次のとおりです。
<ph type="x-smartling-placeholder">
- </ph>
- リクエストで渡されるペイロードのサイズと、
リクエストで送信された
Content-Encodingヘッダー。 ペイロードの非圧縮サイズが Apigee Edge で許可される上限
リクエストの例:
curl https://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile.gz -H "Content-Encoding: gzip" -v
上記の場合、ファイル
test15mbfile.gzはサイズの上限未満です。 ただし、非圧縮ファイルtest15mbfileのサイズは約 15 MB で、Content-Encodingヘッダーがgzipである。他のクライアントを使用している場合は、クライアント ログを取得してペイロード サイズを確認します。
Content-Encodingヘッダーがgzipに設定されているかどうか。
- リクエストで渡されるペイロードのサイズと、
リクエストで送信された
Message Processor のログ
Message Processor ログを使用して検証するには:
<ph type="x-smartling-placeholder">- Private Cloud ユーザーの場合は、Message Processor のログを使用して、
HTTP
413エラーに関する重要な情報。 Message Processor のログを確認します。
/opt/apigee/var/log/edge-message-processor/logs/system.log特定の期間に
413エラーがないかどうかを確認( 過去に発生した問題)または413でまだ失敗しているリクエストがあるかどうか。次の検索文字列を使用できます。
grep -ri "chunkCount"
grep -ri "RequestTooLarge"
system.logから次のような行が表示されます。 (TotalReadとchunkCountはケースによって異なる場合があります):2021-07-06 13:29:57,544 NIOThread@1 ERROR HTTP.SERVICE - TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large. TotalRead 10489856 chunkCount 2570 2021-07-06 13:29:57,545 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: com.apigee.errors.http.user.RequestTooLarge : Body buffer overflow
- 解凍処理中に Message Processor によって合計サイズが決まって
読み取りバイト数が >10 MB を超えると、停止し、次の行が出力されます。
Message is too large. TotalRead 10489856 chunkCount 2570
これは、[Request Payload Size] が 10 MB を超えていることを意味しており、Apigee がスローします。 サイズが上限の 10 MB を超え始めたときのエラー
<ph type="x-smartling-placeholder">RequestTooLarge(障害コード:protocol.http.TooBigBody)
- 失敗したリクエストのトレースをキャプチャした場合は、
Traceと
<ph type="x-smartling-placeholder">
解決策
<ph type="x-smartling-placeholder">サイズを修正
オプション 1 [推奨]: 上限
<ph type="x-smartling-placeholder">をご覧ください。 <ph type="x-smartling-placeholder">- </ph>
- 特定のクライアントが、許容を超えるリクエスト / ペイロード サイズを送信する理由を分析する 制限で定義されているとおりです。
これが望ましくない場合は、リクエスト / ペイロードを送信するようにクライアント アプリケーションを修正 サイズを小さくしてください。
上記の例では、サイズの小さいファイルを渡して問題を解決できます。 以下に示すように、
test5mbfile(サイズが 5 MB)のペイロードがあるとします。curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
- 上限を超えてリクエスト/ペイロードを送信することが望ましい場合は、 選択します。
署名付き URL パターン
オプション 2 [推奨]: Apigee JavaCallout 内で署名付き URL パターンを使用する
<ph type="x-smartling-placeholder">ペイロードが 10 MB を超える場合、Apigee では、署名付き URL パターンを 図で示されている Apigee JavaCallout <ph type="x-smartling-placeholder"></ph> Edge Callout: 署名付き URL 生成ツールのサンプル(GitHub)
ストリーミング
方法 3 : ストリーミングを使用する
API プロキシで非常に大きなリクエストやレスポンスを処理する必要がある場合は、 ストリーミングをご覧ください。
<ph type="x-smartling-placeholder">CwC
方法 4 : CwC プロパティを使用してバッファ上限を増やす
<ph type="x-smartling-placeholder">このオプションは、推奨されるオプションを使用できない場合にのみ使用してください。 デフォルトのサイズを大きくするとパフォーマンスの問題になります。
Apigee は、 CwC プロパティ: リクエストとレスポンスのペイロード サイズの上限。詳しくは、 <ph type="x-smartling-placeholder"></ph> Router または Message Processor でメッセージ サイズの上限を設定する
<ph type="x-smartling-placeholder">上限
Apigee では、クライアント アプリケーションとバックエンド サーバーでは、ペイロードのサイズが
Request/response size の上限
Apigee Edge の制限。
- Public Cloud ユーザーの場合、リクエストとレスポンスの上限
ペイロード サイズは、
Request/response sizeの Apigee Edge の制限。 - Private Cloud ユーザー は、デフォルトのクラウド サービス アカウントを リクエストとレスポンスのペイロード サイズに制限があります(推奨されませんが)。 リクエスト ペイロードの最大サイズの上限は、 現在の上限を確認する方法
現在の上限を確認する方法
<ph type="x-smartling-placeholder">このセクションでは、プロパティ HTTPRequest.body.buffer.limit を確認する方法について説明します。
Message Processor 上の新しい値で更新されました。
- Message Processor マシンで、次のプロパティを検索します。
/opt/apigee/edge-message- processor/confディレクトリ内でHTTPRequest.body.buffer.limitを実行し、次のコマンドを使用して設定されている値を確認します。 command:grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
- 上記のコマンドのサンプル結果は次のとおりです。
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
上記の出力例では、プロパティの値が
HTTPRequest.body.buffer.limitの値は10mに設定されていますhttp.properties。これは、Apigee for Private で構成されたリクエスト ペイロード サイズの上限 クラウドの容量は 10 MB です。
Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合。
診断情報の収集が必要な場合
次の診断情報を収集して、Apigee Edge サポートに連絡してください。
Public Cloud ユーザーの場合は、次の情報を提供します。
- 組織名
- 環境名
- API プロキシ名
413エラーを再現するための完全な curl コマンド- API リクエストのトレース ファイル
Private Cloud ユーザーの場合は、次の情報を提供します。
- 失敗したリクエストについて観測された完全なエラー メッセージ
- 組織名
- 環境名
- API プロキシ バンドル
- 失敗した API リクエストのトレース ファイル
413エラーを再現するための完全な 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