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、セクション 6.5.5: 405 Method Not Allowed の仕様によると、送信元サーバーは、ターゲット リソースの現在サポートされているメソッドのリストを含む Allow ヘッダー フィールドを生成し、405 レスポンスで送信しなければなりません。そうしないと、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 に対して障害コードをプロットします。

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

解像度

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

バックエンド サーバー

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

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

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

障害処理

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

バックエンド サーバーが 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 を作成します。これにより、502 エラー(エラーコード protocol.http.Response405WithoutAllowHeader)の取得時にポリシーを呼び出します。

    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 Processor の 405 プロパティに ignore allow ヘッダーを構成するをご覧ください。
  2. Public Cloud ユーザー の方は、Apigee Edge サポートにお問い合わせください。

仕様

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

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

重要なポイント

推奨される解決策は、Allow ヘッダー付きで 405 ステータス コードを送信するようにバックエンド サーバーを修正し、 RFC 7231、セクション 6.5.5: 405 メソッドの使用許可を遵守することです。

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

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

上記の手順を行っても問題が解決しない場合は、次の診断情報を収集して、Apigee Edge サポートにお問い合わせください。

Public Cloud ユーザーの場合は、次の情報を提供します。

  • 組織の名前
  • 環境名
  • API プロキシ名
  • 完全な curl コマンドで 502 Bad Gateway をエラーコード protocol.http.Response405WithoutAllowHeader とともに再現します。
  • 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 での障害処理