Azure Batch で Java アプリケーションを実行する

# はじめに
**Azure Batch** はオートスケール可能な仮想マシン (VM) 上で任意のスクリプトやアプリケーションを実行できる便利なサービスです。VM に JVM (Java Virtual Machine) がインストールされていれば Java アプリケーションも実行することができます。

公式ドキュメントでは .NET や Python アプリケーションについてのクイックスタートがありますが Java のドキュメントは現状無いため、本記事では、Azure Batch 上で Java アプリケーションを実行する流れを簡単にまとめたいと思います。

大筋は以下のクイックスタートの記事に沿っていますので、合わせてご覧ください。
[Azure クイックスタート: Azure portal で最初の Batch ジョブを実行する - Azure Batch | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/batch/quick-create-portal)

# Batch 関連リソース作成
それでは順に Batch 関連のリソース (アカウント、プール、ジョブ、タスク) を作成していきます。各リソースの大まかな解説は以下の通りです。

- アカウント : Azure Batch の最上位のリソースです。
- プール : VM の集合であり、計算資源としての役割を持ちます。1 つのアカウントに複数のプールを作成することができます。
- ジョブ : 計算の単位であるタスクの集合です。ジョブは 1 つまたは複数のプールに関連付けることができます。配下のタスク群は、ジョブに関連付けられたプールを計算資源として利用します。
- タスク : 計算の単位です。アプリケーションの実行コマンドなどを定義します。

## Batch アカウント作成
Azure ポータルの検索ボックスで [Batch] と入力すると [Batch アカウント] が候補に表示されますのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/4de086e6-311d-41f9-535c-aeb069626790.png)

新しい Batch アカウントの画面では任意のリソースグループ名やアカウント名などを入力します。Batch アカウントにストレージアカウントを関連付けることができますので [ストレージ アカウントの選択] のリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/84ee306a-cd27-0f57-0b27-f77a26e60941.png)

既存のストレージアカウント、または新規作成を選ぶことができます。ここでは新規でストレージアカウントを作成します。特にこだわりが無ければ推奨されている StorageV2 (汎用 v2) を選択します。レプリケーションは要件に合わせて任意のレベルを設定ください (ここでは最もコストが安いローカル上長ストレージを選択しています)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/77b70a9b-81e1-b923-6569-cd460be78446.png)

後の設定は任意です。問題なければ作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/dca1d35d-b4ec-98a3-d333-57996ff56b91.png)

## プールの追加
Batch アカウントの左側メニュー [プール] にて [追加] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/aa6fb131-1be0-d907-f670-4320acc27b3a.png)

ここで VM (の集合) を作成するため、設定項目がかなり多いです。まずイメージですが、様々な種類を選ぶことができます。ここでは以下の内容を選択しています。

- 発行者 : canonical
- オファー : ubuntuserver
- SKU : 18.04-lts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/87533ebe-2f4d-a15f-d21b-047428761161.png)

選択可能なイメージについては本記事末尾に表形式でまとめています。
[APPENDIX - 選択可能なイメージの種類](https://qiita.com/nakazax/items/47daae65708bc3188cbf#appendix---%E9%81%B8%E6%8A%9E%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E7%A8%AE%E9%A1%9E)

選択可能な VM サイズは以下のドキュメントをご覧ください。
[プールの VM サイズを選択する - Azure Batch | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/batch/batch-pool-vm-sizes)

ここでは VM サイズはデフォルトの [Standard A1] を選択しています。スケーリングは台数固定か自動スケールを選択できますが、ここでは [固定] とし、1 台の VM が起動するようにしています。
開始タスクにて VM が起動する際に実行するコマンドを定義できます。[有効] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/009d5606-2349-e5a8-63ea-1e02a60dca71.png)

(開始タスク)
先に選択した Ubuntu 18.04-lts のイメージには JVM がインストールされていないため、開始タスクの [コマンドライン] に JVM のインストールコマンド `apt install -y openjdk-11-jdk` を定義します。合わせて [ユーザーID] を [プール autouser、管理者] に変更します。残りの設定は任意で、問題なければ [OK] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/3d28cfb3-ec0d-e0b4-6958-6011f2414a45.png)

プールの追加では他にも仮想ネットワークなど色々な設定ができますが、ここでは最小限とし [OK] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/1b7bf0e4-5759-8c05-1fdf-f7da8c0d72ce.png)

これでプールの作成は完了です。専用ノードが 0 -> 1 になっていますが VM の起動中を意味します。これが 1 になったら VM の起動は完了です。もし 1 にならない場合はノードの起動に失敗しています。開始タスクが正しく設定されていない可能性などがあるため、ミスなどが無いか見直してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/75d4765b-d7cd-5ecb-d354-f8b03cdaaca8.png)

## ジョブの追加
Batch アカウントの左側メニュー [ジョブ] にて [追加] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/93f06f08-8a2f-37c4-1ba6-6789fd6b509d.png)

任意のジョブ ID、関連付けるプールを選択し [OK] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/381356a1-d318-d968-17ee-836ff7cc2a3e.png)

### モード & 詳細設定
モードと詳細設定でより細かい制御を行うことができますが、ここでは特に設定せずに参考としてキャプチャだけ載せておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/96887427-61ad-e278-48cc-34e354dbe0fb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/48d1ce91-366b-27b0-5e1f-7f4745424383.png)

## タスクの追加 (Java 動作確認)
Java が問題なくインストールされていることを確認するため、Java のバージョン確認のコマンドをタスクにて実行していきます。

先に作成したジョブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/30c530a0-780c-7002-e746-07c7a25b5c1b.png)

タスクの追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/bfb92d6d-96dd-0cc9-1449-bd143f445b41.png)

