みなさまこんにちは。クラウドアーキテクトの卵です。
毎度恒例のリモートワークネタですが、個人的にリモートワークになって良かったこと / 困ったことをご紹介します。
前回のブログで、Azure CLI で作成されている『とあるプログラム』を定期実行したい、という思いから、いろいろ検討した結果 Azure Batch を利用することに決めました。
今回、大規模な並列コンピューティングやハイパフォーマンス コンピューティング ( HPC ) といった Azure Batch の特性は十分生かし切れていないのが残念ですが、Azure Batch の基本的な作成方法・設定方法について、備忘録も兼ねて本ブログでまとめることにしました。
前回のブログにも記載しましたが、Azure Batch は以下のようなリソース構成になっています。
基本的には、以下の順にリソースを作成していきます。
今回は上記の他にも、プログラムの自動実行に必要なサービスプリンシパルの設定や Azure CLI のセットアップの組み込み、定期実行に必要なジョブスケジュールの設定が必要となります。
下に行くほど設定箇所が多いので、ブログの分量もいつもよりも長く&多くなりますが、早速 Azure Batch 環境を構築し、『とあるプログラム』を動かしてみることにします!
Batch アカウントは Batch サービス内で一意に識別されるエンティティです。Azure Batch を利用する際、まず作成するのが Batch アカウントです。
1) Azure ポータル上から「すべてサービス」→「Batch」を検索します。
2) 「+追加」をクリックするか、「Batch アカウントの作成」をクリックします。
3) 以下を入力・選択後、「ストレージアカウントの選択」をクリックしてストレージアカウントを選択します。
左右にスクロールしてご覧ください。
新しい Batch アカウント 基本タブ | 入力値 |
---|---|
サブスクリプション | Azure Batch を作成するサブスクリプションを選択。 |
リソースグループ | Azure Batch を作成するリソースグループを選択。 |
アカウント名 | Batch アカウントを特定する名前。他の Batch アカウント名と重複しないようにすること。 ※名前に使用できるのは、小文字と数字だけ。 |
場所 | Azure Batch を使うリージョンを選択。 日本だと「東日本」「西日本」の両方が選択可能。 |
4) 下図がストレージアカウントを選択した状態です。この状態で「次へ:詳細設定」をクリックします。
5) 以下を入力・選択して「次へ:タグ」をクリックします。
左右にスクロールしてご覧ください。
新しい Batch アカウント 詳細設定タブ | 入力値 |
---|---|
ID の種類 | なし:プラットフォーム マネージド キーを使用して、証明書、ジョブとタスクのメタデータなど、Azure Batch サービスに格納されているすべての顧客データが自動で暗号化される。 システム割り当て済み:カスタマー マネージド キーを使用して、Azure Batch に格納されているデータを暗号化したい場合に選択。Key Vault 必須。 |
パブリック ネットワークアクセス | 有効:パブリック エンドポイントを作成し、Azure Batch にパブリックにアクセス可能。 無効:プライベート エンドポイント経由で Azure Batch アカウントに接続したい場合に選択。 |
プール割り当てモード | Batch サービス:Batch で管理されているサブスクリプションにバックグラウンドでプールが割り当てられる。ほとんどのシナリオではこれ一択。 ユーザーサブスクリプション:プールの作成時に Batch VM などのリソースがサブスクリプションに直接作成される。 |
6) 必要ならタグをつけて「次へ:確認と作成」をクリックします。
~余談~
タグはできるだけルールを決めて付与しておいた方が、請求時等に可視化しやすいのでお勧めします。
7) 「検証に成功しました」と表示されたら、内容を確認して「作成」をクリックします。
8) これで Batch アカウントの作成が完了しました。
プールはアプリケーションが実行されるノード(=仮想マシン)を 1 つにまとめた単位です。Batch アカウントの中にプールという枠があり、プール内に仮想マシンが数台存在していると思っていただけたら、理解がしやすいかと思われます。
ここでは、Batch アカウントの作成に引き続き、プールの作成を行っています。
1) Batch アカウントの作成後、「リソースに移動」をクリックします。
2) 「プール」→「+追加」をクリックします。
3) 以下を入力・選択して「OK」をクリックします(入力値が多いけどがんばってください!)。
左右にスクロールしてご覧ください。
プールの追加 | 入力値 |
---|---|
プール ID | アカウント内のプールを一意に識別する文字列。 |
表示名 | プールの表示名。一意である必要はなく、最大 1024 文字の Unicode 文字を使用可能。 |
イメージの種類 | Marketplace:Azure Marketplace イメージを使用して VM をデプロイする場合に選択。※大抵の場合、これになるはず。 Cloud Services:クラウド サービス worker ロール VM をデプロイする場合に選択。Windows のみ。 カスタム イメージ - 共有イメージギャラリー:カスタム VM イメージを使用してデプロイする場合に選択。 グラフィックスとレンダリング:プレミアム グラフィックスとレンダリング アプリケーションを事前にインストールした VM をデプロイする場合に選択。 |
未確認のイメージを有効にする | オンにすると、未確認のイメージを有効にすることが可能。 |
発行者 | イメージを発行している会社を選択。 canonical:ubuntuserver debian:debian-10 microsoft-azure-batch:centos-container、ubuntu-server-container microsoftwindowsserver:windowsserver openlogic:centos |
オファー | OS の種類。 上記「発行者」によって変わる。 |
SKU | OS のバージョン。 上記「発行者」によって変わる。 |
Batch ノード エージェント SKU ID | 「発行者」「オファー」「SKU」を全て入力すると、自動で入力される。 例)openlogic:centos 8_2 の場合 → batch.node.centos 8 |
自動更新を有効にする (Windows のみ) | (何だろう?どの組み合わせでもデフォルトでグレーアウトされている) |
Disk Encryption 構成 | 仮想マシンのディスク暗号化設定。OS ディスクや Temp ディスクを暗号化できる。Windows クラウドサービスおよび Linux の共有イメージギャラリーではサポートされていない。 |
データ ディスク | プール内の計算ノードにアタッチされているデータ ディスクの構成。 プール内の計算ノードに空のデータ ディスクをアタッチする必要がある場合はデータ ディスクを指定できる。 |
コンテナー構成 | カスタム イメージ、microsoft-azure-batch コンテナー イメージ、およびコンテナーが有効にされた Windows サーバーでのみサポートされる。 |
レンダリング用の測定ライセンス | 事前インストールされたアプリケーションを使用する必要がある場合に指定する。プールで使用できる許可されているライセンスは、'maya'、'vray'、'3dsmax'、'arnold'。プールに追加されたアプリケーション ライセンスごとに、追加料金が適用される。 |
VM サイズ | プール内の仮想マシンのサイズ。プール内のすべての仮想マシンは、同じサイズとなる。 |
モード | VM のスケール設定。「固定」か「自動スケール」を選択。 |
ターゲットの専用ノード数 | ※「モード」が「固定」の場合 プール内のノード数を数字で入力。 |
ターゲットの低優先度ノード | ※「モード」が「固定」の場合 必要な低優先度ノードのターゲット数を数字で入力。 |
サイズ変更のタイムアウト | ※「モード」が「固定」の場合 サイズ変更操作がタイムアウトするまでの時間 (分) |
開始タスク | 各コンピューティング ノードがプールに参加した際、そのノードに対して実行するタスクがある場合に指定。このタスクは、ノードがプールに追加されたときまたはノードが再起動されたときに実行される。 有効にすると、コマンドラインや再試行回数等が設定できる。 |
ノードごとの最大タスク数 | プール内の 1 つのコンピューティング ノードで同時に実行できるタスクの最大数。既定値は 1。 |
ユーザー アカウント | プール内の各ノードに対して作成されるユーザー アカウントの一覧。 |
タスク スケジュール ポリシー | プール内のコンピューティング ノード間で Batch サービスがタスクを分散する方法を定義。 パック: 1 つのノードにできる限り多くのタスクを割り当ててから、プール内の別のノードにタスクを割り当てるように指定 分散:プール内のすべてのノードに対して均等にタスクを割り当てるように指定 |
ノード間通信 | プールでノード間の直接的な通信を許可するかどうかを指定。 |
アプリケーション パッケージ | ノードにダウンロードされるアプリケーション パッケージ。 ここをクリックすると、アプリケーション パッケージをアップロードできる( zip 形式)。 |
証明書 | プール内の各コンピューティング ノードにインストールされる証明書。 ここをクリックすると、証明書をアップロードできる( pfx または cer 形式)。 |
プール エンドポイントの構成 | Batch プール内にあるコンピューティング ノード上のエンドポイントの構成。 ここをクリックすると、受信 NAT プールを構成することができる。 |
ネットワーク構成 | 仮想ネットワークをこのプールに関連付ける。 ここをクリックすると、Batch アカウントと同じ場所にある VNet を選択できる。ここから VNet の新規作成も可能。 |
サブネット | 上記「ネットワーク構成」で選択した VNet のサブネットを選択。 |
IP アドレスのプロビジョニングの種類 | プールでパブリック IP アドレスをプロビジョニングする方法を指定。 BatchManaged:パブリック IP アドレスを自動的に作成および管理する NoPublicAddress:パブリック IP アドレスを作成しない |
4) これでプールが作成されます。一見、すぐ作成されているように見えますが、下図のように「割り当ての状態」が「サイズ変更中」の間はコンピューティング ノードを割り当てて開始する準備中となるため、この状態ではジョブを実行することはできません。
ジョブやタスクを作成することは可能です。
5) 「割り当ての状態」が「安定」になると、コンピューティング ノードが割り当たり、ノードが開始されます。この状態になってから、ジョブを実行することができます。
Azure Batch を利用して Azure CLI を自動実行するためには、サービスプリンシパルが必要になります。サービスプリンシパルを利用することで、Azure AD でアプリケーションを認証できます。
【参考:Batch サービスの認証に Active Directory を使用する】
https://docs.microsoft.com/ja-jp/azure/batch/batch-aad-auth
サービスプリンシパルの認証には、パスワードベースの認証と証明書ベースの認証があります。しかし、以下の URL にあるように、パスワードベースでの認証はサポートされなくなった模様なので、証明書ベースの認証を実施します。
今回、証明書が無いので自己証明書を作成することにします。自己証明書は Azure CLI のコマンドで簡単に作成できます。
【参考:証明書ベースの認証】
https://docs.microsoft.com/ja-jp/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest#certificate-based-authentication
1) Azure Cloud Shell にアクセスし、以下のコマンドを実行します。
※赤字部分はサービスプリンシパルの名前になります。任意で設定してください。
2) 1)のコマンドを実行した場所に証明書が作成されます。1)のコマンドを実行後、下図赤線のようなメッセージが出力されるので、その場所にある .pem ファイルを大事に保管しておいてください。サービスプリンシパルでログインする際に指定する必要があります。
3) Azure Portal 上でも作成されていることを確認します。「Azure Active Directory」→「アプリの登録」をクリックします。
1)で作成したサービスプリンシパルが確認できます。
4) 作成した自己証明書もアップロードされていることを確認します。2)から作成したサービスプリンシパルをクリックして「証明書とシークレット」をクリックします。
証明書がアップロードされているはずです。
5) 証明書ベースのサービスプリンシパルでログインできるかどうかを確認します。Azure Cloud Shell にアクセスし、以下のコマンドを実行します。
左右にスクロールしてご覧ください。
赤字部分 | 入力値 |
---|---|
APP_ID | 作成したサービスプリンシパルにある、「アプリケーション(クライアント)ID」を入力 ※下図参照 |
TENANT_ID | 作成したサービスプリンシパルにある、「ディレクトリ(テナント)ID」を入力 ※下図参照 |
/path/to/cert の部分 | 1)で作成した証明書を置いているパスを記載。 |
6) 5)のコマンドを実行後、ログインが成功している場合は以下のように表示されます。
7) 証明書ベースのサービスプリンシパルでログインできたら、5)のログインスクリプトを実行させたいプログラムに追記します。
今回動かしたい『とあるプログラム』は、下図の「 main.azcli 」がメインプログラムになるため、「 main.azcli 」の冒頭部分に追記しています。その際、証明書へのパスが通るように記載することが重要です。
これでサービスプリンシパルの設定は完了です。後続の作業のため、先に以下を実施しておきます。
「2. Batch アカウントの作成」の3)で選択したストレージアカウントのコンテナーに、今回動かしたい『とあるプログラム』一式と証明書を配置します。
※下図は、Azure Storage Explorer 経由でストレージアカウントのコンテナーに配置した図です。
ジョブは、後述するタスクを 1 つにまとめた単位です。プール内のコンピューティング ノード上で行う計算を、タスクを用いてどのように実行するかを管理します。処理を実行する上でのコントローラーというイメージを持っていただけたら、理解しやすいのではないかと思います。
1) Azure ポータル上で Batch アカウントを選択後、「ジョブ」→「+追加」をクリックします。
2) 以下を入力・選択します。
※「OK」のクリックはもうちょっと待ってください!
左右にスクロールしてご覧ください。
ジョブの追加 | 入力値 |
---|---|
ジョブ ID | Batch アカウント内でジョブを一意に識別する文字列を入力。 |
プール | Batch サービスがジョブのタスクを実行するプールを指定。 |
【ジョブ マネージャー タスク、ジョブの準備タスク、ジョブのリリース タスク】モード | 「カスタム」にすると、ジョブ マネージャー タスク、ジョブの準備タスク、ジョブのリリース タスクが指定できる。 |
ジョブ マネージャー タスク | ※「モード」が「カスタム」の時のみジョブの開始時に起動するジョブ マネージャー タスクの詳細を指定。 ジョブがジョブ マネージャー タスクを指定しない場合は、ユーザーが明示的にジョブにタスクを追加する必要がある。 ジョブがジョブ マネージャー タスクを指定する場合は、ジョブが作成されるときに Batch サービスがジョブ マネージャー タスクを作成し、ジョブの他のタスクをスケジュール設定する前にジョブ マネージャー タスクをスケジュール設定しようとする。 |
ジョブの準備タスク | ※「モード」が「カスタム」の時のみジョブの準備タスクを指定。 ジョブにジョブの準備タスクがある場合、Batch サービスは、コンピューティング ノードでジョブの準備タスクを実行してから、そのコンピューティング ノードでそのジョブのすべてのタスクを開始する。 ※使い方は後述。 |
ジョブのリリース タスク | ※「モード」が「カスタム」の時のみジョブのリリース タスクを指定。 Batch サービスは、ジョブの準備タスクを実行したコンピューティング ノード上でジョブのリリース タスクを実行する。 ジョブのリリース タスクを指定するには、ジョブの準備タスクも指定する必要がある。 |
【詳細設定】モード | 「カスタム」にすると、ジョブの詳細設定ができる。 |
表示名 | ※「モード」が「カスタム」の時のみジョブの表示名。一意である必要はなく、最大 1024 文字までの Unicode 文字を使用可能。 |
最大実時間 | ※「モード」が「カスタム」の時のみ無制限:ジョブの実行時間に関する制限は無い。 カスタム:ジョブの実行時間を「日」「時間」「分」「秒」で選択できる。 ジョブの実行の最大経過時間は、ジョブの作成時刻から計測される。 制限時間内にジョブが完了しない場合、Batch サービスはそのジョブと実行中のタスクをすべて終了する。この場合、終了理由は MaxWallClockTimeExpiry になる。 |
タスクの最大再試行回数 | ※「モード」が「カスタム」の時のみ各タスクを再試行できる最大回数。Batch サービスは、その終了コードが 0 以外の場合にタスクを再試行する。Batch サービスは一度タスクを試行した後、この制限まで再試行する。 なし:再試行無し。 カスタム:再試行できる最大回数を入力。 無制限:終了コードが 0 になるまで試行を繰り返す。 |
優先度 | ※「モード」が「カスタム」の時のみジョブの優先度。優先度の値の範囲は -1000 (優先度が最も低い) から 1000 (優先度が最も高い) まで。 |
タスクの依存関係を有効にします | ※「モード」が「カスタム」の時のみ True の場合、Batch サービスはタスクが完了する (つまり、終了コード 0 で終了する) まで待ってから、コンピューティング ノード上のすべてのタスクをスケジュールする。 |
すべてのタスクが完了したとき | ※「モード」が「カスタム」の時のみこのスケジュールで作成されたジョブ内のタスクがすべて完了状態のときに Batch サービスによってとられるアクション。ジョブにタスクが含まれていない場合、すべてのタスクが完了したと見なされる。このため、このオプションはジョブ マネージャー タスクと一緒によく使用される。ジョブ マネージャーを使用せずに、自動ジョブ終了を使用する場合、最初に onAllTasksComplete を noaction に設定し、タスクの追加が完了したら、onAllTasksComplete が terminatejob に設定されるようにジョブ プロパティを更新する。既定値は noaction |
タスクが失敗したとき | ※「モード」が「カスタム」の時のみこのスケジュールで作成されたジョブ内のいずれかのタスクが失敗した場合に Batch サービスによってとられるアクション。タスクに failureInfo があると、そのタスクは失敗したと見なされる。指定されている再試行回数を繰り返した後にタスクがゼロ以外の終了コードで完了した場合、または、タスクの起動でエラーが発生した場合 (たとえば、リソース ファイルのダウンロード エラー) に、failureInfo が設定される。 既定値は noaction |
共通の環境設定 | ※「モード」が「カスタム」の時のみ共通する環境変数設定の一覧。これらの環境変数は、ジョブに含まれるすべてのタスク (ジョブ マネージャー タスク、ジョブの準備タスク、ジョブのリリース タスクなど) に設定されている。個々のタスクは、値が異なる同じ設定名を指定することで、ここで指定された環境設定をオーバーライドすることができる。 |
ここでのポイントは、ジョブの準備タスクです。
今回実行したい『とあるプログラム』は、Azure CLI で作成されています。
ここまで Batch アカウントとプール(+サービスプリンシパル)を作成してきました。プールの中に仮想マシンが数台立っている状態ですが、このままでは Azure CLI のコマンド( az コマンド)を受け付けてくれません。なぜなら、プールの中の仮想マシンに、Azure CLI がインストールされていないからです。
(いつも思うんだけど、VM に最初からインストールされていて、オン / オフで切り替えてくれたらいいのに。。。セキュリティ上、過剰なものは入れないのかな?)
ジョブの準備タスクを設定すると、最初のタスクが実行される前に 1 回だけ動作するプログラムが設定できます。そのため、ジョブの前処理として活用できます。
上記の設定に加え、ジョブの準備タスクに Azure CLI をインストールする設定を組み込みます。
今回、プールの作成の際に Openlogic の CentOS を選択しているので、最新バージョンを yum でインストールします。
【参考:LinuxにAzureCLIをインストールする】
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-linux?pivots=yum&view=azure-cli-latest
3) 以下のコマンドをテキストファイルに貼り付け、「init.azcli」と名前をつけて保存します。
4) 「init.azcli」の保存後、今回動かしたい『とあるプログラム』一式が置いてある「2. Batch アカウントの作成」の3)で選択したストレージアカウントのコンテナーに「init.azcli」も配置します。
※今回は「init」というフォルダの中に「init.azcli」を格納しています。
5) 2)のジョブ追加画面で、「ジョブの準備タスク」をクリックします。クリック後、「ジョブの準備タスク」画面が表示されるので、以下を入力・選択して「選択」ボタンをクリックします。
左右にスクロールしてご覧ください。
ジョブの追加 | 入力値 |
---|---|
タスク ID | ジョブ内のタスクを一意に識別する文字列。ID には、ハイフンとアンダースコアを含む任意の英数字の組み合わせを使用可能(64 文字まで)。 |
コマンド ライン | 実行したいコマンドラインを記載。※記載方法は後述。 |
最大実時間 | 無制限:ジョブの実行時間に関する制限は無い。 カスタム:ジョブの実行時間を「日」「時間」「分」「秒」で選択できる。 ジョブの実行の最大経過時間は、ジョブの作成時刻から計測される。 制限時間内にジョブが完了しない場合、Batch サービスはそのジョブと実行中のタスクをすべて終了する。この場合、終了理由は MaxWallClockTimeExpiry になる。 |
タスクの最大再試行回数 | 各タスクを再試行できる最大回数。Batch サービスは、その終了コードが 0 以外の場合にタスクを再試行する。Batch サービスは一度タスクを試行した後、この制限まで再試行する。 なし:再試行無し。 カスタム:再試行できる最大回数を入力。 無制限:終了コードが 0 になるまで試行を繰り返す。 |
保持時間 | 作業ディレクトリをコンピューティング ノードに保持する最短時間を指定。この時間を経過すると、Batch サービスは作業ディレクトリとその内容すべてを削除する場合がある。 |
成功を待機 | True の場合、Batch サービスはタスクが完了する (つまり、終了コード 0 で終了する) まで待ってから、コンピューティング ノード上のすべてのタスクをスケジュールする。 |
ユーザー ID | 開始タスクを実行するユーザー ID。 |
ノードの再起動時に再実行する | コンピューティング ノードの再起動後に Batch サービスがジョブの準備タスクを再実行する必要があるかどうかを指定。既定値は true 。ジョブの準備タスクは、コンピューティング ノードが再イメージ化された場合またはジョブの準備タスクが完了しなかった (タスクの実行中に再起動が発生したことなどが原因) 場合に常に再実行される。そのため、必ず、ジョブの準備タスクをべき等にして、複数回実行した場合に正しく動作するように記述する必要があります。 |
リソース ファイル | Batch がコマンド ラインを実行する前にコンピューティング ノードにダウンロードするファイルの一覧。 |
環境設定 | タスクの環境変数設定の一覧。 |
ここでのポイントは以下 3 点です。Azure Batch アカウントで Azure CLI を動かすためのキモになる部分となると思います。
① コマンドライン
ここに、4)で配置した「init.azcli」のパスを記載します。
Azure Batch 上で記載する「コマンドライン」には、記載方法にちょっとしたお作法があるので注意してください。
【参考:タスク】
https://docs.microsoft.com/ja-jp/azure/batch/jobs-and-tasks#tasks
※赤字部分は任意のコマンドです。
今回、「2. Batch アカウントの作成」の3)で選択したストレージアカウントのコンテナー内の「init」というフォルダの中に「init.azcli」を格納しているため、そのパスを指定しています。
※なぜ、このような指定になるのかという点については、「③ リソースファイル」で解説します。
② ユーザー ID
ジョブの準備タスクを実行するユーザーを選択します。
3)で作成した「init.azcli」内のコマンド(= Azure CLI インストールコマンド)には、sudo の記載があります。管理者権限を持つユーザーでないと Azure CLI がインストールできないので、「プール autouser、管理者」を指定してください。
③ リソースファイル
リソースファイルを指定すると、ストレージにあるコンテナーの中身全てをプール内の仮想マシン全台にアップロードできます。特に、今回のような、実行ファイルを指定してプログラムを動かす場合や、サブプログラムに分割されているようなスクリプト構成には必須の設定となります。
「リソースファイル」をクリックすると、リソースファイルをアップロードできる画面に遷移します(下図参照)。今回、必要なリソースは全て Batch アカウントとひもづいているストレージアカウントのコンテナーに格納しているので、下図にある「ストレージ コンテナーを選択します」をクリックし、ストレージアカウントとコンテナーを選択して「送信」をクリックします。
6) 「ジョブの準備タスク」を設定し終えたら「OK」ボタンをクリックします。
7) これでジョブが作成されます。あっという間に作成されます。
ちなみに、ジョブを作成した時点では、「ジョブの準備タスク」で設定したプログラムはまだ動作していません。前述した通り、「ジョブの準備タスク」で設定したプログラムは、最初のタスクが実行される前に 1 回だけ動作します。
ジョブスケジュールはその名の通り、ジョブを定期実行するために使用します。ジョブ単位で設定ができます。
タスクを作成する前に、ジョブスケジュールの設定を行います。
1) Azure ポータル上で Batch アカウントを選択後、「ジョブスケジュール」→「+追加」をクリックします。
2) 以下を入力・選択して「上書き保存」をクリックします。
※新規作成しても「上書き保存」と表示されます。迷ってしまいますが、そのままクリックしちゃってください。
※ジョブの作成と似たような設定もいくつか見受けられます。
左右にスクロールしてご覧ください。
ジョブスケジュールの追加 | 入力値 |
---|---|
ジョブ スケジュール ID | アカウント内でジョブ スケジュールを一意に識別する文字列。 |
表示名 | ジョブの表示名。一意である必要はなく、最大 1024 文字までの Unicode 文字を使用可能。 |
メタデータ | ジョブスケジュールにメタデータを含めることが可能。 |
次の時刻までは実行しない | このジョブ スケジュールにジョブを作成できる最も早い時間を指定。 指定無しの場合、即座にジョブを作成する。 |
次の時刻の後には実行しない | このジョブ スケジュールでジョブが作成されなくなる時刻を指定。この期限を過ぎ、かつこのジョブ スケジュールのアクティブなジョブがなくなると、スケジュールは即座に完了済みの状態に移行する。指定無しでも OK。 |
繰り返し間隔 | 無効:デフォルト。繰り返し無し。 有効:ジョブ スケジュールで連続する 2 つのジョブの開始時間の間隔を指定。最小値は 1 分。 |
開始時間帯 | 無制限:デフォルト。 カスタム:ジョブを作成するようスケジュールで指定されている時間が始まってから、どれだけの期間内にジョブを作成しなければならないかを表す時間間隔を指定。最小値は 1 分。 |
プール ID | ジョブスケジュールを実行するプールを選択。 「更新」リンクをクリックすると、プールが選択できる。 |
ジョブ構成タスク | 「更新」リンクをクリックすると、ジョブ マネージャー タスク、ジョブの準備タスク、ジョブのリリース タスクが指定できる。 |
表示名 | ジョブ仕様の表示名。一意である必要はなく、最大 1024 文字までの Unicode 文字を使用可能。 |
優先度 | ジョブの優先度。優先度の値の範囲は -1000 (優先度が最も低い) から 1000 (優先度が最も高い) まで。 |
最大実時間 | 無制限:ジョブの実行時間に関する制限は無い。 カスタム:ジョブの実行時間を「日」「時間」「分」「秒」で選択できる。 ジョブの実行の最大経過時間は、ジョブの作成時刻から計測される。 制限時間内にジョブが完了しない場合、Batch サービスはそのジョブと実行中のタスクをすべて終了する。この場合、終了理由は MaxWallClockTimeExpiry になる。 |
タスクの最大再試行回数 | 各タスクを再試行できる最大回数。Batch サービスは、その終了コードが 0 以外の場合にタスクを再試行する。Batch サービスは一度タスクを試行した後、この制限まで再試行する。 なし:再試行無し。 カスタム:再試行できる最大回数を入力。 無制限:終了コードが 0 になるまで試行を繰り返す。 |
すべてのタスクが完了したとき | このスケジュールで作成されたジョブ内のタスクがすべて完了状態のときに Batch サービスによってとられるアクション。ジョブにタスクが含まれていない場合、すべてのタスクが完了したと見なされる。このため、このオプションはジョブ マネージャー タスクと一緒によく使用される。ジョブ マネージャーを使用せずに、自動ジョブ終了を使用する場合、最初に onAllTasksComplete を noaction に設定し、タスクの追加が完了したら、onAllTasksComplete が terminatejob に設定されるようにジョブ プロパティを更新する。既定値は noaction |
タスクが失敗したとき | このスケジュールで作成されたジョブ内のいずれかのタスクが失敗した場合に Batch サービスによってとられるアクション。タスクに failureInfo があると、そのタスクは失敗したと見なされる。指定されている再試行回数を繰り返した後にタスクがゼロ以外の終了コードで完了した場合、または、タスクの起動でエラーが発生した場合 (たとえば、リソース ファイルのダウンロード エラー) に、failureInfo が設定される。 既定値は noaction |
3) これでジョブスケジュールが作成されます。こちらも、あっという間に作成されます。
タスクは Batch サービスにおける最小単位となります。この単位で計算や処理(=スクリプト実行)を行います。
いよいよ最後のリソースです。がんばりましょう!
1) Azure ポータル上で Batch アカウントを選択後、「ジョブ」→ 作成したジョブのリンクをクリック後、「+追加」をクリックします。
2) 以下を入力・選択して「送信」をクリックします。
※「5.ジョブの作成」で作成した「ジョブの準備タスク」と同様の項目が多いです。
左右にスクロールしてご覧ください。
タスクの追加 | 入力値 |
---|---|
タスク ID | ジョブ内のタスクを一意に識別する文字列。ID には、ハイフンとアンダースコアを含む任意の英数字の組み合わせを使用可能(64 文字まで)。 |
表示名 | タスクの表示名。一意である必要はなく、最大 1024 文字までの Unicode 文字を使用可能。 |
コマンド ライン | 実行したいコマンドラインを記載。 ※記載方法は「5.ジョブの作成」で作成した「ジョブの準備タスク」を参照。 |
最大実時間 | 無制限:ジョブの実行時間に関する制限は無い。 カスタム:ジョブの実行時間を「日」「時間」「分」「秒」で選択できる。 ジョブの実行の最大経過時間は、ジョブの作成時刻から計測される。 制限時間内にジョブが完了しない場合、Batch サービスはそのジョブと実行中のタスクをすべて終了する。この場合、終了理由は MaxWallClockTimeExpiry になる。 |
保持時間 | 作業ディレクトリをコンピューティング ノードに保持する最短時間を指定。この時間を経過すると、Batch サービスは作業ディレクトリとその内容すべてを削除する場合がある。デフォルトでは 7 日。 |
リテンション期間単位 | 上記「保存時間」と合わせて設定。 「日」「時間」「分」「秒」で選択できる。 |
必要なスロット | タスクの実行に必要なスケジュール スロットの数。既定値は 1 。 マルチインスタンス タスクでは、1 を指定する必要がある。 |
ユーザー ID | 開始タスクを実行するユーザー ID。 |
複数インスタンスの設定 (MPI など) | このタスクが複数のコンピューティング ノードが必要な複数インスタンス タスクであることを指定。別ウィンドウにて指定できる。 |
リソース ファイル | Batch がコマンド ラインを実行する前にコンピューティング ノードにダウンロードするファイルの一覧。 |
環境設定 | タスクの環境変数設定の一覧。 |
タスクの依存関係 | True の場合、Batch サービスはタスクが完了する (つまり、終了コード 0 で終了する) まで待ってから、コンピューティング ノード上のすべてのタスクをスケジュールする。 |
アプリケーション パッケージ | ノードにダウンロードされるアプリケーション パッケージ。 ここをクリックすると、アプリケーション パッケージをアップロードできる( zip 形式)。 |
ここでのポイントは、「5.ジョブの作成」で作成した「ジョブの準備タスク」と同じとなります。再度参考にしてみてください。
3) これでタスクが作成されます。タスクスケジュールを設定している場合、タスクスケジュールの設定に従ってジョブ(ジョブの準備タスク含む) → タスクの順に実行されます。タスクスケジュールを設定していない場合、即座にジョブ(ジョブの準備タスク含む) → タスクが実行されます。
作成したタスクをクリックすると、タスクの実行状況が分かります。
下図はタスクを開始した直後の画面になります。まだ「アクティブ」状態になったままなので、実際の処理(=プログラム実行)は実施されていません。
今回はジョブの準備タスクを設定しているため、最初にジョブの準備タスクが実行されています。
4) タスクが実施され、実際の処理(=プログラム実行)が実行されると、タスクの実行状況が「実行中」状態になります。
※画面上部にある「最新の情報に更新」をクリックすると、画面が更新されます。
「実行中」状態になると、プール上にある仮想マシン内のファイルを見ることができます。
root の直下に 2 種類のログファイル(「stderr.txt」「stdout.txt」)が出力されるので、エラー内容やプログラムでコンソール出力させている箇所もここから確認することができます。
5) タスクが終了すると、タスクの実行状況が「完了」状態になります。
6) ジョブの準備タスクを設定している場合、どこで実行結果が分かるのか?と気になった方もいらっしゃると思いますが、確認できる場所は用意されています。
ジョブの準備タスクの実行状況の確認は、「ジョブ」→「準備タスク」から確認できます。
7) 上図の赤枠で囲った部分をクリックすると、もう少し詳しい情報が確認できます。
8) 「タスク ルート ディレクトリ」のリンク(上図赤枠部分)をクリックすると、プール上にある仮想マシン内のファイルを見ることができます。
※タスクの画面より見づらいですが。。。
ジョブの準備タスクで設定した「タスク ID」フォルダの直下に 2 種類のログファイル(「stderr.txt」「stdout.txt」)が出力されるので、エラーの解析等に役立てることができます。
9) ジョブの準備タスク作成時やタスク作成時に「リソース ファイル」という項目を設定している場合、プール上の仮想マシン内のどこに展開されているのでしょうか。
※「リソース ファイル」の説明は、「5. ジョブの作成」の「ジョブの準備タスク」を設定している箇所を参考にしてください。
「リソース ファイル」でアップロードしたファイルは、プール上の仮想マシンの「root / wd」という場所に格納されています。
今回、必要なリソースは全て Batch アカウントとひもづいているストレージアカウントのコンテナーに格納しているので、ストレージコンテナーの中身がプール上の仮想マシンの「root / wd」に格納されていることが確認できます。
これで Azure CLI で記載されている『とあるプログラム』を Azure Batch 上で動かすことができました。
『とあるプログラム』を動かして、結果も無事取得できたのですが、実はまだ考慮すべきことが残っています。
もし、Azure Batch 上で動かすプログラムが処理結果としてファイルを出力する場合、出力ファイルは Azure Batch 上のプール(=仮想マシン)に出力されます。このままではプールを削除した場合、あるいは、ノードがプールを終了した場合、VM 内のファイルもすべて消えてしまうため、出力ファイルやログ等をストレージアカウントに移動する必要があります。
Microsoft の Docs でも、Batch(ジョブ)の成果物はストレージに移すことを推奨しています。
【参考:ジョブとタスク出力を保持する】
https://docs.microsoft.com/ja-jp/azure/batch/batch-task-output
あとはペンディングにしている証明書の保管のところです。今はストレージに配置してしまっているので、もう少しセキュアな構成にする必要があります。
上記の設定は、余裕があったらまたアップしようと思います。
本来、Azure Batch は、アプリケーションを独立して実行する「本質的に並列なワークロード」で利用されるケースが多いようです。Microsoft の Docs には、以下の例が挙げられています。以下の例に合致するのであれば、Azure Batch を検討してみても良いかもしれません。
【参考:並列ワークロードの実行】
https://docs.microsoft.com/ja-jp/azure/batch/batch-technical-overview#run-parallel-workloads
最後までお読みいただき、ありがとうございました!