503 Service Unavailable - 403 でプロキシ トンネルの作成失敗

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

内容

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

エラー メッセージ

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

HTTP/1.1 503 Service Unavailable

また、次のエラー メッセージが表示される場合があります。

{
   "fault":{
      "faultstring":"Proxy refused to create tunnel with response status 403",
      "detail":{
         "errorcode":"protocol.http.ProxyTunnelCreationFailed"
      }
   }
}

転送プロキシとトンネリング

Apigee Edge を使用すると、 転送プロキシを構成するで説明されているように、API プロキシがプロキシ サーバーを介してバックエンド サーバーと通信できます。プロキシ サーバーは、使用されるプロキシタイプ(プロパティ HTTPClient.proxy.type で示される)に応じてバックエンド サーバーへの安全な接続(HTTPS)または保護されていない接続(HTTP)を開き、双方向でデータを転送します。これをトンネリングといいます。

デフォルトでは、Apigee Edge はすべてのトラフィックにトンネリングを使用します。トンネリングを無効にするには、プロパティ HTTPClient.use.tunnelingfalse に設定する必要があります。

エラーコード: Protocol.http.ProxyTunnelCreationFailed

ファイアウォール、ACL(アクセス制御リスト)の制限、DNS の問題、バックエンド サーバーが利用できない状態、タイムアウトなどの問題により、プロキシ サーバーが Apigee Edge とバックエンド サーバー間のトンネルを作成できない場合、Apigee Edge はエラーコード protocol.http.ProxyTunnelCreationFailed を返します。

通常、Apigee Edge からのレスポンスの faultstring にあるステータス コードは、このエラーの原因と考えられる大まかな原因を示します。

Faultstring テンプレート:

Proxy refused to create tunnel with response status STATUS_CODE

faultstring で検出されたステータス コードの一部について、考えられる原因は次のとおりです。

faultstring に示されるステータス コードに応じて考えられる原因を次の表に示します。

Faultstring 説明
プロキシがレスポンス ステータス 403 のトンネルの作成を拒否しました

403 - Forbidden

この原因としては、バックエンド サーバーで構成されているファイアウォールまたは ACL の制限がトンネルの作成を妨げていることが考えられます。

プロキシがレスポンス ステータス 503 のトンネルの作成を拒否しました

503 - Service Unavailable

これは、DNS の問題、ファイアウォールの制限、バックエンド サーバーを利用できないため、トンネルの作成が妨げられることが原因で発生する可能性があります。

プロキシがレスポンス ステータス 504 のトンネルの作成を拒否した

504 - Gateway Timeout

これは、トンネルの作成中にタイムアウトが発生した場合に発生することがあります。

faultstring に表示されているステータス コードに応じて、適切な手法を使用して問題のトラブルシューティングを行う必要があります。このハンドブックでは、エラーコード protocol.http.ProxyTunnelCreationFailedfaultstringステータス コード 403 が表示された場合の問題のトラブルシューティング方法について説明します。

考えられる原因

このエラー(ステータス コード 403)は、バックエンド サーバーでファイアウォールまたは ACL(アクセス制御リスト)の制限が構成されており、プロキシ サーバーによる Apigee Edge とバックエンド サーバー間のトンネルの作成が妨げられる場合に発生します。

原因 説明 トラブルシューティングの実施対象
プロキシがレスポンス ステータス 403 のトンネルの作成を拒否した プロキシ サーバーは、Host ヘッダーでバックエンド サーバーのホスト名ではなくプロキシ サーバーのホスト名を受け取るため、トンネルの作成を拒否します。 Edge Private Cloud ユーザーのみ

共通の診断手順

このエラーを診断するには、次のいずれかのツールや手法を使用します。

Trace ツール

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

  1. トレース セッションを有効にして、次のいずれかを行います。
    • エラーが発生するまで待ちます。
    • 問題を再現できる場合は、503 Service Unavailable Proxy refused to create tunnel with response status 403 で API 呼び出しを行って問題を再現します。
  2. [Show all FlowInfos] が有効になっていることを確認します。

  3. 失敗したリクエストの 1 つを選択し、トレースを調べます。
  4. トレースのさまざまなフェーズを確認し、エラーが発生した場所を特定します。
  5. 通常、次に示すように、このエラーはターゲット リクエスト フローの開始フェーズの後に表示されます。

    次の点にご注意ください。

    エラー: Proxy refused to create tunnel with response status 403

  6. トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。
  7. [Phase Details] の [Response Headers] セクションまで下にスクロールし、次のように X-Apigee-fault-codeX-Apigee-fault-source の値を確認します。

    拡大画像を表示

    拡大画像を表示

  8. X-Apigee-fault-codeX-Apigee-fault-code と X-Apigee-fault-source の値がそれぞれ protocol.http.ProxyTunnelCreationFailedtarget として表示されます。これは、想定されるホストヘッダーが受信されていないためにプロキシ トンネルの作成に失敗したためにこのエラーが生じたことを示しています。

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

NGINX

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

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

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

    ここで: ORGORGPORT# は実際の値に置き換えられます。

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

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

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

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

原因: プロキシがレスポンス ステータス 403 のトンネルの作成を拒否した

