Azure Management Libraries for Java で Azureを管理する

# Azure Management Libraries for Java で Azureを管理する

今回は、ちょっと毛色を変えて、ほとんどの人が使わないであろう管理系のSDKについて解説します。

通常、Azure を操作する方法としてポータルサイトの Web UI からや、PowerShell や Azure CLI の CUI など色々な方法がありますが、 Java をはじめとする各言語からも操作できます。

Azure 上でなんらかのサービス提供したり運用したりする場合、インハウスのツールとして独自の管理ツールを作るユースケースもあるかと思いますので、今回は Java から Azure のリソースを作成したり削除したりしてみたいと思います（強引）。

# Management Libraries とは

Azure SDK for Java には、Client ライブラリ と Management ライブラリの2つがありますが、後者がAzureを操作するSDKに当たります。

最新のSDK状況は以下にまとまっており、ライブラリは、Maven central repository にホストされています。

[Azure SDK for Java (Mgmt) | Azure SDKs](https://azure.github.io/azure-sdk/releases/latest/mgmt/java.html)

# サブスクリプションへを操作するための資格情報を設定する

Java から Azure のリソースを操作するのですから、当然何らかの資格情報が必要です。これはサービスプリンシパルオブジェクト(SP)と呼ばれ `az` コマンドから作成できます。内部的には、SPが作成されて、そのSPにサブスクリプションのアクセス権限が割り当たります。

注意として、サブスクリプション全体にContributer権限でロールが付与されるので、もし作成したツールを運用するような場合は、適切な権限（その操作をするにあたって最小の権限）を付与するよう管理してください。

```
az ad sp create-for-rbac --name javasamples
```

コマンドを実行すると、以下のようなJSONが出力されますが、間違っても漏洩しないようにしてください。

```json
{
  "appId": "xxxxxxxx-yyyy-zzzz-xxxx-yyyyyyyyyyyy",
  "displayName": "javasamples",
  "name": "http://javasamples",
  "password": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
  "tenant": "xxxxxxxx-yyyy-zzzz-xxxx-yyyyyyyyyyyy"
}

```

# ストレージアカウントを作ってみる

必要なSDKの依存関係としては以下が必要ですので、pom.xmlに追加してください。

```xml
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-identity</artifactId>
      <version>1.2.5</version>
    </dependency>
    <dependency>
      <groupId>com.azure.resourcemanager</groupId>
      <artifactId>azure-resourcemanager</artifactId>
      <version>2.3.0</version>
    </dependency>
```

作成までには大きく分けて3つのステップがあって、

1. 資格情報のインスタンスを作成する
2. 資格情報を元に `AzureResourceManager` インスタンスを生成
3. `AzureResourceManager` から ストレージアカウントを作成する

ような感じになります。

最初に 資格情報を定義する `ClientSecretCredential` インスタンスを作成します。サブスクリプションの認証方法はこれ以外にもありますが、ここでは、先ほどSPを作成したときに、取得した以下の情報、

* テナントID
* クライアントID（アプリケーションID)
* クライアントシークレット（パスワード）

が、取得できるので、それらを引数にインスタンスをビルドします。

```java
        ClientSecretCredential creds = new ClientSecretCredentialBuilder()
            .tenantId(tenantId)
            .clientId(clientId)
            .clientSecret(clientSecret)
            .build();
```

繰り返しますが、これらの情報は漏れないように気をつけてください。

次に、`AzureResourceManager` インスタンスを生成します。`authenticate`メソッドに資格情報とプロファイルを渡します。 プロファイルは、`AzureEnvironment.AZURE` を渡せば問題ないのですが、標準以外のデータセンタ（US政府ドイツ、中国）の場合は、異なる値を渡します。

サブスクリプションの選択もいかは、デフォルトを指定していますが、`withSubscription(String)` で指定したりもできます。

```java
        AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);

        AzureResourceManager azureResourceManager = AzureResourceManager
            .configure()
            .withLogLevel(HttpLogDetailLevel.BASIC)
            .authenticate(creds, profile)
            .withDefaultSubscription();
```

最後にストレージアカウントを作成します。UI 作成する場合と同じような引数をメソッドチェインで与えていきます。`withNewResourceGroup` なのでリソースグループは存在しなくても作成してくれます。

```java
       String storageAccountName = "qa" + (new Date()).getTime();
        String rgName = "qiitaazure-rg";
        StorageAccount account = azureResourceManager.storageAccounts().define(storageAccountName)
            .withRegion(Region.JAPAN_EAST)
            .withNewResourceGroup(rgName)
            .withSku(StorageAccountSkuType.STANDARD_LRS)
            .create();
```

アカウント名が重複していたり、規約に反していると例外がでますが、あらかじめ アカウント名は `StorageAccounts#checkNameAvailability` メソッドでチェックするとこができます。

## 削除するには

申し訳程度に削除について触れておくと、`azureResourceManager.storageAccounts().deleteByResourceGroup(resourceGroupName, name)` で削除できます。特に難しい話ではありませんね。

# まとめ

色々とお作法があるのですが、 Management ライブラリ使うとAzure リソースをJavaから操作することができますので、一度お試しを。次は、VMとかの作成、削除などものやってみたいと思います。