仮想ファイル システムを Batch プールにマウントする

Azure Batch は、Batch プール内の Windows または Linux 計算ノードへのクラウド ストレージまたは外部ファイル システムのマウントをサポートします。 計算ノードがプールに参加すると、仮想ファイル システムがマウントされ、そのノードのローカル ドライブとして動作します。 この記事では、Batch Management Library for .NET を使用して計算ノードのプールに仮想ファイル システムをマウントする方法を示します。

ファイル システムをプールにマウントすると、データへのアクセスが容易になり、タスクでタスク自体のデータを大規模な共有データ セットから取得しなければならない場合より、効率が向上します。 ムービーのレンダリングなど、一般的なデータ セットへのアクセスを必要とするタスクが複数あるシナリオについて考えてみます。 各タスクで、シーン ファイルから一度に 1 つ以上のフレームをレンダリングします。 シーン ファイルが格納されているドライブをマウントすると、計算ノードから共有データに簡単にアクセスできるようになります。

また、パフォーマンス、スループット、1 秒あたりの入出力操作 (IOPS) の要件を満たすために、基になるファイル システムを選ぶこともできます。 データに同時にアクセスする計算ノードの数に基づいて、ファイル システムを個別にスケーリングできます。

たとえば、Avere vFXT の分散型メモリ内キャッシュを使用すると、オンプレミスのソース データにアクセスする、数千単位の同時レンダリング ノードを使用する大規模な映画規模のレンダリングをサポートできます。 または、既にクラウドベースの BLOB ストレージに存在するデータの場合は、BlobFuse を使用して、このデータをローカル ファイル システムとしてマウントできます。 Azure Files には BlobFuse と同様のワークフローが用意されており、Windows と Linux の両方で使用できます。

サポートされている構成

マウントできるファイル システムの種類は次のとおりです。

  • Azure Files
  • Azure BLOB ストレージ
  • Avere vFXT キャッシュを含むネットワーク ファイル システム (NFS)
  • 共通インターネット ファイル システム (CIFS)

Batch では、それぞれのパブリッシャーとオファー用に生成されるノード エージェントに対して、次の種類の仮想ファイル システムをサポートします。

OS の種類 Azure Files 共有 Azure BLOB コンテナー NFS マウント CIFS マウント
Linux ✔️ ✔️ ✔️ ✔️
Windows ✔️

Note

仮想ファイル システムのマウントは、2019 年 8 月 8 日より前に作成された Batch プールではサポートされません。

ネットワーク要件

仮想ネットワーク内の Batch プールで仮想ファイル マウントを使用するときは、次の要件を考慮して、必要なトラフィックがブロックされないようにしてください。 詳細については、仮想ネットワーク内の Batch プールに関する記事をご覧ください。

  • Azure Files 共有では、storage サービス タグとの間のトラフィック用に TCP ポート 445 を開く必要があります。 詳細については、Windows での Azure ファイル共有の使用に関する記事を参照してください。

  • Azure BLOB コンテナーでは、storage サービス タグとの間のトラフィック用に TCP ポート 443 を開く必要があります。 blobfuse および gpg パッケージをダウンロードするために、仮想マシン (VM) から https://packages.microsoft.com にアクセスできる必要があります。 構成によっては、他の URL にアクセスすることが必要になる場合があります。

  • ネットワーク ファイル システム (NFS) では、既定でポート 2049 にアクセスできる必要があります。 お使いの構成に他の要件がある場合もあります。 nfs-common (Debian または Ubuntu 用) パッケージをダウンロードするには、VM が適切なパッケージ マネージャーにアクセスできる必要があります。 URL は、使用している OS バージョンによって異なる場合があります。 構成によっては、他の URL にアクセスすることが必要になる場合もあります。

    NFS 経由で Azure BLOB または Azure Files をマウントする場合は、さらにネットワーク要件が増える場合があります。 たとえば、計算ノードでストレージ アカウントと同じ仮想ネットワーク サブネットを使用する必要が生じる場合があります。

  • 共通インターネット ファイル システム (CIFS) では、TCP ポート 445 にアクセスできる必要があります。 cifs-utils パッケージをダウンロードするには、VM が適切なパッケージ マネージャーにアクセスできる必要があります。 URL は、使用している OS バージョンによって異なる場合があります。

マウントの構成と実装

プールに仮想ファイル システムをマウントすると、プール内のすべての計算ノードでファイル システムを使用できるようになります。 ファイル システムの構成は、計算ノードがプールに参加するか、再起動するか、再イメージ化されると発生します。

ファイル システムをプールにマウントするには、お使いの仮想ファイル システムに合った MountConfiguration オブジェクト (AzureBlobFileSystemConfigurationAzureFileShareConfigurationNfsMountConfiguration、または CifsMountConfiguration) を作成します。

