ストレージ アカウント内のすべてのコンテナーを別のストレージ アカウントの単一のコンテナーにコピーしようとしています。自分のマシンで問題なく動作するようになりましたが、Azure Automation を使用して自動化したいと考えています。
標準の PowerShell スクリプトを実行すると、すべての非同期呼び出しが同期的に発生します。これを解決するために、「Powershell Workflow」ランブックを追加してみました。これに関する問題は、AzureStorageContext
. 問題は、コンテキストが文字列にシリアル化されるため、コンテキストを何にもバインドできないことです。
次のコードがあります。
$destinationContext = (New-AzureStorageContext -StorageAccountName $destinationAccountName -StorageAccountKey $destinationAccountKey)
$sourceContext = (New-AzureStorageContext -StorageAccountName $prodAccountName -StorageAccountKey $prodAccountKey)
$allContainers = Get-AzureStorageContainer -Context $sourceContext
$startTime = Get-Date -Format "yyyyMMddhhmmss"
foreach ($container in $allContainers.Name)
{
$allBlobs = (Get-AzureStorageBlob -Container $container -Context $sourceContext).Name
foreach -Parallel ($blob in $allBlobs)
{
$fileName = $startTime + "/" + $container + "/" + $blob
Write-Information "Copying $fileName"
Start-AzureStorageBlobCopy -SrcBlob $blob -DestBlob $fileName -SrcContainer $container -Context $sourceContext -DestContext $destinationContext -DestContainer $destinationContainer
}
}
これに対する標準的な回避策InlineScript
は、コンテキスト オブジェクトを必要とするすべての処理にブロックを使用することです。ただし、それを行うと、BLOB を並行してコピーする機能が失われます。
すべての BLOB のコピー コマンドを並行して開始しながら、Azure Automation でこれを行う方法はありますか?