Javaな人がAzureSDKを触るためのながーい道のり

# JavaからAzureSDK操作したいですよね

ですよね。みなさん。

AzureのJava開発者向けのサイト( https://azure.microsoft.com/ja-jp/develop/java/ )があります。
Java用のSDKが準備されていそうです。
これを使ってみようと思ったのですが、意外と道のりが長かったので、整理してみました。
これから使おうと考えている方はこれを見ると、開発を始められるはずです！

# 前提条件

以下の知識がある読者を想定しています。

- Windowsの基本的な操作ができること
- Javaの実装ができること
- Eclipseの使い方がわかること
- Mavenの使い方がわかること
- Azureで何か動かしていること

# 開発する環境の準備

## EclipseのPlug-inの準備

「Azure Toolkit for Eclipse」というEclipse用のPluginが用意されています。
これのインストールは手順通りに実行すれば簡単にできると思います。
手順はこちら→https://msdn.microsoft.com/ja-jp/library/azure/hh690946.aspx

## 証明書の準備のための準備

さて、JavaSDKからAzureに接続するためには、証明書を利用してAPIの認証を受ける必要があります。
そのために、Azureに管理証明書を登録しなければなりません。

管理証明書を作成するためにはいくつか方法がありますが、テストや動作確認のために簡単に作成したいですね。
つまり、自己証明書を作りたいですね。
そのためのツールに「Windows SDK」があります。

Windows SDKのインストーラは以下から取得できます。
https://www.microsoft.com/en-us/download/details.aspx?id=8279
このページを見ると、インストールの前提条件があることがわかります。

- .NET Framework(https://www.microsoft.com/ja-jp/download/details.aspx?id=17851)
- VisualStudio(https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs#DownloadFamilies_1)

です。
それぞれ、()内のリンク先からインストーラを入手してインストールして下さい。
なお、Microsoft製品をインストールしたので、その後にWindowsUpdateをすることを忘れないで下さい。
※この記述は古いのですがおそらくVisialStuidoをインストールすると、.NET Frameworkもインストールされるので、VisualStudioだけで問題ない気がします。試せてませんが。

準備できましたか？では、Windows SDKをインストールします。
先ほど紹介したページからダウンロードし、インストールします。

エラー。

まあ、そんなもんでしょう。ふむふむ。
![WindowsSDKインストール失敗.png](https://qiita-image-store.s3.amazonaws.com/0/95552/b2cb83b6-2f68-b2b1-c5ef-a1e94b22462a.png)

よくわかりません。
で、調べたところ、「Microsoft Visual C++ 2010年再頒布可能パッケージ」が入っているとインストールに失敗するとのこと。
見てみよう。

![プログラムのアンインストール.png](https://qiita-image-store.s3.amazonaws.com/0/95552/df379e91-f2d3-cd07-5c5c-7895b2823b6b.png)

入ってました！
これをアンインストールして、再度インストールすると、できた！
※ここで時間いっぱい使っちゃいました。。。無念。。。
※Windows Updateをすると再度インストールされます。インストール時だけなにか引っかかるようです。

以上で環境の準備ができました。

# 管理証明書の作成と登録

## 証明書の作成

Winsows SDKのインストールでAzureに自己証明書を作成するためのコマンドmaketcertがインストールされました。
それを使って作成しましょう。
環境変数PATHにWindows SDKのbinを指定しておくとよいでしょう。
デフォルトでインストールした場合に追加するPATHは「C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin」です。

`makecert -r -pe -n "CN=Azureで取得したドメイン名" -sky exchange "ファイル名.cer" -sv "ファイル名.pvk"`
を実行すると作成パスワードを設定する画面が２回表示されますので、適当なパスワードを設定して下さい。
これで実行したディレクトリにCERファイルとPVKファイルができます。
※PVKファイルは後ほど使います。

## 証明書の登録

CERファイルをAzureに登録します。
Azureの管理コンソールを開き、左側のメニューに一番下にある[設定]を選択し、右の[管理証明書]タブを選択します。
何も登録されていないと、以下のような画面がでると思います。

![登録画面.png](https://qiita-image-store.s3.amazonaws.com/0/95552/ca097f8c-8bb5-4d48-62ae-38649de1f9ce.png)

下の真ん中にある「アップロード」ボタンを押して、アップロード画面を出します。

![アップロード.png](https://qiita-image-store.s3.amazonaws.com/0/95552/f5077312-f44b-74f6-04d2-ce04698e6620.png)

先ほど作成したCERファイルを選択し、右下のチェックボタンを押して、アップロードします。
アップロードが完了すると、一覧にアップロードした管理証明書が表示されます。

![登録後.png](https://qiita-image-store.s3.amazonaws.com/0/95552/597d672b-3376-e02b-3d55-52f31ea43291.png)

## Javaのキーストアの作成

次にJavaで読み込むJKSファイルを作成するために必要なPFXファイルを作成します。

`pvk2pfx -pvk "ファイル名.pvk" -spc "ファイル名.cer" -pfx "ファイル名.pfx" -pi パスワード`
※このコマンドもWindows SDKのインストールで使えるようになります。
最後のパスワードはmakecertコマンドで作成する際に設定したパスワードを指定して下さい。

そしてにJavaで読み込むJKSファイルを作成します。
今度はJavaで提供されているkeytoolを使用します。

'c:\java\bin\keytool.exe -importkeystore -srckeystore ファイル名.pfx -destkeystore ファイル名.jks -srcstoretype pkcs12 -deststoretype JKS'

以上で証明書の準備と登録が完了です。

# 実装

さて、ようやく実装です。

Eclipseで新たにプロジェクトを作成します。
Mavenのプロジェクトとして作成してください。
pom.xmlはこんな感じです。

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>sample</groupId>
  <artifactId>azuresample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  	<dependency>
  		<groupId>com.microsoft.azure</groupId>
  		<artifactId>azure-management</artifactId>
  	</dependency>
  </dependencies>
  <dependencyManagement>
  	<dependencies>
  		<dependency>
  			<groupId>com.microsoft.azure</groupId>
  			<artifactId>azure-management</artifactId>
  			<version>0.8.0</version>
  		</dependency>
  	</dependencies>
  </dependencyManagement>
</project>
```

こんな実装をしてみます。

```java:Sample.java
package azuresample;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import com.microsoft.windowsazure.Configuration;
import com.microsoft.windowsazure.core.utils.KeyStoreType;
import com.microsoft.windowsazure.exception.ServiceException;
import com.microsoft.windowsazure.management.ManagementClient;
import com.microsoft.windowsazure.management.ManagementService;
import com.microsoft.windowsazure.management.SubscriptionOperations;
import com.microsoft.windowsazure.management.configuration.ManagementConfiguration;
import com.microsoft.windowsazure.management.models.SubscriptionGetResponse;

public class Sample{
	static String uri = "https://management.core.windows.net/";
	static String subscriptionId = "自分のサブスクリプションID";
	static String keyStoreLocation = "先ほど作成したJKSファイルのパス";
	static String keyStorePassword = "先ほど作成したパスワード";

	public static void main(String[] args) throws IOException, URISyntaxException, ServiceException, ParserConfigurationException, SAXException {
		Configuration config = ManagementConfiguration.configure(new URI(uri), subscriptionId, keyStoreLocation, keyStorePassword, KeyStoreType.jks);

		ManagementClient client = ManagementService.create(config);

		SubscriptionOperations operations = client.getSubscriptionsOperations();
		SubscriptionGetResponse response = operations.get();

		System.out.println("name:" + response.getSubscriptionName());
		System.out.println("Status:" + response.getSubscriptionStatus());
		System.out.println("CoreCount:" + response.getCurrentCoreCount());

	}
}
```

実行結果はこうなります。

 > name:無料試用版
 > Status:ACTIVE
 > CoreCount:1

簡単に説明すると

```java:Sample.java
		Configuration config = ManagementConfiguration.configure(new URI(uri), subscriptionId, keyStoreLocation, keyStorePassword, KeyStoreType.jks);
```

接続に必要な情報を詰め込んだConfigureのインスタンスを取得し、

```java:Sample.java
		ManagementClient client = ManagementService.create(config);
```

実際にアクセスするServiceクラスからClientのインスタンスを取得し、

```java:Sample.java
		SubscriptionOperations operations = client.getSubscriptionsOperations();
		SubscriptionGetResponse response = operations.get();
```

Clientからデータを取得し、

```java:Sample.java
		System.out.println("name:" + response.getSubscriptionName());
		System.out.println("Status:" + response.getSubscriptionStatus());
		System.out.println("CoreCount:" + response.getCurrentCoreCount());
```

内容を標準出力に書き出しています。

サブスクリプション名におもっきり日本語が返ってきたのがびっくりしました。
※よく見たらコンソール画面も日本語が書いていますね。

# 参考URL

 - http://blogs.msdn.com/b/windowsazurej/archive/2014/10/03/blog-getting-started-with-azure-management-libraries-for-java.aspx
 - http://blogs.technet.com/b/junichia/archive/2010/11/09/3366763.aspx
 - https://support.microsoft.com/ja-jp/kb/2934068

# おわりに
いかがでしたでしょうか。
AzureのSDKを使ってアクセスするための準備はできたでしょうか。
一度、ここまで準備ができてしまえば、それ以降は開発に専念できそうです。

上のサンプルでは状態を取得しただけですが、仮想マシンを作成したり、Strageを操作したりなどいろいろできます。
基本的な流れは同じで、ServiceからClientを取得して、Clientにあるメソッドを使ってAzureの操作をします。
JavaDoc→http://azure.github.io/azure-sdk-for-java/
これをきっかけにいろいろやってみてください！！