2016-03-23 14 views
2

Ich versuche, alle Container innerhalb eines Speicherkontos in einen einzelnen Container auf einem anderen Speicherkonto zu kopieren. Ich habe das ohne Probleme auf meiner eigenen Maschine laufen lassen, aber ich möchte es mit Azure Automation automatisieren.Verwenden von AzureStorageContext innerhalb des Powershell-Workflows

Wenn Sie ein Standard-Powershell-Skript ausführen, werden alle asynchronen Aufrufe synchron ausgeführt. Um dies zu beheben, habe ich versucht, ein "Powershell Workflow" Runbook hinzuzufügen. Das Problem dabei ist, dass ich ein paar Aufrufe von Azure-Speicherbefehlen habe, die eine Instanz eines AzureStorageContext erfordern. Das Problem ist, dass ich den Kontext nicht an irgendetwas binden kann, weil es in eine Zeichenfolge serialisiert wurde.

Ich habe den folgenden Code:

$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 
    } 
} 

Eine Standard Abhilfe für dieses ist ein InlineScript Block zu verwenden, alles zu verarbeiten, die das Kontextobjekt erfordert. Wenn ich das aber tun würde, würde ich die Fähigkeit verlieren, Blobs parallel zu kopieren.

Gibt es eine Möglichkeit, dies in Azure Automation zu tun, während gleichzeitig der Kopierbefehl für alle Blobs parallel gestartet wird?

Antwort

1

Sie sollten den Inline Block innerhalb der foreach-parallel in der Lage zu setzen, das alle InlineScripts parallel laufen:

$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 
     } 
    } 
} 

Alternativ können Sie eine „Master“ Runbook haben könnte, die ein Bündel beginnt von Runbook-Jobs für ein "single blob transfer" -Runbook, wobei jeder Job ein anderes Blob zur Übertragung aufnimmt. Alle diese Runbook-Jobs werden im Azure Automation-Dienst parallel ausgeführt.

+0

Ich versuchte dies und es war manchmal nicht glücklich, wenn Sie einen Kontext erstellen. Es gab keine große Verbesserung wegen des Aufwands, dies zu tun. Mir wurde klar, dass es nicht wirklich darauf wartet, dass der Blob kopiert wird, er läuft einfach sehr langsam. Ich kann damit leben, dass der Job ein paar Stunden länger dauert, wenn ich es automatisieren kann. Danke für Ihre Hilfe. – Jonathan

Verwandte Themen