すべてのマウント構成オブジェクトには、次の基本パラメーターが必要です。 一部のマウント構成には、特定のファイル システム用の特定のパラメーターがあり、これについてはコード例で詳しく説明します。

  • ストレージ アカウントのアカウント名またはソース

  • 相対的なマウント パスまたはソース (計算ノードにマウントされるファイル システムの場所)。AZ_BATCH_NODE_MOUNTS_DIR を介してアクセスできる標準の \fsmounts ディレクトリの相対的な場所です。

    \fsmounts ディレクトリの正確な 場所は、ノードの OS によって異なります。 たとえば、Ubuntu ノード上の場所は、mnt\batch\tasks\fsmounts に対応します。

  • ファイル システムをマウントするための特定のパラメーターを示す、マウント オプションまたは BlobFuse オプション

プールと MountConfiguration オブジェクトを作成したら、そのオブジェクトを MountConfigurationList プロパティに割り当てます。 ファイル システムのマウントは、ノードがプールに参加するか、再起動するか、再イメージ化されると行われます。

Batch エージェントは、Windows や Linux と異なる方法でマウントを実装します。

  • Linux では、Batch によってパッケージ cifs-utils がインストールされます。 次に、Batch によってマウント コマンドが発行されます。

  • Windows では、Batch が cmdkey を使用して Batch アカウントの資格情報を追加します。 次に、Batch で net use によってマウント コマンドが発行されます。 次に例を示します。

    net use S: \\<storage-account-name>.file.core.windows.net\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
    

ファイル システムをマウントすると、環境変数 AZ_BATCH_NODE_MOUNTS_DIR が作成されます。この環境変数は、マウントされたファイル システムとログ ファイルの場所を指しています。 ログ ファイルは、トラブルシューティングとデバッグに使用できます。

PowerShell を使用して Azure Files 共有をマウントする

Azure PowerShell を使用して、Windows または Linux の Batch プールに Azure Files 共有をマウントできます。 次の手順では、Azure ファイル共有ファイル システムを構成し、Batch プールにマウントする方法について説明します。

重要

プールにマウントされるファイル システムの最大数は 10 です。 詳細とその他の制限については、「Batch サービスのクォータと制限」を参照してください。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。
  • Azure PowerShell がインストールされていること。そうでない場合は、Azure Cloud Shell を使用してインターフェイスとして PowerShell を選択します。
  • ファイル共有がある、リンクされた Azure Storage アカウントを持つ既存の Batch アカウント。
  1. プレースホルダーをお使いのサブスクリプション ID に置き換えて、Azure サブスクリプションにサインインします。

    Connect-AzAccount -Subscription "<subscription-ID>"
    
  2. Batch アカウントのコンテキストを取得します。 プレースホルダー <batch-account-name> を実際の Batch アカウント名に置き換えます。

    $context = Get-AzBatchAccount -AccountName <batch-account-name>
    
  3. 次の設定を使用して Batch プールを作成します。 プレースホルダー <storage-account-name><storage-account-key><file-share-name> を、Batch アカウントにリンクされているストレージ アカウントの値に置き換えます。 プレースホルダー <pool-name> をプールに使用する名前に置き換えます。

    次のスクリプトでは、Windows Server 2016 Datacenter の Standard_D2_V2 サイズのノードを 1 つ含むプールを作成し、そのノードの S ドライブに Azure ファイル共有をマウントします。

    $fileShareConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSAzureFileShareConfiguration" -ArgumentList @("<storage-account-name>", "https://<storage-account-name>.file.core.windows.net/batchfileshare1", "S", "<storage-account-key>")
    
    $mountConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSMountConfiguration" -ArgumentList @($fileShareConfig)
    
    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1 -MountConfiguration @($mountConfig) -BatchContext $context
    
  4. ノードに接続し、出力ファイルが正しいことを確認します。

マウントされたファイルにアクセスする

Azure Batch タスクでは、次の例のようなドライブの直接パスを使用して、マウントされたファイルにアクセスできます。

cmd /c "more S:\folder1\out.txt & timeout /t 90 > NULL"

Azure Batch エージェントでは、Azure Batch タスクに対してのみアクセス権を付与します。 リモート デスクトップ プロトコル (RDP) を使用してノードに接続する場合、ユーザー アカウントではマウントしているドライブに自動的にアクセスできません。 RDP 経由でノードに接続する場合、ストレージ アカウントで S ドライブに直接アクセスするには資格情報を追加する必要があります。

資格情報を追加するには、cmdkey を使用します。 プレースホルダー <storage-account-name> および <storage-account-key> を独自の情報に置き換えます。

