PowerShell ジョブを使用したコマンドレットの並列実行
重要
Az PowerShell モジュール で AzureRM PowerShell モジュールのすべての機能およびその他を利用できるようになったため、2024 年 2 月 29 日に AzureRM PowerShell モジュールは廃止になります。
サービスの中断を回避するために、2024 年 2 月 29 日までに、AzureRM PowerShell モジュールを使用するスクリプトを更新して、Az PowerShell モジュールを使用するようにしてください。 スクリプトを自動的に更新するには、 クイックスタート ガイドに従ってください。
PowerShell は、PowerShell ジョブによる非同期アクションをサポートしています。 Azure PowerShell は、Azure に対するネットワーク呼び出し (および、呼び出し待機) に大きく依存します。 非ブロッキング呼び出しを実行しなければならないことはよくあるでしょう。 このニーズに対処するために、Azure PowerShell ではファースト クラス PSJob がサポートされます。
コンテキストの永続化と PSJob
PSJob は個別のプロセスで実行されるため、ご自身の Azure 接続は、これらの PSJob と共有されている必要があります。 コンテキストは、Connect-AzureRmAccount
でご自身の Azure アカウントにサインインしてから、ジョブに渡してください。
$creds = Get-Credential
$job = Start-Job { param($context,$vmadmin) New-AzureRmVM -Name MyVm -AzureRmContext $context -Credential $vmadmin} -Arguments (Get-AzureRmContext),$creds
ただし、コンテキストが Enable-AzureRmContextAutosave
で自動的に保存されるように選択した場合、そのコンテキストは、作成するすべてのジョブと自動的に共有されます。
Enable-AzureRmContextAutosave
$creds = Get-Credential
$job = Start-Job { param($vmadmin) New-AzureRmVM -Name MyVm -Credential $vmadmin} -Arguments $creds
自動ジョブと -AsJob
必要に応じて、Azure PowerShell は実行時間の長い一部のコマンドレットで -AsJob
スイッチを提供します。
-AsJob
スイッチにより、PSJob の作成がさらに簡単になります。
$creds = Get-Credential
$job = New-AzureRmVM -Name MyVm -Credential $creds -AsJob
ジョブと進行状況は、Get-Job
および Get-AzureRmVM
を使用していつでも確認できます。
Get-Job $job
Get-AzureRmVM MyVm
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Long Running Operation for 'New-AzureRmVM' AzureLongRunningJob`1 Running True localhost New-AzureRmVM
ResourceGroupName Name Location VmSize OsType NIC ProvisioningState Zone
----------------- ---- -------- ------ ------ --- ----------------- ----
MyVm MyVm eastus Standard_DS1_v2 Windows MyVm Creating
ジョブが完了したら、Receive-Job
を使用してジョブの結果を取得します。
注意
Receive-Job
は、-AsJob
フラグが存在しないように、コマンドレットから結果を返します。 たとえば、Do-Action -AsJob
の Receive-Job
結果の種類は、Do-Action
の結果と同じです。
$vm = Receive-Job $job
$vm
ResourceGroupName : MyVm
Id : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyVm/providers/Microsoft.Compute/virtualMachines/MyVm
VmId : dff1f79e-a8f7-4664-ab72-0ec28b9fbb5b
Name : MyVm
Type : Microsoft.Compute/virtualMachines
Location : eastus
Tags : {}
HardwareProfile : {VmSize}
NetworkProfile : {NetworkInterfaces}
OSProfile : {ComputerName, AdminUsername, WindowsConfiguration, Secrets}
ProvisioningState : Succeeded
StorageProfile : {ImageReference, OsDisk, DataDisks}
FullyQualifiedDomainName : myvmmyvm.eastus.cloudapp.azure.com
シナリオ例
複数の VM を一度に作成します。
$creds = Get-Credential
# Create 10 jobs.
for($k = 0; $k -lt 10; $k++) {
New-AzureRmVm -Name MyVm$k -Credential $creds -AsJob
}
# Get all jobs and wait on them.
Get-Job | Wait-Job
"All jobs completed"
Get-AzureRmVM
この例では、Wait-Job
コマンドレットは、ジョブの実行中にスクリプトを一時停止します。 スクリプトは、すべてのジョブが完了した後に実行を続けます。 複数のジョブが並列で実行され、スクリプトはその完了後に続行されます。
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
3 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
4 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
5 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
6 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
7 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
8 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
9 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
10 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
11 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
2 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
3 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
4 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
5 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
6 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
7 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
8 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
9 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
10 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
11 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
All Jobs completed.
ResourceGroupName Name Location VmSize OsType NIC ProvisioningState Zone
----------------- ---- -------- ------ ------ --- ----------------- ----
MYVM MyVm eastus Standard_DS1_v2 Windows MyVm Succeeded
MYVM0 MyVm0 eastus Standard_DS1_v2 Windows MyVm0 Succeeded
MYVM1 MyVm1 eastus Standard_DS1_v2 Windows MyVm1 Succeeded
MYVM2 MyVm2 eastus Standard_DS1_v2 Windows MyVm2 Succeeded
MYVM3 MyVm3 eastus Standard_DS1_v2 Windows MyVm3 Succeeded
MYVM4 MyVm4 eastus Standard_DS1_v2 Windows MyVm4 Succeeded
MYVM5 MyVm5 eastus Standard_DS1_v2 Windows MyVm5 Succeeded
MYVM6 MyVm6 eastus Standard_DS1_v2 Windows MyVm6 Succeeded
MYVM7 MyVm7 eastus Standard_DS1_v2 Windows MyVm7 Succeeded
MYVM8 MyVm8 eastus Standard_DS1_v2 Windows MyVm8 Succeeded
MYVM9 MyVm9 eastus Standard_DS1_v2 Windows MyVm9 Succeeded