Batch アプリケーション パッケージを使用したコンピューティング ノードへのアプリケーションのデプロイ

アプリケーション パッケージにより、Azure Batch ソリューションのコードが簡略化されると共に、タスクが実行されるアプリケーションの管理が容易になります。 アプリケーション パッケージを使用すると、タスクで実行される複数のバージョンのアプリケーション (そのサポート ファイルを含む) をアップロードして管理できます。 また、アップロードしたアプリケーションのうち 1 つ以上をプール内のコンピューティング ノードに自動的にデプロイできます。

アプリケーション パッケージの作成と管理を行う API は Batch Management .NET ライブラリの一部です。 計算ノードでアプリケーション パッケージをインストールするための API は Batch .NET ライブラリの一部です。 同等の機能は、他のプログラミング言語に利用可能な Batch API にあります。

この記事では、Azure portal にアプリケーション パッケージをアップロードして管理する方法について説明します。 また、Batch .NET ライブラリを使用して、プールのコンピューティング ノードにそれらをインストールする方法についても説明します。

アプリケーション パッケージの要件

アプリケーション パッケージを使うには、Azure Storage アカウントを Batch アカウントにリンクする必要があります。

Batch アカウント内のアプリケーションとアプリケーション パッケージの数と最大アプリケーション パッケージ サイズには制限があります。 詳しくは、「Batch サービスのクォータと制限」をご覧ください。

Note

2017 年 7 月 5 日より前に作成された Batch プールでは、アプリケーション パッケージはサポートされていません (Cloud Services の構成を使用して、2016 年 3 月 10 日より後に作成された場合を除く)。 ここで説明されているアプリケーション パッケージの機能は、以前のバージョンのサービスで利用できた "Batch Apps" 機能に代わるものです。

アプリケーションとアプリケーション パッケージを理解する

Azure Batch では、" アプリケーション " という用語は、プール内のコンピューティング ノードに自動でダウンロード可能なバージョン付きバイナリのセットを指します。 アプリケーションには、アプリケーションのさまざまなバージョンを表すアプリケーション パッケージが 1 つ以上含まれています。

アプリケーション パッケージは、アプリケーション バイナリとサポート ファイルを含む .zip ファイルです。 .zip 形式のみがサポートされます。

アプリケーションとアプリケーション パッケージの概要を示す図。

アプリケーション パッケージはプールまたはタスク レベルで指定できます。

  • プールのアプリケーション パッケージ は、プール内の " すべて " のノードにデプロイされます。 アプリケーションがデプロイされるのは、ノードがプールに参加するときと、ノードが再起動または再イメージ化されるときです。

    プールのアプリケーション パッケージは、プール内のすべてのノードでジョブのタスクを実行するときに適しています。 プールの作成時に、デプロイする 1 つ以上のアプリケーション パッケージを指定できます。 また、既存のプールのパッケージを追加または更新することもできます。 既存のプールに新しいパッケージをインストールするには、そのノードを再起動する必要があります。

  • タスクのアプリケーション パッケージ は、タスクのコマンド ラインを実行する直前に、そのタスクを実行するようにスケジュールされたコンピューティング ノードのみにデプロイされます。 指定されたアプリケーション パッケージとバージョンが既にノードにある場合、それは再デプロイされず、既存のパッケージが使用されます。

    タスクのアプリケーション パッケージは、共有プール環境では便利です。この環境では、さまざまなジョブが 1 つのプールで実行され、ジョブが完了してもプールは削除されません。 ジョブ内のタスクがプール内のノードよりも少ない場合は、タスクのアプリケーション パッケージによりデータ転送を最小限に抑えることができます。アプリケーションはタスクが実行されるノードにのみデプロイされるためです。

    タスクのアプリケーション パッケージによるメリットがありそうなその他のシナリオとして、大規模なアプリケーションを、ごく少数のタスクで実行するジョブが挙げられます。 たとえば、タスク アプリケーションは、重い事前処理段階やマージ タスクに役立ちます。