cmdkey /add:"<storage-account-name>.file.core.windows.net" /user:"Azure\<storage-account-name>" /pass:"<storage-account-key>"

マウントの問題のトラブルシューティング

マウント構成が失敗した場合、計算ノードは失敗し、ノードの状態は使用不可になります。 マウント構成エラーを診断するには、ComputeNodeError プロパティでエラーの詳細を調べます。

デバッグ用のログ ファイルを取得する場合は、OutputFiles API を使用して *.log ファイルをアップロードできます。 *.log ファイルには、AZ_BATCH_NODE_MOUNTS_DIR の場所にあるファイル システムのマウントに関する情報が含まれています。 マウント ログ ファイルの形式は、マウントごとに <type>-<mountDirOrDrive>.log となります。 たとえば、test というマウント ディレクトリの CIFS マウントの場合、cifs-test.log という名前のマウント ログ ファイルが作成されます。

マウント エラーを調査する

ノードに RDP または SSH で接続して、ファイルシステムのマウントに関連するログ ファイルを確認できます。 Azure ファイル共有を Batch ノードにマウントしようとすると、次の例のようなエラー メッセージが表示されます。

Mount Configuration Error | An error was encountered while configuring specified mount(s)
Message: System error (out of memory, cannot fork, no more loop devices)
MountConfigurationPath: S

このエラーが発生した場合は、関連するログ ファイルを確認するためにノードに RDP または SSH 接続します。 Batch エージェントは、Azure ファイル共有に対して Windows と Linux で異なるマウントを実装しています。 Linux では、Batch によってパッケージ cifs-utils がインストールされます。 次に、Batch によってマウント コマンドが発行されます。 Windows では、Batch が cmdkey を使用して Batch アカウントの資格情報を追加します。 次に、Batch で net use によってマウント コマンドが発行されます。 次に例を示します。

net use S: \\<storage-account-name>.file.core.windows.net\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
  1. RDP 経由でノードに接続します。

  2. D:\batch\tasks\fsmounts のログ ファイル fshare-S.log を開きます。

  3. エラー メッセージを確認します。次に例を示します。

    CMDKEY: Credential added successfully.
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  4. Azure ファイル共有のトラブルシューティング ツールを使用して問題のトラブルシューティングを行います。

RDP または SSH を使用してノード上のログ ファイルを確認できない場合は、Azure ストレージ アカウントにログをアップロードできます。 この方法は、Windows と Linux の両方のログに使用できます。

  1. Azure portal で、プールを含む Batch アカウントを検索して選択します。

  2. Batch アカウント ページで、左側のナビゲーションから [プール] を選択します。

  3. [プール] ページで、プールの名前を選択します。

  4. プールのページで、左側のナビゲーションから [ノード] を選択します。

  5. [ノード] ページで、ノードの名前を選択します。

  6. ノードのページで、[Batch ログのアップロード] を選択します。

  7. [Batch ログのアップロード] ペインで、[ストレージ コンテナーを選択します] を選択します。

  8. [ストレージ アカウント] ページで、ストレージ アカウントを選択します。

  9. [コンテナー] ページで、ファイルのアップロード先のコンテナーを選択または作成し、[選択] を選択します。

  10. [アップロードの開始] を選択します。

  11. アップロードが完了したら、ファイルをダウンロードし、agent-debug.log を開きます。

  12. エラー メッセージを確認します。次に例を示します。

    ..20210322T113107.448Z.00000000-0000-0000-0000-000000000000.ERROR.agent.mount.filesystems.basefilesystem.basefilesystem.py.run_cmd_persist_output_async.59.2912.MainThread.3580.Mount command failed with exit code: 2, output:
    
    CMDKEY: Credential added successfully.
    
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  13. Azure ファイル共有のトラブルシューティング ツールを使用して問題のトラブルシューティングを行います。

PowerShell を使用してファイル共有を手動でマウントする

マウント エラーを診断または修正できない場合は、代わりに PowerShell を使用してファイル共有を手動でマウントできます。

  1. マウント構成を使用せずにプールを作成します。 次に例を示します。

    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1  -BatchContext $Context
    
  2. ノードがアイドル状態になるまで待ちます。

  3. Azure portal で、ファイル共有を含むストレージ アカウントを検索して選択します。

  4. ストレージ アカウント ページのメニューで、左側のナビゲーションから [ファイル共有] を選択します。

  5. [ファイル共有] ページで、マウントするファイル共有を選択します。

  6. ファイル共有のページで [接続] を選択します。

  7. [接続] ペインで、 [Windows] タブを選択します。

  8. [ドライブ文字] に、使用するドライブを入力します。 既定値は Z です。

  9. [認証方法] で、ファイル共有への接続方法を選択します。

  10. [Show Script] (スクリプトの表示) を選択し、ファイル共有をマウントするための PowerShell スクリプトをコピーします。

  11. RDP 経由でノードに接続します。

  12. コピーしたコマンドを実行して、ファイル共有をマウントします。

  13. 出力でエラー メッセージを確認します。 この情報を使用して、ネットワーク関連の問題のトラブルシューティングを行います。

