代码之家  ›  专栏  ›  技术社区  ›  Reddspark

从Azure文件复制到BLOB

  •  1
  • Reddspark  · 技术社区  · 7 年前

    Azure有没有一种方法可以在存储容器之间移动文件,而无需将其下载回笔记本电脑?我尝试了AzCopy,但似乎是下载,然后重新上传文件。

    2 回复  |  直到 7 年前
        1
  •  3
  •   silent    7 年前

    server-side copy . 这实际上是默认行为。 你可以找到一个例子 here AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer1 /Dest:https://myaccount.blob.core.windows.net/mycontainer2 /SourceKey:key /DestKey:key /Pattern:abc.txt

    但是,请注意:由于您基本上是免费从Azure获得所需的计算作为备用容量,因此您不会获得任何性能SLA。因此,这在大多数情况下都比在同一Azure区域中使用快速VM和使用所谓的同步复制(down-and upload to copy,使用 /SyncCopy 参数)。

    所以:如果你有时间和什么可以省钱,使用服务器端拷贝。如果您想快速复制,请使用/SyncCopy

        2
  •  0
  •   Sage    7 年前

    你需要一个 Runbook

    https://blogs.msdn.microsoft.com/cloud_solution_architect/2016/05/09/azure-storage-account-backup-azure-automation-runbook-azure-functions/

    下面是相关代码,稍加修改,使ResourceGroup成为一个变量。

    $primary = Get-AutomationVariable -Name 'Log-Storage-Primary'
    $secondary = Get-AutomationVariable -Name 'Log-Storage-Secondary'
    $ResourceGroupName = Get-AutomatioNVariable -Name 'LogStorageResourceGroup'
    
    $Conn = Get-AutomationConnection -Name AzureRunAsConnection
    Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
    
    $primarykey = Get-AzureRmStorageAccountKey -ResourceGroupName $ResourceGroupName -Name $primary
    $secondarykey = Get-AzureRmStorageAccountKey -ResourceGroupName $ResourceGroupName -Name $secondary
    
    $primaryctx = New-AzureStorageContext -StorageAccountName $primary -StorageAccountKey $primarykey.Key1
    $secondaryctx = New-AzureStorageContext -StorageAccountName $secondary -StorageAccountKey $secondarykey.Key1
    
    $primarycontainers = Get-AzureStorageContainer -Context $primaryctx
    
    # Loop through each of the containers
    foreach($container in $primarycontainers) {
        # Do a quick check to see if the secondary container exists, if not, create it.
        $secContainer = Get-AzureStorageContainer -Name $container.Name -Context $secondaryctx -ErrorAction SilentlyContinue
    
        if (!$secContainer) {
            $secContainer = New-AzureStorageContainer -Context $secondaryctx -Name $container.Name
            Write-Host "Successfully created Container" $secContainer.Name "in Account" $secondary
        }
    
        # Loop through all of the objects within the container and copy them to the same container on the secondary account
        $primaryblobs = Get-AzureStorageBlob -Container $container.Name -Context $primaryctx
        foreach($blob in $primaryblobs) {
            $copyblob = Get-AzureStorageBlob -Context $secondaryctx -Blob $blob.Name -Container $container.Name -ErrorAction SilentlyContinue
    
            # Check to see if the blob exists in the secondary account or if it has been updated since the last runtime.
            if (!$copyblob -or $blob.LastModified -gt $copyblob.LastModified) {
                $copyblob = Start-AzureStorageBlobCopy -SrcBlob $blob.Name -SrcContainer $container.Name -Context $primaryctx -DestContainer $secContainer.Name -DestContext $secondaryctx -DestBlob $blob.Name
                $status = $copyblob | Get-AzureStorageBlobCopyState
    
                while ($status.Status -eq "Pending") {
                    $status = $copyblob | Get-AzureStorageBlobCopyState
                    Start-Sleep 10
                }
                Write-Host "Successfully copied blob" $copyblob.Name "to Account" $secondary "in container" $container.Name
            }
        }
    }