2016-03-23 20 views
2

ストレージアカウント内のすべてのコンテナを別のストレージアカウント上の単一のコンテナにコピーしようとしています。私はこれを自分のマシン上で問題なく稼働させましたが、Azure Automationを使用して自動化したいと思います。Powershellワークフロー内でAzureStorageContextを使用する

標準のPowerShellスクリプトを実行すると、すべての非同期呼び出しが同期して実行されます。これを解決するために、「Powershell Workflow」ランブックを追加しようとしました。それは、AzureStorageContextのインスタンスを必要とするAzureストレージコマンドをいくつか呼び出しているということです。問題は、文字列にシリアライズされているため、コンテキストをバインドできないことです。

$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のcopyコマンドを並列に開始している間にAzure Automationでこれを行う方法はありますか?

答えて

1

あなたは並行して、すべてのInlineScriptsを実行すること、のforeach -parallel内の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 
     } 
    } 
} 

を代わりにそれぞれのジョブが転送する別のブロブを取り込む「単一ブロブ転送」ランブックのランブックジョブ。これらのランブックジョブはすべて、Azure Automationサービスで並行して実行されます。

+0

私はこれを試しましたが、コンテキストを作成するときに時々幸せではありませんでした。これを行うオーバーヘッドのために改善はあまりありませんでした。私はそれが実際にBLOBをコピーするのを待っているわけではないことに気づいた。私は自動化でそれを持つことができる場合、私は仕事で2時間以上かかることができます。ご協力いただきありがとうございます。 – Jonathan

関連する問題