Azure Batch JavaScript SDK を使用して JavaScript で Batch クライアントを構築する方法の基本について説明します。 バッチ アプリケーションのシナリオを理解し、JavaScript を使用して設定する段階的なアプローチを取ります。
前提条件
この記事では、JavaScript に関する実用的な知識と Linux に関する知識があることを前提としています。 また、Batch サービスとストレージ サービスを作成するためのアクセス権を持つ Azure アカウントのセットアップがあることを前提としています。
この記事で説明されている手順を実行する前に、 Azure Batch の技術概要 を読むことをお勧めします。
シナリオの理解
ここでは、Azure Blob Storage コンテナーからすべての csv ファイルをダウンロードして JSON に変換する、Python で記述された簡単なスクリプトがあります。 複数のストレージ アカウント コンテナーを並列で処理するために、スクリプトを Azure Batch ジョブとしてデプロイできます。
Azure Batch アーキテクチャ
次の図は、Azure Batch とクライアントを使用して Python スクリプトをスケーリングする方法を示しています。
JavaScript サンプルでは、ストレージ アカウント内のコンテナーの数に応じて、準備タスク (後で詳しく説明) と一連のタスクを含むバッチ ジョブをデプロイします。 GitHub リポジトリからスクリプトをダウンロードできます。
ヒント
指定されたリンク内の JavaScript サンプルには、Azure 関数アプリとしてデプロイする特定のコードが含まれていません。 作成手順については、次のリンクを参照してください。
アプリケーションをビルドする
次に、プロセスの手順に従って JavaScript クライアントを構築します。
手順 1: Azure Batch SDK をインストールする
npm install コマンドを使用して、Azure Batch SDK for JavaScript をインストールできます。
npm install @azure/batch
このコマンドは、最新バージョンの azure-batch JavaScript SDK をインストールします。
ヒント
Azure 関数アプリでは、Azure 関数の [設定] タブで "Kudu Console" に移動して npm インストール コマンドを実行できます。 この場合は、Azure Batch SDK for JavaScript をインストールします。
手順 2: Azure Batch アカウントを作成する
Azure portal またはコマンド ライン (PowerShell /Azure CLI) から作成できます。
Azure CLI を使用して作成するコマンドを次に示します。
リソース グループを作成します。Batch アカウントを作成する場所が既にある場合は、この手順をスキップします。
az group create -n "<resource-group-name>" -l "<location>"
次に、Azure Batch アカウントを作成します。
az batch account create -l "<location>" -g "<resource-group-name>" -n "<batch-account-name>"
各 Batch アカウントには、対応するアクセス キーがあります。 これらのキーは、Azure Batch アカウントにさらにリソースを作成するために必要です。 運用環境では、Azure Key Vault を使用してこれらのキーを格納することをお勧めします。 その後、アプリケーションのサービス プリンシパルを作成できます。 このサービス プリンシパルを使用して、アプリケーションはキー コンテナーからキーにアクセスする OAuth トークンを作成できます。
az batch account keys list -g "<resource-group-name>" -n "<batch-account-name>"
以降の手順で使用するキーをコピーして格納します。
手順 3: Azure Batch サービス クライアントを作成する
次のコード スニペットでは、まず azure-batch JavaScript モジュールをインポートしてから、Batch Service クライアントを作成します。 最初に、前の手順からコピーした Batch アカウント キーを使用して SharedKeyCredentials オブジェクトを作成する必要があります。
// Initializing Azure Batch variables
import { BatchServiceClient, BatchSharedKeyCredentials } from "@azure/batch";
// Replace values below with Batch Account details
const batchAccountName = '<batch-account-name>';
const batchAccountKey = '<batch-account-key>';
const batchEndpoint = '<batch-account-url>';
const credentials = new BatchSharedKeyCredentials(batchAccountName, batchAccountKey);
const batchClient = new BatchServiceClient(credentials, batchEndpoint);
Azure Batch URI は、Azure portal の [概要] タブにあります。 これは次の形式です。
https://accountname.location.batch.azure.com
スクリーンショットを参照してください。
手順 4: Azure Batch プールを作成する
Azure Batch プールは、複数の VM (Batch ノードとも呼ばれます) で構成されます。 Azure Batch サービスは、これらのノードにタスクをデプロイして管理します。 プールには、次の構成パラメーターを定義できます。
- 仮想マシン イメージの種類
- 仮想マシン ノードのサイズ
- 仮想マシン ノードの数
ヒント
仮想マシン ノードのサイズと数は、並列で実行するタスクの数とタスク自体によって大きく異なります。 理想的な数とサイズを判断するためのテストをお勧めします。
次のコード スニペットは、構成パラメーター オブジェクトを作成します。
// Creating Image reference configuration for Ubuntu Linux VM
const imgRef = {
publisher: "Canonical",
offer: "UbuntuServer",
sku: "20.04-LTS",
version: "latest"
}
// Creating the VM configuration object with the SKUID
const vmConfig = {
imageReference: imgRef,
nodeAgentSKUId: "batch.node.ubuntu 20.04"
};
// Number of VMs to create in a pool
const numVms = 4;
// Setting the VM size
const vmSize = "STANDARD_D1_V2";
ヒント
Azure Batch で使用できる Linux VM イメージとその SKU ID の 一覧については、仮想マシン イメージの一覧を参照してください。
プール構成が定義されたら、Azure Batch プールを作成できます。 Batch プール コマンドは、Azure 仮想マシン ノードを作成し、実行するタスクを受け取る準備をします。 各プールには、後続の手順で参照するための一意の ID が必要です。
次のコード スニペットは、Azure Batch プールを作成します。
// Create a unique Azure Batch pool ID
const now = new Date();
const poolId = `processcsv_${now.getFullYear()}${now.getMonth()}${now.getDay()}${now.getHours()}${now.getSeconds()}`;
const poolConfig = {
id: poolId,
displayName: "Processing csv files",
vmSize: vmSize,
virtualMachineConfiguration: vmConfig,
targetDedicatedNodes: numVms,
enableAutoScale: false
};
// Creating the Pool
var pool = batchClient.pool.add(poolConfig, function (error, result){
if(error!=null){console.log(error.response)};
});
作成されたプールの状態を確認し、そのプールへのジョブの送信を進める前に、状態が "アクティブ" であることを確認できます。
var cloudPool = batchClient.pool.get(poolId,function(error,result,request,response){
if(error == null)
{
if(result.state == "active")
{
console.log("Pool is active");
}
}
else
{
if(error.statusCode==404)
{
console.log("Pool not found yet returned 404...");
}
else
{
console.log("Error occurred while retrieving pool data");
}
}
});
pool.get 関数によって返されるサンプルの結果オブジェクトを次に示します。
{
id: 'processcsv_2022002321',
displayName: 'Processing csv files',
url: 'https://<batch-account-name>.westus.batch.azure.com/pools/processcsv_2022002321',
eTag: '0x8D9D4088BC56FA1',
lastModified: 2022-01-10T07:12:21.943Z,
creationTime: 2022-01-10T07:12:21.943Z,
state: 'active',
stateTransitionTime: 2022-01-10T07:12:21.943Z,
allocationState: 'steady',
allocationStateTransitionTime: 2022-01-10T07:13:35.103Z,
vmSize: 'standard_d1_v2',
virtualMachineConfiguration: {
imageReference: {
publisher: 'Canonical',
offer: 'UbuntuServer',
sku: '20.04-LTS',
version: 'latest'
},
nodeAgentSKUId: 'batch.node.ubuntu 20.04'
},
resizeTimeout: 'PT15M',
currentDedicatedNodes: 4,
currentLowPriorityNodes: 0,
targetDedicatedNodes: 4,
targetLowPriorityNodes: 0,
enableAutoScale: false,
enableInterNodeCommunication: false,
taskSlotsPerNode: 1,
taskSchedulingPolicy: { nodeFillType: 'Spread' }}
手順 4: Azure Batch ジョブを送信する
Azure Batch ジョブは、同様のタスクの論理グループです。 このシナリオでは、"CSV から JSON への処理" です。ここでの各タスクは、各 Azure Storage コンテナーに存在する csv ファイルを処理することです。
これらのタスクは並列で実行され、Azure Batch サービスによって調整された複数のノードにデプロイされます。
ヒント
taskSlotsPerNode プロパティを使用すると、1 つのノードで同時に実行できるタスクの最大数を指定できます。
準備タスク
作成された VM ノードは空の Ubuntu ノードです。 多くの場合、前提条件として一連のプログラムをインストールする必要があります。 通常、Linux ノードの場合、実際のタスクを実行する前に前提条件をインストールするシェル スクリプトを用意できます。 ただし、任意のプログラム可能な実行可能ファイルである可能性があります。
この例の シェル スクリプト では、Python-pip と Python 用 Azure Storage Blob SDK がインストールされます。
スクリプトを Azure ストレージ アカウントにアップロードし、スクリプトにアクセスするための SAS URI を生成できます。 このプロセスは、Azure Storage JavaScript SDK を使用して自動化することもできます。
ヒント
ジョブの準備タスクは、特定のタスクを実行する必要がある VM ノードでのみ実行されます。 前提条件を実行するタスクに関係なくすべてのノードにインストールする場合は、プールの追加中に startTask プロパティを使用できます。 次の準備タスク定義を参照用に使用できます。
準備タスクは、Azure Batch ジョブの送信中に指定されます。 構成可能な準備タスク パラメーターを次に示します。
- ID: 準備タスクの一意の識別子
- commandLine: タスク実行可能ファイルを実行するコマンド ライン
- resourceFiles: このタスクを実行するためにダウンロードする必要があるファイルの詳細を提供するオブジェクトの配列。 そのオプションを次に示します。
- httpUrl: ダウンロードするファイルの URL
- filePath: ファイルをダウンロードして保存するためのローカル パス
- fileMode: Linux ノードにのみ適用され、fileMode は既定値が 0770 の 8 進数形式です
- waitForSuccess: true に設定すると、準備タスクの失敗時にタスクは実行されません
- runElevated: タスクを実行するために昇格された特権が必要な場合は、true に設定します。
次のコード スニペットは、準備タスク スクリプトの構成サンプルを示しています。
var jobPrepTaskConfig = {id:"installprereq",commandLine:"sudo sh startup_prereq.sh > startup.log",resourceFiles: [{ 'httpUrl': 'Blob sh url', 'filePath': 'startup_prereq.sh' }],waitForSuccess:true,runElevated:true, userIdentity: {autoUser: {elevationLevel: "admin", scope: "pool"}}}
タスクを実行するための前提条件がインストールされていない場合は、準備タスクをスキップできます。 次のコードでは、"process csv files" という表示名のジョブが作成されます。
// Setting Batch Pool ID
const poolInfo = { poolId: poolId };
// Batch job configuration object
const jobId = "processcsvjob";
const jobConfig = {
id: jobId,
displayName: "process csv files",
jobPreparationTask: jobPrepTaskConfig,
poolInfo: poolInfo
};
// Adding Azure batch job to the pool
const job = batchClient.job.add(jobConfig, function (error, result) {
if (error !== null) {
console.log("An error occurred while creating the job...");
console.log(error.response);
}
}
);
手順 5: ジョブの Azure Batch タスクを送信する
プロセス csv ジョブが作成されたので、そのジョブのタスクを作成しましょう。 コンテナーが 4 つあると仮定すると、コンテナーごとに 1 つずつ、4 つのタスクを作成する必要があります。
Python スクリプトを見ると、次の 2 つのパラメーターを受け入れます。
- コンテナー名: ファイルをダウンロードするストレージ コンテナー
- pattern: ファイル名パターンの省略可能なパラメーター
次のコードは、4 つのコンテナー "con1"、"con2"、"con3"、"con4" があると仮定して、先ほど作成した Azure バッチ ジョブ "process csv" に 4 つのタスクを送信することを示しています。
// storing container names in an array
const containerList = ["con1", "con2", "con3", "con4"]; //Replace with list of blob containers within storage account
containerList.forEach(function (val, index) {
console.log("Submitting task for container : " + val);
const containerName = val;
const taskID = containerName + "_process";
// Task configuration object
const taskConfig = {
id: taskID,
displayName: 'process csv in ' + containerName,
commandLine: 'python processcsv.py --container ' + containerName,
resourceFiles: [{ 'httpUrl': 'Blob script url', 'filePath': 'processcsv.py' }]
};
const task = batchClient.task.add(jobId, taskConfig, function (error, result) {
if (error !== null) {
console.log("Error occurred while creating task for container " + containerName + ". Details : " + error.response);
}
else {
console.log("Task for container : " + containerName + " submitted successfully");
}
});
});
このコードは、プールに複数のタスクを追加します。 また、各タスクは、作成された VM のプール内のノードで実行されます。 タスクの数がプール内の VM の数または taskSlotsPerNode プロパティを超えた場合、タスクはノードが使用可能になるまで待機します。 このオーケストレーションは、Azure Batch によって自動的に処理されます。
ポータルには、タスクとジョブの状態に関する詳細なビューがあります。 Azure JavaScript SDK で一覧を使用して関数を取得することもできます。 詳細については、ドキュメント の リンクを参照してください。
次のステップ
- Batch サービスのワークフローと主要なリソース (プール、ノード、ジョブ、タスクなど) について学習します。
- Batch API の詳細については、 Batch JavaScript のリファレンスを参照 してください。