現在、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.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 のトンネルの作成を拒否しました |
この原因としては、バックエンド サーバーで構成されているファイアウォールまたは ACL の制限がトンネルの作成を妨げていることが考えられます。 |
プロキシがレスポンス ステータス 503 のトンネルの作成を拒否しました |
これは、DNS の問題、ファイアウォールの制限、バックエンド サーバーを利用できないため、トンネルの作成が妨げられることが原因で発生する可能性があります。 |
プロキシがレスポンス ステータス 504 のトンネルの作成を拒否した |
これは、トンネルの作成中にタイムアウトが発生した場合に発生することがあります。 |
faultstring
に表示されているステータス コードに応じて、適切な手法を使用して問題のトラブルシューティングを行う必要があります。このハンドブックでは、エラーコード protocol.http.ProxyTunnelCreationFailed
の faultstring
にステータス コード 403
が表示された場合の問題のトラブルシューティング方法について説明します。
考えられる原因
このエラー(ステータス コード 403
)は、バックエンド サーバーでファイアウォールまたは ACL(アクセス制御リスト)の制限が構成されており、プロキシ サーバーによる Apigee Edge とバックエンド サーバー間のトンネルの作成が妨げられる場合に発生します。
原因 | 説明 | トラブルシューティングの実施対象 |
---|---|---|
プロキシがレスポンス ステータス 403 のトンネルの作成を拒否した | プロキシ サーバーは、Host ヘッダーでバックエンド サーバーのホスト名ではなくプロキシ サーバーのホスト名を受け取るため、トンネルの作成を拒否します。 |
Edge Private Cloud ユーザーのみ |
共通の診断手順
このエラーを診断するには、次のいずれかのツールや手法を使用します。
Trace ツール
Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にして、次のいずれかを行います。
- エラーが発生するまで待ちます。
- 問題を再現できる場合は、
503 Service Unavailable
Proxy refused to create tunnel with response status 403
で API 呼び出しを行って問題を再現します。
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したリクエストの 1 つを選択し、トレースを調べます。
- トレースのさまざまなフェーズを確認し、エラーが発生した場所を特定します。
通常、次に示すように、このエラーはターゲット リクエスト フローの開始フェーズの後に表示されます。
次の点にご注意ください。
エラー:
Proxy refused to create tunnel with response status 403
- トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。
[Phase Details] の [Response Headers] セクションまで下にスクロールし、次のように X-Apigee-fault-code と X-Apigee-fault-source の値を確認します。
( 拡大画像を表示)
( 拡大画像を表示)
X-Apigee-fault-codeX-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 アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP
503 Service Unavailable
エラーに関する重要な情報を特定できます。 NGINX のアクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
ここで: ORG、ORG、PORT# は実際の値に置き換えられます。
- 特定の期間にエラーコード
protocol.http.ProxyTunnelCreationFailed
の503
エラーがあったかどうか(問題が過去に発生していた場合)、または503
で失敗するリクエストがあるかどうかを検索します。 X-Apigee-fault-code の値と一致する X-Apigee-fault-code の
503
エラーが見つかった場合は、X-Apigee-fault-code の値を特定します。NGINX アクセスログの 503 エラーの例:
上記の NGINX アクセスログのエントリ例では、X- Apigee-fault-code と X-Apigee-fault-source に次の値が入っています。
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
X-Apigee-fault-source target
原因: プロキシがレスポンス ステータス 403 のトンネルの作成を拒否した
診断
- 一般的な診断手順で説明されているように、Trace ツールまたは NGINX アクセスログを使用して、
503 Service Unavailable
の障害コードと障害ソースを特定します。 - エラー メッセージを確認し、
faultstring
に表示されているステータス コード(トンネル作成の失敗について)を特定します。 - このシナリオでは、ステータス コードは
403
(禁止)です。 - これは、トンネルを作成するための十分な権限がないことを意味します。これは通常、ファイアウォールまたは ACL(アクセス制御リスト)の制限によってトンネルの作成が妨げられている場合に発生することがあります。
- バックエンド サーバーで構成されており、トンネルの作成を妨げる可能性のあるファイアウォールや ACL 制限を確認します。
- ファイアウォールや ACL の制限の種類に応じて、問題を適切に修正する必要があります。
ここでは、ファイアウォールの制限の例を取り上げ、この問題のトラブルシューティング方法と解決方法について説明します。
シナリオ: バックエンド サーバーのファイアウォールの制限で、Host ヘッダーに常にバックエンド サーバーのホスト名が含まれていると想定する
次のいずれかの方法で、Apigee Edge から渡された Host ヘッダーを特定できます。
Trace
Trace を使用して Host ヘッダーを特定するには:
- 一般的な診断手順で説明されているトレースを使用して、
faultstring
にProxy refused to create tunnel with response status 403
が含まれていることを確認します。 - 「Target Request Flow Started」フェーズに移動し、リクエスト ヘッダーを確認します。
- [リクエスト ヘッダー] セクションの Host ヘッダーで指定されているホスト名の値を確認します。
- Host ヘッダーにプロキシホスト名が含まれている場合、それがこのエラーの原因です。
- これは、ホストヘッダーにバックエンド サーバーの名前が含まれている場合にのみ、リクエストを受け入れるようにファイアウォールがバックエンド サーバーで構成されているためです。
- このため、プロキシ サーバーがバックエンド サーバーとのトンネルを作成しようとすると、次のエラーで失敗します。
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 を使用してホストヘッダーを特定するには
次のコマンドを実行し、Apigee Edge の Message Processor コンポーネントからのリクエストについて、プロキシ サーバーで
tcpdump
を取得します。tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
tcpdump
コマンドの使用方法の詳細については、 tcpdump をご覧ください。- Wireshark ツールまたは同様のツールを使用して
tcpdump
データを分析します。 Wireshark を使用した場合の tcpdump の分析例を次に示します。
( 拡大画像を表示)
- パケット番号 13、14、15 は、Message Processor が 3 方向 TCP handshake プロセスによってプロキシ サーバーへの接続を確立していることを示します。
- パケット 16 では、Message Processor がプロキシホスト
httpbin.org
に接続しています(上の例を参照)。 パケット 16 を選択し、パケットの内容を詳しく調べます。具体的には、Message Processor によってプロキシ サーバーに渡される Host Header を調べます。
- 上のサンプルは、ホストヘッダー
httpin.org
を示しています。これはプロキシ サーバーのホスト名です。このため、プロキシ サーバーが上記のホストヘッダーhttpin.org
を渡してバックエンド サーバーとのトンネルを作成しようとすると、エラーProxy refused to create tunnel with response status 403
で失敗します。
- 一般的な診断手順で説明されているトレースを使用して、
解像度
シナリオ: プロキシ サーバーに対するファイアウォールの制限で、Host ヘッダーに常にバックエンド サーバーのホスト名が含まれていると想定する
バックエンド サーバーのファイアウォールが、Message Processor がバックエンド サーバーのホスト名を送信している間、ホスト ヘッダーに常にバックエンド サーバーのホスト名が含まれるように構成されているために、このエラーの原因であることが確認できたら、次の手順で問題を解決します。backendbackend
次の例のように、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>
Message Processor で、 転送プロキシに関連するその他のプロパティが次のように構成されていることを確認します。
- 各 Message Processor のファイル
/opt/apigee/customer/application/message-processor.properties
を確認します。 ユースケースまたは要件に従って次のプロパティが設定されていることを確認します。
プロパティのサンプル値:
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
- 各 Message Processor のファイル
診断情報の収集が必要な場合
上記の手順でも問題が解決しない場合は、次の診断情報を収集して 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