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

現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください
情報

内容

クライアント アプリケーションが、API 呼び出しのレスポンスとして、HTTP ステータス コード 502 Bad Gateway とエラーコード protocol.http.Response405WithoutAllowHeader を受け取ります。

エラー メッセージ

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

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、section 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. [Time] に [Fault Code] をプロットします。

  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. 失敗したリクエストの 1 つを選択し、トレースを調べます。
  4. トレースのさまざまなフェーズを順に確認し、エラーが発生した場所を見つけます。
  5. このエラーは通常、以下に示すように「Request sent to target server」フェーズの後のフローで確認できます。

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

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

  7. トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。
  8. [Phase Details] パネルの [Error / Response Headers] セクションまで下にスクロールし、次のように 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-code protocol.http.Response405WithoutAllowHeader の値と一致する 502 エラーが見つかった場合は、X-Apigee-fault-code の値を特定します。

    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 Gateway障害コード障害ソースを特定します。
  2. 障害コードprotocol.http.Response405WithoutAllowHeader で、障害ソースの値が target の場合、バックエンド サーバーが Allow ヘッダーなしで 405 ステータス コードで応答したことを示します。したがって、Apigee はエラーコード protocol.http.Response405WithoutAllowHeader とともに 502 Bad Gateway を返します。

解像度

問題を解決するには、次のいずれかの方法を使用します。

バックエンド サーバー

方法 1: Allow ヘッダーを含む 405 ステータス コードを送信するようにバックエンド サーバーを修正します。

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

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

障害の処理

オプション 2: 障害処理を使用して、API プロキシから Allow ヘッダーを含む 405 ステータス コードを送信します。

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

  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: Apigee Edge が 502 エラーを返さないように Message Processor のプロパティを構成する

  1. Private Cloud ユーザーは、プロパティ HTTP.ignore.allow_header.for.405true に更新することで、バックエンド サーバーが Allow ヘッダーなしで 405 ステータス コードで応答した場合でも、Apigee Edge が 502 エラーを発生させないようにすることができます。入門ガイド: Message Processors で 405 プロパティに ignore allow ヘッダーを構成するをご覧ください。
  2. Public Cloud ユーザー の方は、Apigee Edge サポートまでお問い合わせください。

仕様

Apigee は、次の仕様に従い、バックエンド サーバーからの 405 Method Not Allowed レスポンスと Allow ヘッダーを想定しています。

仕様
RFC 7231、section 6.5.5: 405 Method Not Allowed
RFC 7231 のセクション 7.4.1: 許可

重要なポイント

推奨される解決策は、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 での障害処理