任意 & ジョブ内で一意なタスク ID を入力、コマンドラインに `java --version` を入力し、[送信]　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/822987c3-dbcb-4210-1402-2fb504692e42.png)

すると、タスクはジョブのキューに送信され、アクティブ → 実行中 → 完了という状態遷移をします。他のタスクが実行されていない状態のためあまり待たずにタスクの実行が完了するはずです。詳細を確認するため送信したタスクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/f8cfef58-1ed2-3990-331c-627f1852f2ad.png)

正常にタスクが完了していれば、標準エラーへの出力結果「stderr.txt」や標準出力への出力結果「stdout.txt」などが表示されるはずです。stdout.txt をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/925ad31d-96a5-37a5-301a-2a1615e4b7ef.png)

以下のように Java のバージョン情報が出力されていれば OK です。
これで Java アプリケーションを実行するための Batch 関連リソースの準備が整いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/9dd9814c-7573-ea4a-fa09-3b308aaa1650.png)

# Java アプリケーションの実行
ここから本題の Java アプリケーションの実行に入ります。実行可能 JAR ファイルをストレージアカウントにアップロードし、その JAR ファイルを Batch のタスクでダウンロードして実行する流れになります。

## 実行可能 JAR ファイルの準備
適当な実行可能 JAR ファイルを準備します。ここでは以下の Spring Boot + Sprint Batch のサンプルアプリケーション作成の手順を進めることで生成できる実行可能 JAR ファイルを利用します。

https://spring.io/guides/gs/batch-processing/

## JAR ファイルをストレージアカウントにアップロード
Batch アカウントに関連付けたストレージアカウントに適当な Blob コンテナーを作成して JAR ファイルをアップロードしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/ae1a448b-4383-b992-caf3-107d0d705e3d.png)

## タスクの追加 (Java アプリケーション実行)
Batch アカウントのジョブからタスクの追加を行います。コマンドラインでは以下の JAR 実行のコマンドを入力します。JAR ファイルのダウンロード設定のため [リソースファイル] をクリックします。

```
java -jar batch-processing-0.0.1-SNAPSHOT.jar
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/f1272bd7-c9a4-d717-9293-c5b86ea39bce.png)

リソースファイルの設定画面で [ストレージ BLOB の選択] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/3f7fadf0-c2b9-6bce-c57e-4a18f6bec39c.png)

[SAS を含める] にチェック、[有効期限] は任意の値 (ここではデフォルトの 7) を入力し [OK] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/ea8ea2db-9d2c-28b6-3723-16dcfcbc8a02.png)

アップロードした JAR ファイルを指定して [選択] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/2b1b84e9-3e98-05aa-165c-7ed0b7b26078.png)

[送信] をクリックします。これにより、タスクで定義したコマンドラインを実行する前に、当該 JAR ファイルが VM の作業ディレクトリにダウンロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/c0c74fba-70b4-4a3e-12c6-df15bf767001.png)

タスクの送信 & 実行完了後、以下のように状態が完了になっており、stdout.txt に標準出力結果が出力されていれば、処理は正常に完了しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/2dfd394d-fbaf-e8c8-1490-e63d7e161825.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/7c91f43e-4c8e-75bc-f71a-334282a9c7f1.png)

本編は以上となります。

# APPENDIX - 選択可能なイメージの種類
2020 年 9 月 20 日時点でイメージの種類 - Marketplace から選択可能な項目の一覧です。あくまで一時点のスナップショットですので、最新情報は Azure ポータルからご確認ください。

## イメージの種類
- Marketplace
- Cloud Services (Windows のみ)
- カスタム イメージ - 共有イメージギャラリー
- グラフィックスとレンダリング

## イメージの種類 - Marketplace
発行者 | オファー | SKU
--- | --- | ---
canonical | ubuntuserver | 16.04-lts
canonical | ubuntuserver | 18.04-lts
credativ | debian | 8
credativ | debian | 9
debian | debian-10 | 10
micrsoft-azure-batch | centos-container | 7-7
micrsoft-azure-batch | centos-container-rdma | 7-4
micrsoft-azure-batch | centos-container-rdma | 7-7
micrsoft-azure-batch | ubuntu-server-container | 16-04-lts
micrsoft-azure-batch | ubuntu-server-container-rdma | 16-04-lts
micrsoftwindowsserver | windowsserver | 2008-r2-sp1
micrsoftwindowsserver | windowsserver | 2008-r2-sp1-smalldisk
micrsoftwindowsserver | windowsserver | 2012-datacenter
micrsoftwindowsserver | windowsserver | 2012-datacenter-smalldisk
micrsoftwindowsserver | windowsserver | 2012-r2-datacenter
micrsoftwindowsserver | windowsserver | 2012-r2-datacenter-smalldisk
micrsoftwindowsserver | windowsserver | 2016-datacenter
micrsoftwindowsserver | windowsserver | 2016-datacenter-smalldisk
micrsoftwindowsserver | windowsserver | 2016-datacenter-with-containers
micrsoftwindowsserver | windowsserver | 2019-datacenter
micrsoftwindowsserver | windowsserver | 2019-datacenter-core
micrsoftwindowsserver | windowsserver | 2019-datacenter-core-smalldisk
micrsoftwindowsserver | windowsserver | 2019-datacenter-core-with-containers
micrsoftwindowsserver | windowsserver | 2019-datacenter-core-with-containers-smalldisk
micrsoftwindowsserver | windowsserver | 2019-datacenter-smalldisk
micrsoftwindowsserver | windowsserver | 2019-datacenter-with-containers
micrsoftwindowsserver | windowsserver | 2019-datacenter-with-containers-smalldisk

以上です。