マウント構成の例

次のコード例の構成は、さまざまなファイル共有システムを計算ノードのプールにマウントする方法を示しています。

Azure Files 共有

Azure Files は、標準の Azure クラウド ファイル システム オファリングです。 次の構成では、<file-share-name> という名前の Azure Files 共有を S ドライブにマウントします。 この例のパラメーターの詳細については、「SMB Azure ファイル共有を Windows でマウントする」または「Azure portal を使用して NFS Azure ファイル共有を作成し、Linux VM にマウントする」を参照してください。

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureFileShareConfiguration = new AzureFileShareConfiguration
            {
                AccountName = "<storage-account-name>",
                AzureFileUrl = "https://<storage-account-name>.file.core.windows.net/<file-share-name>",
                AccountKey = "<storage-account-key>",
                RelativeMountPath = "S",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,sec=ntlmssp"
            },
        }
    }
}

Azure BLOB コンテナー

もう 1 つの選択肢は、BlobFuse を介して Azure Blob Storage を使用することです。 BLOB ファイル システムをマウントするには、アカウント キー、Shared Access Signature (SAS) キー、またはストレージ アカウントへのアクセス権を持つマネージド ID が必要です。

これらのキーまたは ID の取得については、次の記事を参照してください。

次の構成では、BlobFuse オプションを使用して BLOB ファイル システムをマウントします。 この例では、説明のために AccountKeySasKeyIdentityReference をすべて示していますが、実際にはこれらのメソッドの 1 つだけを指定できます。

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureBlobFileSystemConfiguration = new AzureBlobFileSystemConfiguration
            {
                AccountName = "<storage-account-name>",
                ContainerName = "<container-name>",
                // Use only one of the following three lines:
                AccountKey = "<storage-account-key>",
                SasKey = "<sas-key>",
                IdentityReference = new ComputeNodeIdentityReference("/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"),
                RelativeMountPath = "<relative-mount-path>",
                BlobfuseOptions = "-o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 "
            },
        }
    }
}

BlobFuse でマウントされたディレクトリへの既定のアクセスを取得するには、管理者としてタスクを実行します。 BlobFuse を使ってディレクトリがユーザー空間にマウントされ、プールの作成時にそのディレクトリがルートとしてマウントされます。 Linux では、すべての管理者タスクがルートになります。 FUSE のリファレンス ページで、FUSE モジュールのすべてのオプションを説明しています。

BlobFuse の使用に関する詳細とヒントについては、次のリファレンスを参照してください。

NFS

NFS 共有をプール ノードにマウントすると、Batch で従来のファイル システムにアクセスできます。 この設定は、クラウドにデプロイされる単一の NFS サーバー、または仮想ネットワーク経由でアクセスされるオンプレミスの NFS サーバーの場合があります。 NFS マウントは、データ集中型ハイパフォーマンス コンピューティング (HPC) タスク用の分散インメモリ キャッシュである Avere vFXT に対応しています。 また、NFS マウントは、Azure BLOB の NFSAzure Files の NFS など、他の標準的な NFS 準拠インターフェイスにも対応しています。

次の例は、NFS ファイル システム マウントの構成を示しています。

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            NfsMountConfiguration = new NFSMountConfiguration
            {
                Source = "<source>",
                RelativeMountPath = "<relative-mount-path>",
                MountOptions = "options ver=3.0"
            },
        }
    }
}

CIFS

プール ノードへの CIFS のマウントは、従来のファイル システムへのアクセスを提供するもう 1 つの方法です。 CIFS は、ネットワーク サーバーのファイルとサービスを要求するためのオープンなクロスプラットフォーム メカニズムを提供するファイル共有プロトコルです。 CIFS は、インターネットおよびイントラネット ファイル共有用の SMB プロトコルの拡張バージョンに基づいています。

次の例は、CIFS ファイル マウントの構成を示しています。

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            CifsMountConfiguration = new CIFSMountConfiguration
            {
                Username = "<storage-account-name>",
                RelativeMountPath = "<relative-mount-path>",
                Source = "<source>",
                Password = "<storage-account-key>",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,serverino,domain=<domain-name>"
            },
        }
    }
}

Note

C# ではなく PowerShell を使用する例をお探しの場合は、 これに適した別の例: Azure ファイルの Azure Batch プールへのマウントに関するページを参照してください。

次のステップ