アプリケーション パッケージでは、ノードにインストールする多数のリソース ファイルをプールの開始タスクで指定する必要がありません。 Azure Storage やノードで、アプリケーション ファイルの複数のバージョンを手動で管理する必要もありません。 さらに、Azure Storage アカウント内のファイルへのアクセスを提供する SAS URL の生成に苦労することもありません。 Batch は、バックグラウンドで Azure Storage と連携して、アプリケーション パッケージを保存し、コンピューティング ノードにデプロイします。

Note

開始タスクの合計サイズは、リソース ファイルと環境変数を含め、32,768 文字以下であることが必要です。 開始タスクがこの制限を超える場合は、別のオプションとしてアプリケーション パッケージを使用することができます。 リソース ファイルを含む .zip ファイル作成し、Azure Storage に BLOB としてそのファイルをアップロードし、開始タスクのコマンド ラインから解凍することもできます。

アプリケーションのアップロードと管理

Azure portal または Batch Management API を使用して、Batch アカウントのアプリケーション パッケージを管理できます。 以下のセクションでは、ストレージ アカウントをリンクする方法と、Azure portal でアプリケーションとアプリケーション パッケージを追加および管理する方法について説明します。

Note

ARM テンプレートMicrosoft.Batch/batchAccounts リソースでアプリケーションの値を定義できますが、現時点では、ARM テンプレートを使用して、Batch アカウントで使用するアプリケーション パッケージをアップロードすることはできません。 「新しいアプリケーションの追加」で説明されているように、リンクされたストレージ アカウントにそれらをアップロードする必要があります。

アプリケーション パッケージを使用するには、お使いの Batch アカウントに Azure Storage アカウントをリンクする必要があります。 Batch サービスでは、関連付けられたストレージ アカウントを使って、アプリケーション パッケージが格納されます。 理想的には、Batch アカウント専用のストレージ アカウントを作成する必要があります。

ストレージ アカウントをまだ構成していない場合は、左のナビゲーション メニューから、初めて [アプリケーション] を選択したときに、Azure portal に警告が表示されます。 ストレージ アカウントを Batch アカウントにリンクする必要がある場合:

  1. "この Batch アカウントにはストレージ アカウントが構成されていません" と示されている [警告] ウィンドウを選択します。
  2. 次に、次のページで [ストレージ アカウント セット...] を選択します。
  3. [ストレージ アカウント情報] セクションの [ストレージ アカウントの選択] リンクを選択します。
  4. [ストレージ アカウントの選択] ウィンドウの一覧で、この Batch アカウントで使用するストレージ アカウントを選択します。
  5. 次に、ページの左上隅にある [保存] を選択します。

2 つのアカウントをリンクした後、Batch によって、リンクされたストレージ アカウントに保存されているパッケージをコンピューティング ノードに自動的にデプロイできます。

重要

アプリケーション パッケージは、ファイアウォール規則で構成されている Azure Storage アカウントを使用して、または [階層構造の名前空間][有効] に設定されている場合には使用できません。

Batch サービスは、Azure Storage を使ってアプリケーション パッケージをブロック BLOB として格納します。 ブロック BLOB データの通常料金が課金され、各パッケージのサイズは最大ブロック BLOB サイズを超えることはできません。 詳細については、Blob ストレージのスケーラビリティおよびパフォーマンスのターゲットに関する記事を参照してください。 コストを最小限に抑えるために、必ず、アプリケーション パッケージのサイズと数を考慮し、非推奨のパッケージを定期的に削除してください。

新しいアプリケーションの追加

新しいアプリケーションを作成するには、アプリケーション パッケージを追加し、一意のアプリケーション ID を指定します。

Batch アカウントで、左側のナビゲーション メニューから [アプリケーション] を選択し、[追加] を選択します。

Azure portal での新しいアプリケーションの作成プロセスのスクリーンショット。

次の情報を入力します。

  • アプリケーション ID:新しいアプリケーションの ID。
  • バージョン: アップロードするアプリケーション パッケージのバージョン。
  • アプリケーション パッケージ: アプリケーションの実行に必要なアプリケーション バイナリとサポート ファイルを含む .zip ファイル。

