normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Microsoft Azure SDK for Java の Management Library を利用する

以前に Windows Azure SDK for .NET の Management Library を利用して Webサイト を動的に作成してみる を記載したが、今回は JavaSDK で Management API を操作する。

証明書の準備

まず、 C:\Program Files (x86)\Windows Kits\8.1\bin\x86 以下に存在する makecert コマンドを利用して cer ファイルを作成する。以下のコマンドを利用したので、ファイル名等は適宜変更してほしい。

>makecert -r -pe -a sha1 -n "CN=For Java SDK Certification" -ss my -len 2048 -sp "Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 ManagementJavaSDK.cer

次に、作成した *.cer ファイルをダブルクリックし、証明書のエクスポートを実施して *.pfx ファイル(今回は ManagementJavaSDK.pfx )を作成する。
f:id:waritohutsu:20150208023553p:plain

更に、以下のコマンドにて Java で利用する keystore の *.jks ファイル(今回は ManagementJavaSDK.jks )を作成する。

>keytool -importkeystore -srckeystore c:\Temp\ManagementJavaSDK.pfx -dest keystore ManagementJavaSDK.jks -srcstoretype pkcs12 -deststoretype JKS

最後に、作成した *.cer ファイルを管理ポータルに以下の様にアップロードしておく(設定 - 管理証明書 以下に配置する点に注意)。
f:id:waritohutsu:20150208023602p:plain

Java アプリケーションの作成

こちらはシンプルに Maven プロジェクトを作成すれば対応可能だ。それぞれコードを記載する。

<?xml version="1.0" encoding="UTF-8"?>
<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>com.mycompany</groupId>
	<artifactId>HelloAzureSDK</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>jar</packaging>
	<dependencies>
		<dependency>
			<groupId>com.microsoft.azure</groupId>
			<artifactId>azure-management-network</artifactId>
			<version>0.7.0</version>
		</dependency>
	</dependencies>
</project>
package com.mycompany;

import java.io.IOException;
import java.net.InetAddress;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

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.configuration.ManagementConfiguration;
import com.microsoft.windowsazure.management.network.NetworkManagementClient;
import com.microsoft.windowsazure.management.network.NetworkManagementService;
import com.microsoft.windowsazure.management.network.StaticIPOperations;

public class Main {

	public static void main(String args[]) throws IOException,
			URISyntaxException, ServiceException, ParserConfigurationException,
			SAXException {

		// キーストア等々もろもろ
		String subscriptionId = "120a0546-b790-4979-84da-09d671c0c376";
		String keyStorePath = "C:\\Temp\\ManagementJavaSDK.jks";
		String keyStorePassword = "P@ssw0rd00";

		Configuration config = ManagementConfiguration.configure(null,
				subscriptionId, //
				keyStorePath, //
				keyStorePassword, //
				KeyStoreType.fromString("jks"));
		NetworkManagementClient networkManagementClient = NetworkManagementService
				.create(config);

		// 仮想ネットワーク内の静的IP利用チェック
		StaticIPOperations so = networkManagementClient
				.getStaticIPsOperations();

		List<String> ipList = new ArrayList<String>();
		ipList.add("10.0.0.21"); // 利用可能な IP
		ipList.add("10.20.0.21"); // サブネット範囲外の IP

		String vnetName = "vnet-alwayson";

		for (String ip : ipList) {
			try {
				boolean isAvailable = so.check(vnetName,
						InetAddress.getByName(ip)).isAvailable();
				System.out.println(ip + " is " + isAvailable + " on "
						+ vnetName);
			} catch (ServiceException ex) {
				System.out.println(ip + " is false on " + vnetName);
				ex.printStackTrace();
			}
		}
	}
}

上記の実行結果は以下な感じ。

log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAddCookies).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
10.0.0.1 is false on vnet-alwayson
10.20.0.21 is false on vnet-alwayson
com.microsoft.windowsazure.exception.ServiceException: BadRequest: The address 10.20.0.21 is not contained in any of the subnets in the virtual network.
	at com.microsoft.windowsazure.exception.ServiceException.createFromXml(ServiceException.java:216)
	at com.microsoft.windowsazure.management.network.StaticIPOperationsImpl.check(StaticIPOperationsImpl.java:165)
	at com.mycompany.Main.main(Main.java:52)