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

Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動します。
情報

症状

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

エラー メッセージ

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

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.tunneling を false に設定する必要があります。

エラーコード: 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.ProxyTunnelCreationFailed の faultstring でステータス コード 403 が確認された場合に、問題をトラブルシューティングする方法について説明します。

考えられる原因

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

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

共通の診断手順

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

Trace ツール

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

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

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

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

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

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

    ( 大きい画像を表示)

    ( 大きい画像を表示)

  8. X-Apigee-fault-code と X-Apigee-fault-source の値がそれぞれ protocol.http.ProxyTunnelCreationFailed と target になり、このエラーは、想定されるホスト ヘッダーが受信されなかったため、プロキシ トンネルの作成に失敗したことが原因であることを示します。

    レスポンス ヘッダー 値
    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

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

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

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

    上記の NGINX アクセスログのエントリ例では、X-Apigee-fault-code と X-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(Forbidden)です。
  4. これは、トンネルを作成するための権限が不足していることを意味します。これは通常、トンネルの作成を妨げるファイアウォールまたは ACL(アクセス制御リスト)の制限がある場合に発生します。
  5. バックエンド サーバーで構成されているファイアウォールや ACL の制限で、トンネルの作成を妨げる可能性があるものがないか確認します。
  6. ファイアウォールや ACL の制限の種類に応じて、問題を適切に修正する必要があります。
  7. この問題をトラブルシューティングして解決する方法を説明するために、ファイアウォールの制限の例を見てみましょう。

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

    Apigee Edge によって渡されるホスト ヘッダーを特定するには、次のいずれかの方法を使用します。

    トレース

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

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

      Proxy refused to create tunnel with response status 403。

      プロキシ ホスト名を含むホスト ヘッダーを示すトレースの例

      ( 大きい画像を表示)

      上記のトレース例では、ホスト ヘッダーにプロキシホスト www.proxyserver.com. の名前が含まれていることが示されています。バックエンド サーバーに構成されたファイアウォール制限により、ホスト ヘッダーにバックエンド サーバーのホスト名のみが含まれることが想定されているため、エラー 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. パケット番号 13、14、15 は、Message Processor が 3 ウェイ TCP ハンドシェイク プロセスを介してプロキシ サーバーへの接続を確立していることを示しています。
    5. パケット 16 では、Message Processor がプロキシホスト httpbin.org(上記の例を参照)に接続しています。
    6. パケット 16 を選択し、パケットの内容を詳細に調べます。特に、Message Processor によってプロキシ サーバーに渡される Host ヘッダーを調べます。

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

解決策

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

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

  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

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

  • Message Processor のシステムログ

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

参照