入力する [アプリケーション ID][バージョン] では、これらの要件に従う必要があります。

  • Windows ノードでは、ID には英数字、ハイフン、アンダースコアの任意の組み合わせを使用できる。 Linux ノードでは、英数字とアンダースコアのみ使用できる。
  • 64 文字を超えることはできない。
  • Batch アカウント内で一意にする必要がある。
  • ID では大文字と小文字が維持され、区別はされない。

準備ができたら、 [送信] を選択します .zip ファイルが Azure Storage アカウントにアップロードされた後、ポータルに通知が表示されます。 アップロードするファイルのサイズやネットワーク接続の速度によっては、このプロセスに時間がかかることがあります。

現在のアプリケーションの表示

Batch アカウントのアプリケーションを表示するには、左側のナビゲーション メニューで [アプリケーション] を選択します。

Azure portal の [アプリケーション] メニュー項目のスクリーンショット。

このメニュー オプションを選択すると、 [アプリケーション] ウィンドウが開きます。 このウィンドウには、アカウント内に存在する各アプリケーションの ID と以下のプロパティが表示されます。

  • [パッケージ] : このアプリケーションに関連するバージョン数。
  • 既定のバージョン : 該当する場合は、アプリケーションのデプロイ時にバージョンが指定されていない場合にインストールされるアプリケーションのバージョン。
  • [更新を許可する] : パッケージの更新と削除を許可するかどうかを指定します。

計算ノード上のアプリケーション パッケージのファイル構造を確認するには、Azure portal で Batch アカウントに移動します。 [プール] を選択します。 次に、計算ノードが含まれるプールを選択します。 その後、アプリケーション パッケージがインストールされている計算ノードを選択し、applications フォルダーを開きます。

アプリケーションの詳細の表示

アプリケーションの詳細を表示するには、 [アプリケーション] ウィンドウでそれを選択します。 左側のナビゲーション メニューの [設定] を選択して、アプリケーションを構成できます。

  • [更新を許可する] : アプリケーション パッケージを更新または削除できるかどうかを示します。 既定値は [はい] です。 [いいえ] に設定した場合、既存のアプリケーション パッケージを更新または削除することはできませんが、新しいアプリケーション パッケージのバージョンを追加することはできます。
  • 既定のバージョン : アプリケーションをデプロイするときに、バージョンが指定されていない場合に使用する既定のアプリケーション パッケージ。
  • 表示名:アプリケーションに関する情報を表示するときに、Batch ソリューションで使用できるフレンドリ名。 たとえば、この名前は、Batch を通じて顧客に提供するサービスの UI で使用できます。

新しいアプリケーション パッケージの追加

既存のアプリケーションに対してアプリケーション パッケージ バージョンを追加するには、ご利用の Batch アカウントの [アプリケーション] ページでアプリケーションを選択します。 その後、 [追加] を選択します。

新しいアプリケーションの場合と同様に、新しいパッケージの [バージョン] を指定して、 [アプリケーション パッケージ] フィールドの .zip ファイルをアップロードし、 [送信] を選択します。

アプリケーション パッケージの更新または削除

既存のアプリケーション パッケージを更新または削除するには、Batch アカウントの [アプリケーション] ページでアプリケーションを選択します。 変更するアプリケーション パッケージの行の省略記号を選択します。 次に、実行するアクションを選択します。

Azure portal のアプリケーション パッケージの更新および削除オプションを示すスクリーンショット。

[更新] を選択した場合は、新しい .zip ファイルをアップロードできます。 このファイルにより、そのバージョン用にアップロードした前の .zip ファイルが置き換えられます。

[削除] を選択した場合は、そのバージョンの削除を確認するメッセージが表示されます。 [OK] を選択したら、Batch によって Azure Storage アカウントから .zip ファイルが削除されます。 アプリケーションの既定のバージョンを削除すると、そのアプリケーションの [既定のバージョン] の設定も削除されます。

