502 Bad Gateway - Allow ヘッダーのない 405 レスポンス

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 を使用してエラーを診断するには:

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

    組織のプルダウン リスト
  3. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した特定の期間を選択します。
  5. 障害コード時間をプロットします。

  6. 以下のように、障害コード protocol.http.Response405WithoutAllowHeader が含まれるセルを選択します。

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

  8. [ログを表示 ] をクリックし、失敗したリクエストのいずれかを開いて詳細情報を表示します。

  9. [ログ] ウィンドウで、次の詳細を確認します。
    • ステータス コード: 502
    • 障害の発生元: target
    • 障害コード: protocol.http.Response405WithoutAllowHeader
  10. 障害の原因target で、障害コードprotocol.http.Response405WithoutAllowHeader の場合、バックエンド サーバーが Allow ヘッダーなしでステータス コード 405 Method Not Allowed を返したことを示します。

Trace ツール

Trace ツールを使用してエラーを診断するには:

  1. トレース セッションと、
    • 502 Bad Gateway エラーが発生するまで待つか、
    • 問題を再現できる場合は、API 呼び出しを行って問題を再現します(502 Bad Gateway エラー)
  2. [Show all FlowInfos] が有効になっていることを確認します。

  3. 失敗したリクエストのいずれかを選択し、トレースを確認します。
  4. トレースのさまざまなフェーズを調べて、障害が発生した場所を特定します。
  5. 通常、エラーは次の図に示すように、[Request sent to target server] フェーズの後のフローに表示されます。

  6. トレースからエラーの値をメモします。

    上記のトレース例では、エラーは Received 405 Response without Allow Header として示されています。このエラーは、リクエストがバックエンド サーバーに送信された後に Apigee によって発生するため、バックエンド サーバーが Allow ヘッダーなしで 405 レスポンス ステータス コードを送信したことを示します。

  7. トレースの [AX](Analytics Data Recorded)フェーズに移動してクリックします。
  8. [フェーズの詳細] パネルの [エラー / レスポンス ヘッダー] セクションまでスクロールし、次のように X-Apigee-fault-codeX-Apigee-fault-source の値を確認します。

  9. X-Apigee-fault-codeX-Apigee-fault-source の値がそれぞれ protocol.http.Response405WithoutAllowHeadertarget になります。これは、バックエンドが Allow ヘッダーなしで 405 レスポンス ステータス コードを送信したことが原因でエラーが発生したことを示しています。
    レスポンス ヘッダー
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

NGINX

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

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

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

    説明: ORGORGPORT# は実際の値に置き換えます。

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

    NGINX アクセスログの 502 エラーの例:

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

    レスポンス ヘッダー
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

原因: バックエンド サーバーからの Allow ヘッダーのない 405 レスポンス

診断

  1. 一般的な診断手順の説明に従って、API Monitoring、Trace ツール、NGINX アクセスログを使用して、502 Bad GatewayFault CodeFault Source を特定します。
  2. Fault Codeprotocol.http.Response405WithoutAllowHeader で、Fault Source の値が target の場合、バックエンド サーバーが Allow ヘッダーなしでステータス コード 405 を返したことを示します。そのため、Apigee はエラーコード protocol.http.Response405WithoutAllowHeader502 Bad Gateway を返します。

解決策

次のいずれかの方法で問題を解決します。

バックエンド サーバー

オプション 1: バックエンド サーバーを修正して、Allow ヘッダーとともに 405 ステータス コードを送信する:

  1. バックエンド サーバーが常に RFC 7231、セクション 6.5.5: 405 Method Not Allowed の仕様に準拠し、以下に示すように、許可されているメソッドのリストを Allow ヘッダーの一部として含めることで、405 ステータス コードで送信するようにします。

    Allow: HTTP_METHODS
  2. たとえば、バックエンド サーバーで GETPOSTHEAD メソッドが許可されている場合は、Allow ヘッダーに次のように含まれていることを確認する必要があります。
    Allow: GET, POST, HEAD

障害処理

オプション 2: エラー処理を使用して、API プロキシから Allow ヘッダーとともに 405 ステータス コードを送信する:

バックエンド サーバーが Allow ヘッダーなしでステータス コード 405 を返す場合は、次のように障害処理を使用して、API プロキシからステータス コード 405Allow ヘッダーを返信できます。

  1. 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>
  2. TargetEndpointFaultRule を作成します。これは、エラーコード protocol.http.Response405WithoutAllowHeader502 エラーが発生したときにポリシーを呼び出します。

    FaultRule を示す TargetEndpoint 構成の例:

    <TargetEndpoint name="default">
    ...
        <FaultRules>
           <FaultRule name="405WithoutAllowHeader">
                <Step>
                    <Name>AM-405WithAllowHeader</Name>
                </Step>
                <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition>
            </FaultRule>
        </FaultRules>
  3. これらの変更を API プロキシの新しいリビジョンに保存し、リビジョンをデプロイします。
  4. API 呼び出しを行い、Allow ヘッダーで 405 ステータス コードを取得していることを確認します。

プロパティを構成する

オプション 3: Message Processor でプロパティを構成して、Apigee Edge が 502 エラーを返さないようにする

  1. Private Cloud ユーザーの場合は、HTTP.ignore.allow_header.for.405 プロパティを true に更新して、バックエンド サーバーが Allow ヘッダーなしで 405 ステータス コードを返しても、Apigee Edge が 502 エラーを発生させないようにすることができます。手順については、 メッセージ プロセッサの 405 プロパティの無視許可ヘッダーを構成する入門ガイドをご覧ください。
  2. 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.Response405WithoutAllowHeader502 Bad Gateway を再現するために使用される完全な curl コマンド
  • API リクエストのトレース ファイル

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

  • 失敗したリクエストで確認されたエラー メッセージの全文
  • 環境名
  • API プロキシ バンドル
  • API リクエストのトレース ファイル
  • NGINX アクセスログ

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

    説明: ORGORGPORT# は実際の値に置き換えます。

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

参照

Apigee での障害処理