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-code と X-Apigee-fault-source の値を確認します。

  9. X-Apigee-fault-code と X-Apigee-fault-source の値がそれぞれ protocol.http.Response405WithoutAllowHeader と target になります。これは、バックエンドが 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

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

  3. 特定の期間にエラーコード protocol.http.Response405WithoutAllowHeader の 502 エラーが発生したかどうか(問題が過去に発生した場合)、または 502 で失敗しているリクエストがまだあるかどうかを検索します。
  4. 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.Response405WithoutAllowHeader
    X-Apigee-fault-source target

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

診断

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

解決策

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

バックエンド サーバー

オプション 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: エラー処理を使用して、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. 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>
  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.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

参照

Apigee での障害処理