コンピューティング ノードへのアプリケーションのインストール

Azure portal でアプリケーション パッケージを管理する方法について説明しました。 次に、それらをコンピューティング ノードにデプロイして、Batch タスクで実行する方法について説明します。

プールのアプリケーション パッケージのインストール

プール内のすべてのコンピューティング ノードにアプリケーション パッケージをインストールするには、対象のプールに対してアプリケーション パッケージへの " 参照 " を 1 つ以上指定します。 プールに指定したアプリケーション パッケージは、プールに参加した各計算ノードや再起動または再イメージ化されたノードにインストールされます。

Batch .NET では、新しいプールの作成時または既存のプールの使用時に、1 つまたは複数の CloudPool.ApplicationPackageReferences を指定します。 ApplicationPackageReference クラスは、プールの計算ノードにインストールするアプリケーション ID とバージョンを指定します。

// Create the unbound CloudPool
CloudPool myCloudPool =
    batchClient.PoolOperations.CreatePool(
        poolId: "myPool",
        targetDedicatedComputeNodes: 1,
        virtualMachineSize: "standard_d1_v2",
        VirtualMachineConfiguration: new VirtualMachineConfiguration(
            imageReference: new ImageReference(
                                publisher: "MicrosoftWindowsServer",
                                offer: "WindowsServer",
                                sku: "2019-datacenter-core",
                                version: "latest"),
            nodeAgentSkuId: "batch.node.windows amd64");

// Specify the application and version to install on the compute nodes
myCloudPool.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
    new ApplicationPackageReference {
        ApplicationId = "litware",
        Version = "1.1001.2b" }
};

// Commit the pool so that it's created in the Batch service. As the nodes join
// the pool, the specified application package is installed on each.
await myCloudPool.CommitAsync();

重要

アプリケーション パッケージのデプロイが失敗した場合、そのノードは、Batch サービスによって使用不可としてマークされます。そのノードに対しては、タスクの実行がスケジュールされません。 この場合、ノードを再起動してパッケージのデプロイを再開します。 ノードを再起動すると、そのノードでのタスクのスケジュールももう一度有効になります。

タスクのアプリケーション パッケージのインストール

プールと同様、アプリケーション パッケージへの " 参照 " を指定します。 タスクがノード上で実行するようにスケジュールされると、タスクのコマンド ラインが実行される直前に、パッケージがダウンロードされ、展開されます。 指定したパッケージとバージョンが既にノードにインストールされている場合は、パッケージがダウンロードされず、既存のパッケージが使用されます。

タスクのアプリケーション パッケージをインストールするには、タスクの CloudTask.ApplicationPackageReferences プロパティを構成します。

CloudTask task =
    new CloudTask(
        "litwaretask001",
        "cmd /c %AZ_BATCH_APP_PACKAGE_LITWARE%\\litware.exe -args -here");

task.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
    new ApplicationPackageReference
    {
        ApplicationId = "litware",
        Version = "1.1001.2b"
    }
};

インストールしたアプリケーションの実行

プールまたはタスクに指定したパッケージがダウンロードされ、ノードの AZ_BATCH_ROOT_DIR 内にある名前付きディレクトリに展開されます。 Batch により、その名前付きディレクトリへのパスを含む環境変数も作成されます。 タスクのコマンド ラインは、ノード上のアプリケーションを参照するときにこの環境変数を使用します。

Windows ノードでは、この変数の形式は次のとおりです。

Windows:
AZ_BATCH_APP_PACKAGE_APPLICATIONID#version

