2

ストレージ アカウント内のすべてのコンテナーを別のストレージ アカウントの単一のコンテナーにコピーしようとしています。自分のマシンで問題なく動作するようになりましたが、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 でこれを行う方法はありますか?

4

1 に答える 1

1

foreach -parallel 内に InlineScript ブロックを配置できるはずです。これにより、すべての InlineScript が並列で実行されます。

$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)
    {
        InlineScript {
            $destinationContext = (New-AzureStorageContext -StorageAccountName $using:destinationAccountName -StorageAccountKey $using:destinationAccountKey)
            $sourceContext = (New-AzureStorageContext -StorageAccountName $using:prodAccountName -StorageAccountKey $using:prodAccountKey)

            $fileName = $using:startTime + "/" + $using:container + "/" + $using:blob
            Write-Information "Copying $fileName"
            Start-AzureStorageBlobCopy -SrcBlob $using:blob -DestBlob $fileName -SrcContainer $using:container -Context $sourceContext -DestContext $destinationContext -DestContainer $using:destinationContainer
       }
    }
} 

または、「単一 BLOB 転送」Runbook の一連の Runbook ジョブを開始する「マスター」Runbook を使用することもできます。この場合、各ジョブは異なる BLOB を取り込んで転送します。これらの Runbook ジョブはすべて、Azure Automation サービスで並行して実行されます。

于 2016-03-23T22:00:42.823 に答える