2

我正在尝试将存储帐户内的所有容器复制到另一个存储帐户上的单个容器中。我已经在我自己的机器上完成了这项工作,没有任何问题,但我想使用 Azure 自动化来自动化它。

当运行一个标准的 powershell 脚本时,所有的异步调用都是同步发生的。为了解决这个问题,我尝试添加“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块来处理任何需要上下文对象的东西。但是,如果我这样做,我将失去并行复制 blob 的能力。

有什么方法可以在 Azure 自动化上执行此操作,同时仍然并行启动所有 blob 的复制命令?

4

1 回答 1

1

您应该能够将 InlineScript 块放在 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
       }
    }
} 

或者,您可以有一个“主”运行手册,它为“单个 blob 传输”运行手册启动一堆运行手册作业,其中每个作业接受不同的 blob 进行传输。所有这些 Runbook 作业都将在 Azure 自动化服务上并行运行。

于 2016-03-23T22:00:42.823 回答