Linux ノードでは、形式が若干異なります。 ピリオド (.)、ハイフン (-)、番号記号 (#) は、環境変数ではアンダースコアにフラット化されます。 また、アプリケーション ID の大文字と小文字は保持されます。 次に例を示します。

Linux:
AZ_BATCH_APP_PACKAGE_applicationid_version

APPLICATIONIDversion は、デプロイに指定したアプリケーションとパッケージ バージョンに対応する値です。 たとえば、アプリケーション blender のバージョン 2.7 が Windows ノードにインストールされるように指定した場合、タスクのコマンド ラインでは、次の環境変数を使ってそのファイルにアクセスします。

Windows:
AZ_BATCH_APP_PACKAGE_BLENDER#2.7

Linux ノードでは、次の形式で環境変数を指定します。 ピリオド (.)、ハイフン (-)、および番号記号 (#) をアンダースコアにフラット化し、アプリケーション ID の大文字と小文字を保持します。

Linux:
AZ_BATCH_APP_PACKAGE_blender_2_7

アプリケーション パッケージをアップロードするときに、コンピューティング ノードにデプロイする既定のバージョンを指定できます。 アプリケーションの既定のバージョンを指定した場合、アプリケーションを参照するときにバージョンのサフィックスを省略できます。 アプリケーションの既定のバージョンは、「アプリケーションのアップロードと管理」に示すように、Azure Portal の [アプリケーション] ウィンドウで指定できます。

たとえば、blender アプリケーションの既定バージョンとして "2.7" を設定した場合、タスクでは次の環境変数が参照されるため、Windows ノードでバージョン 2.7 が使用されます。

AZ_BATCH_APP_PACKAGE_BLENDER

次のコード スニペットは、 blender アプリケーションの既定のバージョンを起動する、タスクのコマンド ラインの例を示します。

string taskId = "blendertask01";
string commandLine =
    @"cmd /c %AZ_BATCH_APP_PACKAGE_BLENDER%\blender.exe -args -here";
CloudTask blenderTask = new CloudTask(taskId, commandLine);

ヒント

コンピューティング ノードの環境設定の詳細については、タスクの環境設定に関する記事を参照してください。

プールに含まれるアプリケーション パッケージの更新

アプリケーション パッケージで構成済みの既存プールに対して、新しいパッケージを指定することができます。 そのため、次のようになります。

  • Batch サービスは、プールに参加する新しいノードすべてと、再起動または再イメージ化される既存のノードに、新しく指定されたパッケージをインストールします。
  • パッケージの参照を更新したときに、既にプールに参加していたコンピューティング ノードでは、新しいアプリケーション パッケージが自動でインストールされることはありません。 新しいパッケージを受け取るには、これらのコンピューティング ノードを再起動または再イメージ化する必要があります。
  • 新しいパッケージがデプロイされると、作成された環境変数に新しいアプリケーション パッケージ参照が反映されます。

この例では、既存のプールに、CloudPool.ApplicationPackageReferences の 1 つとして blender アプリケーションのバージョン 2.7 が構成されています。 プールのノードをバージョン 2.76b で更新するには、新しいバージョンで新しい ApplicationPackageReference を指定し、変更をコミットします。

string newVersion = "2.76b";
CloudPool boundPool = await batchClient.PoolOperations.GetPoolAsync("myPool");
boundPool.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
    new ApplicationPackageReference {
        ApplicationId = "blender",
        Version = newVersion }
};
await boundPool.CommitAsync();

新しいバージョンを構成したので、Batch サービスはプールに参加する "新しい" ノードにバージョン 2.76b をインストールします。 プール内の " 既存 " のノードに 2.76b をインストールするには、ノードを再起動または再イメージ化します。 再起動されたノードでは、以前のパッケージ デプロイのファイルが保持されます。

Batch アカウント内のアプリケーションの一覧表示

ApplicationOperations.ListApplicationSummaries メソッドを使用して、Batch アカウント内のアプリケーションとそのパッケージを一覧表示できます。

// List the applications and their application packages in the Batch account.
List<ApplicationSummary> applications = await batchClient.ApplicationOperations.ListApplicationSummaries().ToListAsync();
foreach (ApplicationSummary app in applications)
{
    Console.WriteLine("ID: {0} | Display Name: {1}", app.Id, app.DisplayName);

    foreach (string version in app.Versions)
    {
        Console.WriteLine("  {0}", version);
    }
}

次のステップ