Azure SDK for Java でプロキシを構成する

この記事では、プロキシを適切に使用するように Azure SDK for Java を構成する方法の概要について説明します。

HTTP プロキシの構成

Java 用 Azure クライアント ライブラリには、HttpClient 用にプロキシを構成するための複数の方法が用意されています。

各プロキシ提供方法には、それぞれの長所と短所があり、さまざまなレベルのカプセル化が用意されています。 HttpClient 用にプロキシを構成した場合は、残りの有効期間中ずっとそのプロキシが使用されます。 プロキシが個々の HttpClient に関連付けられている場合、アプリケーションは複数の HttpClient インスタンスを使用でき、そのそれぞれが異なるプロキシを使用してアプリケーションのプロキシ要件を満たすことができます。

プロキシ構成オプションは次のとおりです。

環境プロキシを使用する

既定で、HTTP クライアント ビルダーによって環境のプロキシ構成が検査されます。 このプロセスでは、Azure SDK for Java の Configuration API が使用されます。 ビルダーによってクライアントが作成されると、Configuration.getGlobalConfiguration() を呼び出すことによって取得された "グローバル構成" のコピーを使用して構成されます。 この呼び出しで、システム環境から HTTP プロキシ構成が読み取られます。

ビルダーによって環境が検査されるときに、指定された順序で次の環境構成が検索されます。

  1. HTTPS_PROXY
  2. HTTP_PROXY
  3. https.proxy*
  4. http.proxy*

* は、既知の Java プロキシのプロパティを表します。 詳細については、Oracle のドキュメント内の「Java ネットワークとプロキシ」を参照してください。

いずれかの環境構成が検出されると、ProxyOptions.fromConfiguration(Configuration.getGlobalConfiguration()) が呼び出され、ProxyOptions インスタンスが作成されます。 この記事の下の部分で ProxyOptions の種類についてより詳しく説明します。

重要

どのプロキシを使用する場合も、システム環境プロパティ java.net.useSystemProxiestrue に設定する必要があります。

また、システム環境変数内にあるプロキシ構成を使用しない HTTP クライアント インスタンスを作成することもできます。 既定の動作をオーバーライドするには、HTTP クライアント ビルダーで、異なる方法で構成された Configuration を明示的に設定します。 ビルダーで Configuration を設定すると、Configuration.getGlobalConfiguration() は呼び出されなくなります。 たとえば、Configuration.NONE を使用して configuration(Configuration) を呼び出すと、ビルダーによって環境の構成が検査されるのを明示的に禁止できます。

次の例では、HTTP_PROXY 環境変数を値 localhost:8888 と共に使用して、Fiddler をプロキシとして使用します。 このコードは、Netty と OkHttp HTTP クライアントの作成方法を示しています。 (HTTP クライアント構成の詳細については、HTTP クライアントとパイプラインに関する記事を参照してください)。

export HTTP_PROXY=localhost:8888
HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder().build();
HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder().build();

環境プロキシが使用されないようにするには、次の例に示すように、Configuration.NONE を使用して HTTP クライアント ビルダーを構成します。

HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
    .configuration(Configuration.NONE)
    .build();

HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
    .configuration(Configuration.NONE)
    .build();

構成プロキシを使用する

環境から読み取るのではなく、環境から既に受け取っている同じプロキシ設定でカスタム Configuration を使用するように HTTP クライアント ビルダーを構成できます。 この場合、制限されたユース ケースを対象とする再利用可能な構成を持つことができます。 HTTP クライアント ビルダーは、HttpClient の構築時に、ProxyOptions.fromConfiguration(<Configuration passed into the builder>) から返された ProxyOptions を使用します。

次の例では、Configuration オブジェクトに設定された http.proxy* 構成を使用して、Fiddler をプロキシとして認証するプロキシを使用します。

Configuration configuration = new Configuration()
    .put("java.net.useSystemProxies", "true")
    .put("http.proxyHost", "localhost")
    .put("http.proxyPort", "8888")
    .put("http.proxyUser", "1")
    .put("http.proxyPassword", "1");

HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
    .configuration(configuration)
    .build();

HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
    .configuration(configuration)
    .build();

明示的なプロキシを使用する

Java クライアント ライブラリには、プロキシを構成するための Azure クライアント ライブラリの型として機能する ProxyOptions クラスが付属しています。 プロキシ要求を送信するために使用されるネットワーク プロトコル、プロキシ アドレス、プロキシ認証資格情報、および非プロキシ ホストを指定して ProxyOptions を構成できます。 プロキシ ネットワーク プロトコルとプロキシ アドレスのみが必須です。 認証資格情報を使用する場合は、ユーザー名とパスワードの両方を設定する必要があります。

次の例では、要求を既定の Fiddler アドレス (localhost:8888) にプロキシする単純な ProxyOptions インスタンスを作成します。

ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888));

次の例では、プロキシ認証を必要とする Fiddler インスタンスに要求をプロキシする認証済み ProxyOptions を作成します。

// Fiddler uses username "1" and password "1" with basic authentication as its proxy authentication requirement.
ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888))
    .setCredentials("1", "1");

使用する明示的なプロキシを示すために、ProxyOptions を使用して HTTP クライアント ビルダーを直接構成できます。 この構成は、プロキシを指定するための最もきめ細かな方法であり、一般に、プロキシ要件を更新するために変更できる Configuration を渡すのと比べて柔軟ではありません。

次の例では、Fiddler をプロキシとして使用するために ProxyOptions を使用しています。

ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888));

HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
    .proxy(proxyOptions)
    .build();

HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
    .proxy(proxyOptions)
    .build();

次のステップ

Azure SDK for Java でのプロキシ構成の概要を理解したので、アプリケーション内のフローをよりよく理解して、問題の診断に役立てるために、「Azure SDK for Java でトレースを構成する」を参照してください。