診断

  1. 一般的な診断手順で説明されているように、Trace ツールまたは NGINX アクセスログを使用して、503 Service Unavailable障害コード障害ソースを特定します。
  2. エラー メッセージを確認し、faultstring に表示されているステータス コード(トンネル作成の失敗について)を特定します。
  3. このシナリオでは、ステータス コードは 403禁止)です。
  4. これは、トンネルを作成するための十分な権限がないことを意味します。これは通常、ファイアウォールまたは ACL(アクセス制御リスト)の制限によってトンネルの作成が妨げられている場合に発生することがあります。
  5. バックエンド サーバーで構成されており、トンネルの作成を妨げる可能性のあるファイアウォールや ACL 制限を確認します。
  6. ファイアウォールや ACL の制限の種類に応じて、問題を適切に修正する必要があります。
  7. ここでは、ファイアウォールの制限の例を取り上げ、この問題のトラブルシューティング方法と解決方法について説明します。

    シナリオ: バックエンド サーバーのファイアウォールの制限で、Host ヘッダーに常にバックエンド サーバーのホスト名が含まれていると想定する

    次のいずれかの方法で、Apigee Edge から渡された Host ヘッダーを特定できます。

    Trace

    Trace を使用して Host ヘッダーを特定するには:

    1. 一般的な診断手順で説明されているトレースを使用して、faultstringProxy refused to create tunnel with response status 403 が含まれていることを確認します。
    2. Target Request Flow Started」フェーズに移動し、リクエスト ヘッダーを確認します。
    3. [リクエスト ヘッダー] セクションの Host ヘッダーで指定されているホスト名の値を確認します。
    4. Host ヘッダーにプロキシホスト名が含まれている場合、それがこのエラーの原因です。
    5. これは、ホストヘッダーバックエンド サーバーの名前が含まれている場合にのみ、リクエストを受け入れるようにファイアウォールがバックエンド サーバーで構成されているためです。
    6. このため、プロキシ サーバーがバックエンド サーバーとのトンネルを作成しようとすると、次のエラーで失敗します。

      Proxy refused to create tunnel with response status 403.

      Host ヘッダーにプロキシのホスト名が含まれていることを示すトレースの例

      拡大画像を表示

      上記のサンプル トレースでは、ホストヘッダーにプロキシホスト www.proxyserver.com. の名前が含まれていることがわかります。これは、バックエンド サーバーにファイアウォール制限が構成されているため、Host ヘッダーにはバックエンド サーバーのホスト名のみが含まれるため、エラー Proxy refused to create tunnel with response status 403 が表示されます。

    tcpdump

    tcpdump を使用してホストヘッダーを特定するには

    1. 次のコマンドを実行し、Apigee Edge の Message Processor コンポーネントからのリクエストについて、プロキシ サーバーで tcpdump を取得します。

      tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
      

      tcpdump コマンドの使用方法の詳細については、 tcpdump をご覧ください。

    2. Wireshark ツールまたは同様のツールを使用して tcpdump データを分析します。
    3. Wireshark を使用した場合の tcpdump の分析例を次に示します。

      拡大画像を表示

    4. パケット番号 131415 は、Message Processor が 3 方向 TCP handshake プロセスによってプロキシ サーバーへの接続を確立していることを示します。
    5. パケット 16 では、Message Processor がプロキシホスト httpbin.org に接続しています(上の例を参照)。
    6. パケット 16 を選択し、パケットの内容を詳しく調べます。具体的には、Message Processor によってプロキシ サーバーに渡される Host Header を調べます。

    7. 上のサンプルは、ホストヘッダー httpin.org を示しています。これはプロキシ サーバーのホスト名です。このため、プロキシ サーバーが上記のホストヘッダー httpin.org を渡してバックエンド サーバーとのトンネルを作成しようとすると、エラー Proxy refused to create tunnel with response status 403 で失敗します。

解像度

シナリオ: プロキシ サーバーに対するファイアウォールの制限で、Host ヘッダーに常にバックエンド サーバーのホスト名が含まれていると想定する

バックエンド サーバーのファイアウォールが、Message Processor がバックエンド サーバーのホスト名を送信している間、ホスト ヘッダーに常にバックエンド サーバーのホスト名が含まれるように構成されているために、このエラーの原因であることが確認できたら、次の手順で問題を解決します。backendbackend

  1. 次の例のように、TargetEndpoint でプロパティ use.proxy.host.header.with.target.uri を true に設定します。

    TargetEndpoint 構成の例:

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <URL>https://mocktarget.apigee.net/json</URL>
        <Properties>
          <Property name="use.proxy.host.header.with.target.uri">true</Property>
        </Properties>
      </HTTPTargetConnection>
    </TargetEndpoint>
    
  2. Message Processor で、 転送プロキシに関連するその他のプロパティが次のように構成されていることを確認します。

    1. 各 Message Processor のファイル /opt/apigee/customer/application/message-processor.properties を確認します。
    2. ユースケースまたは要件に従って次のプロパティが設定されていることを確認します。

      プロパティのサンプル値:

      conf_http_HTTPClient.use.proxy=true
      conf/http.properties+HTTPClient.proxy.type=HTTP
      conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME
      conf/http.properties+HTTPClient.proxy.port=PORT_#
      conf/http.properties+HTTPClient.proxy.user=USERNAME
      conf/http.properties+HTTPClient.proxy.password=PASSWORD
      

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

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

Private Cloud ユーザーの場合は、次の情報を入力します。

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

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

    ここでORGENVPORT# は実際の値に置き換えられます。

  • Message Processor のシステムログ

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    

参照