Использование 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.