Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動します。 情報
症状
クライアント アプリケーションが、API 呼び出しに対するレスポンスとして、エラーコード protocol.http.Response405WithoutAllowHeader を含む HTTP ステータス コード 502 Bad Gateway を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
HTTP/1.1 502 Bad Gateway
さらに、次のエラー メッセージも確認できます。
{
"fault":{
"faultstring":"Received 405 Response without Allow Header",
"detail":{
"errorcode":"protocol.http.Response405WithoutAllowHeader"
}
}
}考えられる原因
このエラーは、バックエンド サーバーが Allow ヘッダーなしでステータス コード 405 Method Not Allowed を返した場合に発生します。
仕様
RFC 7231、セクション 6.5.5: 405 Method Not Allowed に従って、配信元サーバーは、ターゲット リソースで現在サポートされているメソッドのリストを含む 405 レスポンスで Allow ヘッダー フィールドを生成して送信する必要があります。そうでない場合、Apigee は 502 Bad Gateway とエラーコード protocol.http.Response405WithoutAllowHeader で応答します。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| バックエンド サーバーから Allow ヘッダーなしで 405 レスポンスが返される | API リクエストを処理しているバックエンド サーバーが、Allow ヘッダーなしでステータス コード 405 を返している。 |
Edge Public Cloud と Private Cloud のユーザー |
共通の診断手順
次のいずれかのツールまたは手法を使用して、このエラーを診断します。
API Monitoring
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Edge UI にログインします。
問題の調査対象となる組織に切り替えます。
- [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
- エラーが発生した特定の期間を選択します。
障害コードと時間をプロットします。
以下のように、障害コード
protocol.http.Response405WithoutAllowHeaderが含まれるセルを選択します。
障害コード
protocol.http.Response405WithoutAllowHeaderに関する情報が次のように表示されます。
[ログを表示 ] をクリックし、失敗したリクエストのいずれかを開いて詳細情報を表示します。
- [ログ] ウィンドウで、次の詳細を確認します。
- ステータス コード:
502 - 障害の発生元:
target - 障害コード:
protocol.http.Response405WithoutAllowHeader。
- ステータス コード:
- 障害の原因が
targetで、障害コードがprotocol.http.Response405WithoutAllowHeaderの場合、バックエンド サーバーがAllowヘッダーなしでステータス コード405 Method Not Allowedを返したことを示します。
Trace ツール
Trace ツールを使用してエラーを診断するには:
-
トレース セッションと、
502 Bad Gatewayエラーが発生するまで待つか、- 問題を再現できる場合は、API 呼び出しを行って問題を再現します(
502 Bad Gatewayエラー)
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したリクエストのいずれかを選択し、トレースを確認します。
- トレースのさまざまなフェーズを調べて、障害が発生した場所を特定します。
通常、エラーは次の図に示すように、[Request sent to target server] フェーズの後のフローに表示されます。
トレースからエラーの値をメモします。
上記のトレース例では、エラーは
Received 405 Response without Allow Headerとして示されています。このエラーは、リクエストがバックエンド サーバーに送信された後に Apigee によって発生するため、バックエンド サーバーがAllowヘッダーなしで405レスポンス ステータス コードを送信したことを示します。- トレースの [AX](Analytics Data Recorded)フェーズに移動してクリックします。
[フェーズの詳細] パネルの [エラー / レスポンス ヘッダー] セクションまでスクロールし、次のように X-Apigee-fault-code と X-Apigee-fault-source の値を確認します。
- X-Apigee-fault-code と X-Apigee-fault-source の値がそれぞれ
protocol.http.Response405WithoutAllowHeaderとtargetになります。これは、バックエンドがAllowヘッダーなしで405レスポンス ステータス コードを送信したことが原因でエラーが発生したことを示しています。レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeaderX-Apigee-fault-source target
NGINX
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP
502エラーに関する重要な情報を特定できます。 NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
説明: ORG、ORG、PORT# は実際の値に置き換えます。
- 特定の期間にエラーコード
protocol.http.Response405WithoutAllowHeaderの502エラーが発生したかどうか(問題が過去に発生した場合)、または502で失敗しているリクエストがまだあるかどうかを検索します。 X-Apigee-fault-code が
protocol.http.Response405WithoutAllowHeaderの値と一致する502エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。NGINX アクセスログの 502 エラーの例:
上記の NGINX アクセスログのエントリ例では、X-Apigee-fault-code と X-Apigee-fault-source に次の値が設定されています。
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeaderX-Apigee-fault-source target
原因: バックエンド サーバーからの Allow ヘッダーのない 405 レスポンス
診断
- 一般的な診断手順の説明に従って、API Monitoring、Trace ツール、NGINX アクセスログを使用して、
502 Bad Gatewayの Fault Code と Fault Source を特定します。 - Fault Code が
protocol.http.Response405WithoutAllowHeaderで、Fault Source の値がtargetの場合、バックエンド サーバーがAllowヘッダーなしでステータス コード405を返したことを示します。そのため、Apigee はエラーコードprotocol.http.Response405WithoutAllowHeaderで502 Bad Gatewayを返します。
解決策
次のいずれかの方法で問題を解決します。
バックエンド サーバー
オプション 1: バックエンド サーバーを修正して、Allow ヘッダーとともに 405 ステータス コードを送信する:
バックエンド サーバーが常に RFC 7231、セクション 6.5.5: 405 Method Not Allowed の仕様に準拠し、以下に示すように、許可されているメソッドのリストを
Allowヘッダーの一部として含めることで、405ステータス コードで送信するようにします。Allow: HTTP_METHODS
- たとえば、バックエンド サーバーで
GET、POST、HEADメソッドが許可されている場合は、Allowヘッダーに次のように含まれていることを確認する必要があります。Allow: GET, POST, HEAD
障害処理
オプション 2: エラー処理を使用して、API プロキシから Allow ヘッダーとともに 405 ステータス コードを送信する:
バックエンド サーバーが Allow ヘッダーなしでステータス コード 405 を返す場合は、次のように障害処理を使用して、API プロキシからステータス コード 405 と Allow ヘッダーを返信できます。
AssignMessage ポリシーや RaiseFault ポリシーなどのポリシーを作成し、
Allowヘッダーとカスタム メッセージを使用してステータス コードを405に設定します。Allow ヘッダーで 405 を送信する AssignMessage ポリシーの例:
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader"> <DisplayName>AM-405WithAllowHeader</DisplayName> <Set> <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload> <StatusCode>405</StatusCode> <ReasonPhrase>Method Not Allowed</ReasonPhrase> </Set> <Add> <Headers> <Header name="Allow">GET, POST, HEAD</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
TargetEndpointにFaultRuleを作成します。これは、エラーコードprotocol.http.Response405WithoutAllowHeaderで502エラーが発生したときにポリシーを呼び出します。FaultRule を示す TargetEndpoint 構成の例:
<TargetEndpoint name="default"> ... <FaultRules> <FaultRule name="405WithoutAllowHeader"> <Step> <Name>AM-405WithAllowHeader</Name> </Step> <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition> </FaultRule> </FaultRules>- これらの変更を API プロキシの新しいリビジョンに保存し、リビジョンをデプロイします。
- API 呼び出しを行い、
Allowヘッダーで405ステータス コードを取得していることを確認します。
プロパティを構成する
オプション 3: Message Processor でプロパティを構成して、Apigee Edge が 502 エラーを返さないようにする
- Private Cloud ユーザーの場合は、
HTTP.ignore.allow_header.for.405プロパティをtrueに更新して、バックエンド サーバーがAllowヘッダーなしで405ステータス コードを返しても、Apigee Edge が502エラーを発生させないようにすることができます。手順については、 メッセージ プロセッサの 405 プロパティの無視許可ヘッダーを構成する入門ガイドをご覧ください。 - Public Cloud ユーザー の場合は、Apigee Edge サポートにお問い合わせください。
仕様
Apigee は、次の仕様に従って、バックエンド サーバーから Allow ヘッダーとともに 405 Method Not Allowed レスポンスが返されることを想定しています。
| 仕様 | |
|---|---|
| RFC 7231、セクション 6.5.5: 405 Method Not Allowed | |
| RFC 7231、セクション 7.4.1: Allow |
重要なポイント
推奨される解決策は、バックエンド サーバーを修正して Allow ヘッダー付きでステータス コード 405 を送信し、仕様
RFC 7231、セクション 6.5.5: 405 Method Not Allowed に準拠することです。
Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
上記の手順でも問題が解決しない場合は、次の診断情報を収集して Apigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供してください。
- 組織名
- 環境名
- API プロキシ名
- エラーコード
protocol.http.Response405WithoutAllowHeaderで502 Bad Gatewayを再現するために使用される完全なcurlコマンド - API リクエストのトレース ファイル
Private Cloud ユーザーの場合は、次の情報を提供してください。
- 失敗したリクエストで確認されたエラー メッセージの全文
- 環境名
- API プロキシ バンドル
- API リクエストのトレース ファイル
NGINX アクセスログ
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
説明: ORG、ORG、PORT# は実際の値に置き換えます。
- Message Processor のシステムログ
/opt/apigee/var/log/edge-message-processor/logs/system.log