Использование AzureStorageContext внутри рабочего процесса powershell

Я пытаюсь скопировать все контейнеры внутри учетной записи хранения в один контейнер другой учетной записи хранения. Я получил эту работу на своей машине без каких-либо проблем, но я хотел бы автоматизировать ее с помощью Azure Automation.

При запуске стандартного сценария powershell все асинхронные вызовы происходят синхронно. Чтобы решить эту проблему, я попытался добавить Runbook Powershell Workflow. Проблема в том, что у меня есть несколько обращений к командам хранилища Azure, для которых требуется экземпляр 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 блок для обработки всего, что требует объекта контекста. Однако, если бы я это сделал, я бы потерял способность копировать капли параллельно.

Есть ли способ сделать это в Azure Automation, продолжая параллельно запускать команду копирования для всех больших двоичных объектов?

1 ответ

Решение

Вы должны иметь возможность поместить блок InlineScript в foreach -параллель, которая будет запускать все InlineScripts параллельно:

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

В качестве альтернативы, вы могли бы иметь "главную" книгу запусков, которая запускает кучу заданий Runbook для книги запусков с "передачей одного двоичного объекта", где каждое задание требует передачи отдельного большого двоичного объекта. Все эти задания Runbook будут выполняться параллельно в службе автоматизации Azure.

Другие вопросы по тегам