在powershell工作流中使用AzureStorageContext

时间:2016-03-23 18:22:03

标签: powershell azure azure-automation powershell-workflow

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

运行标准PowerShell脚本时,所有异步调用都是同步进行的。为解决此问题,我尝试添加“Powershell Workflow”Runbook。与此有关的问题是,我对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的复制命令?

1 个答案:

答案 0 :(得分:1)

你应该能够将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
       }
    }
} 

或者,您可以拥有一个“主”Runbook,为“单个blob传输”Runbook启动一系列Runbook作业,其中每个作业都会使用不同的blob进行传输。所有这些Runbook作业都将在Azure自动化服务上并行运行。