ネットワークに関する問題をトラブルシューティングする
この記事では、さまざまな複雑さのネットワーク問題を診断できるいくつかのツールについて説明します。 これらの問題には、サービスからの予期しない応答値のトラブルシューティングから、Connection-closed (接続が閉じられた) 例外の根本原因を突き止めることまで、さまざまなシナリオが含まれます。
クライアント側のトラブルシューティングのために、Java 用 Azure クライアント ライブラリには、「Azure SDK for Java でログを構成する」で説明されているように、一貫性のある堅牢なログ記録のストーリーが用意されています。 ただし、クライアント ライブラリでは、さまざまなプロトコルでネットワーク呼び出しが行われるため、指定されたトラブルシューティングの範囲外に及ぶトラブルシューティング シナリオが発生する場合があります。 そのような問題が発生した場合、解決策は、この記事で説明されている外部ツールを使用してネットワーク問題を診断することです。
Fiddler
Fiddler は HTTP デバッグ プロキシです。これを使用すると、それを介して渡された要求および応答を現状のままログに記録できます。 キャプチャされた未加工の要求と応答は、予期しない要求がサービスで取得されたり、予期しない応答がクライアントで受信されたりするシナリオのトラブルシューティングに役立ちます。 Fiddler を使用するには、HTTP プロキシを使用してクライアント ライブラリを構成する必要があります。 HTTPS を使用する場合は、暗号化解除された要求と応答の本文を検査するために追加の構成が必要です。
HTTP プロキシを追加する
HTTP プロキシを追加するには、Azure SDK for Java でのプロキシの構成に関する記事のガイダンスに従ってください。 必ず、ポート 8888 で、Fiddler の既定アドレスである localhost
を使用してください。
HTTPS の暗号化解除を有効にする
既定では、Fiddler では HTTP トラフィックのみをキャプチャできます。 アプリケーションで HTTPS が使用される場合は、HTTPS トラフィックをキャプチャできるように、Fiddler の証明書を信頼するための追加手順を実行する必要があります。 詳細については、Fiddler のドキュメント内の HTTPS メニューに関する記事を参照してください。
次の手順では、Java Runtime Environment (JRE) を使用して認定資格証を信頼する方法について説明します。 認定資格証を信頼しないと、セキュリティ警告が表示され、Fiddler 経由の HTTPS 要求が失敗する場合があります。
Fiddler の証明書をエクスポートします。
JRE の keytool を見つけます (通常は jre/bin にあります)。
JRE の cacert を検索します (通常は、jre/lib/security にあります)。
Bash ウィンドウを開き、次のコマンドを使用して認定資格証をインポートします。
sudo keytool -import -file <location-of-Fiddler-certificate> -keystore <location-of-cacert> -alias Fiddler
パスワードを入力します。
証明書を信頼します。
Wireshark
Wireshark は、アプリケーション コードを変更することなくネットワーク トラフィックをキャプチャできるネットワーク プロトコル アナライザーです。 Wireshark は高度な構成が可能で、広範から、特定で低レベルのネットワーク トラフィックまでをキャプチャできます。 この機能は、リモート ホストによって接続が閉じられる、または操作中に接続が閉じられるといったシナリオのトラブルシューティングに役立ちます。 Wireshark GUI では、TCP 再送信や RST などの一意のキャプチャ ケースを特定する配色を使用してキャプチャが表示されます。 また、キャプチャ時または分析中にキャプチャをフィルター処理することもできます。
キャプチャ フィルターを構成する
キャプチャ フィルターを使用すると、分析のためにキャプチャされるネットワーク呼び出しの数を減らすことができます。 キャプチャ フィルターを使用しない場合、Wireshark ではネットワーク インターフェイスを経由するすべてのトラフィックがキャプチャされます。 この動作によって、そのほとんどが調査にとってノイズである大量のデータが生成される可能性があります。 キャプチャ フィルターを使用すると、キャプチャするネットワーク トラフィックの範囲を事前に設定して、調査対象を絞り込むことができます。 詳細については、Wireshark のドキュメント内のライブ ネットワーク データのキャプチャに関する記事を参照してください。
次の例では、特定のホストとの間で送受信されるネットワーク トラフィックをキャプチャするためのキャプチャ フィルターを追加します。
Wireshark で、[Capture]\(キャプチャ\) > [Capture Filters...]\(キャプチャ フィルタ...\) に移動し、host <host-IP-or-hostname>
の値で新しいフィルターを追加します。 このフィルターでは、そのホストとの間のトラフィックのみがキャプチャされます。 アプリケーションが複数のホストと通信する場合は、複数のキャプチャ フィルターを追加できます。または、"OR" 演算子を使用してホスト IP またはホスト名を追加し、より粗いキャプチャ フィルター処理を提供することもできます。
ディスクにキャプチャする
アプリケーションを長時間実行して、予期しないネットワーク例外を再現し、それに至るまでのトラフィックを確認する必要が生じる場合があります。 また、メモリ内にすべてのキャプチャを維持できない場合もあります。 幸いなことに、Wireshark では、後処理で使用できるように、キャプチャをディスクに記録することができます。 この方法を使用すると、問題を再現している間にメモリ不足が発生するリスクを回避できます。 詳細については、Wireshark のドキュメント内のファイルの入力、出力、および印刷に関する記事を参照してください。
次の例では、複数のファイルを含むディスクにキャプチャを永続化するように Wireshark を設定します。この場合、ファイルは 10 万キャプチャまたは 50 MB のサイズで分割されます。
Wireshark で、[Capture]\(キャプチャ\) > [Options]\(オプション\) に移動し、[Output]\(出力\) タブを見つけ、使用するファイル名を入力します。 この構成では、Wireshark によってキャプチャは 1 つのファイルに保持されます。
複数のファイルへのキャプチャを有効にするには、[Create a new file automatically]\(自動的に新しいファイルを作成する\) を選択し、次に、[after 100000 packets]\(100000 パケット後\) と [after 50 megabytes]\(50 メガバイト後\) を選択します。 この構成では、いずれかの述語が一致したときに、Wireshark によって新しいファイルが作成されます。 新しい各ファイルは、入力したファイル名と同じベース名を使用し、一意の識別子を付加します。
Wireshark で作成できるファイルの数を制限する場合は、[Use a ring buffer with X files]\(X ファイルでリング バッファーを使用する\) を選択します。 このオプションでは、指定された数のファイルのみでログ記録を行うように、Wireshark が制限されます。 そのファイル数に達すると、Wireshark では最も古いファイルから、ファイルの上書きが開始されます。
キャプチャをフィルター処理する
場合によっては、Wireshark によってキャプチャされるトラフィックの範囲を厳密に設定できないことがあります。たとえば、アプリケーションがさまざまなプロトコルを使用して複数のホストと通信している場合などです。 このシナリオでは、一般に以前説明した永続的なキャプチャを使用すると、ネットワーク キャプチャ後の分析を簡単に実行できます。 Wireshark では、キャプチャを分析するためのフィルターのような構文がサポートされています。 詳細については、Wireshark のドキュメント内のキャプチャしたパケットの操作に関する記事を参照してください。
次の例では、永続化されたキャプチャ ファイルを読み込み、ip.src_host==<IP>
でフィルター処理を行います。
Wireshark で、[ファイル]>[開く]の順に選択し、以前使用したファイル場所から永続化されたキャプチャを読み込みます。 メニュー バーの下でファイルが読み込まれると、フィルター入力が表示されます。 フィルター入力に、ip.src_host==<IP>
と入力します。 このフィルターは、IP <IP>
を持つホストからのソースのキャプチャのみを表示するように、キャプチャ ビューを制限します。
次のステップ
この記事では、Azure SDK for Java の使用時に発生するネットワーク問題を診断するためのさまざまなツールの使用について説明しました。 使用シナリオに関する概念を理解したので、SDK 自体の探索を開始できます。 使用可能な API の詳細については、Azure SDK for Java ライブラリに関するページを参照してください。