US の Azure Support Team のブログから便利な TIPS を抜粋。
想定されるシナリオ
例えば、NIC や Public IP を大量に作成する際、1 個ずつ同期的に作成すると、時間がかかります。
(例えば、1 つの作成に 30 秒かかる場合、単純計算で 30 個作るには 15 分かかります)
これを非同期で一括作成すれば、何個作ろうが 1 個作成するのと大差ない時間で完了します。
VPN Gateway とか、Application Gateway のように 1 個当たり数十分かかるようなリソースを作成する際には非常に使えそうですね。
具体的な方法
以下に ARM で Public IP を指定した個数作成するスクリプトがあります。
※ 文字コードのせいか、文字化けしますが、12 行目の末尾を (“System.Diagnostics”) にすればエラーなく使えます。
ただ、長くて何をやっているかが一目では分かりにくいので、最小限にすると以下のような感じになります。
ポイントは 11 行目で並列実行する処理を $sb (ScriptBlock?) として定義している所と、14 行目の [PowerShell]::Create() あたりですかね。
# 変数定義 [int]$count = "<作成数>" [string]$namePrefix = "<リソース名の接頭辞>" [string]$rgName = "<リソース グループ名>" [string]$location = "<リージョン名>" # ジョブの作成と開始を $count 回ループ実行 for($i=1;$i -le $count;$i++){ $sb = { Param($namePrefix,$i,$rgName,$location) $dontcare = New-AzureRmPublicIpAddress -Name "$($namePrefix)$($i)" -ResourceGroupName $rgName -Location $location -AllocationMethod Dynamic } New-Variable -Name "create$($namePrefix)$($i)" -Value ([PowerShell]::Create()) (Get-Variable -Name "create$($namePrefix)$($i)" -ValueOnly).AddScript($sb).AddArgument($namePrefix).AddArgument($i).AddArgument($rgName).AddArgument($location) New-Variable -Name "jobCreate$($namePrefix)$($i)" -Value ((Get-Variable -Name "create$($namePrefix)$($i)" -ValueOnly).BeginInvoke()) }
で、元のスクリプトでは、処理にかかった時間を測るためにストップウォッチで時間を測っていたり、ジョブが完了したかをひたすらループでチェックしているので長くなってます。使いこなせると便利なので、必要になったときは積極的にサンプルをパクって使いましょう。
ネタ元
- Microsoft Azure: How to execute a synchronous Azure PowerShell cmdlet multiple times at once, using a single PowerShell session
https://blogs.msdn.microsoft.com/mast/2016/06/29/microsoft-azure-how-to-execute-a-synchronous-azure-powershell-cmdlet-multiple-times-at-once-using-a-single-powershell-session/
1 comment for “Azure PowerShell で多数のリソースを並列作成する”