在 powershell 工作流中使用 AzureStorageContext

Using AzureStorageContext inside of powershell workflow

我正在尝试将存储帐户内的所有容器复制到另一个存储帐户上的单个容器中。我已经在我自己的机器上正常运行了,但我想使用 Azure Automation 将其自动化。

当 运行 一个标准的 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 并行启动复制命令?

您应该能够将 InlineScript 块放在 foreach -parallel 中,这将 运行 所有 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
       }
    }
} 

或者,您可以让一本 "master" 运行 书为一本 "single blob transfer" 运行 书启动一堆 运行 书工作,其中每个作业接受不同的 blob 进行传输。所有这些 运行 预订作业都将 运行 在 Azure 自动化服务上并行进行。