Migrar os blobs para várias contas de armazenamento com AzCopy no Windows
Este exemplo copia todos os objetos do blob de uma conta de armazenamento de origem fornecida pelo utilizador para outra de destino fornecida também pelo utilizador.
Para fazê-lo, é utilizado o comando Get-AzStorageContainer
, que lista todos os contentores numa conta de armazenamento. Depois, o exemplo emite comandos AzCopy, copiando cada contentor da conta de armazenamento de origem para a de destino. Se ocorrerem falhas, o exemplo repete $retryTimes (a predefinição é três vezes, mas pode ser modificada com o parâmetro -RetryTimes
). Se as falhas se verificarem em todas as repetições, o utilizador pode voltar a executar o script ao fornecer ao exemplo o último contentor copiado com êxito através do comando -LastSuccessContainerName
. Em seguida, o exemplo continua a copiar contentores a partir desse ponto.
Esta amostra requer a Azure PowerShell Armazenamento versão do módulo 0.7 ou posterior. Pode utilizar Get-Module -ListAvailable Az.storage
para verificar a versão que tem instalada. Se precisar de instalar ou atualizar, veja Install Azure PowerShell module(Instalar o módulo do Azure PowerShell).
Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
Este exemplo também requer a versão mais recente do AzCopy no Windows. O diretório predefinido da instalação é C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy\
Este exemplo utiliza o nome e a chave de uma conta de armazenamento de origem e de uma conta de armazenamento de destino e o caminho de ficheiro completo de AzCopy.exe (se não estiver instalado no diretório predefinido).
Seguem-se algumas amostras da entrada deste exemplo:
Se AzCopy estiver instalado no diretório predefinido:
srcStorageAccountName: ExampleSourceStorageAccountName
srcStorageAccountKey: ExampleSourceStorageAccountKey
DestStorageAccountName: ExampleTargetStorageAccountName
DestStorageAccountKey: ExampleTargetStorageAccountKey
Se AzCopy não estiver instalado no diretório predefinido:
srcStorageAccountName: ExampleSourceStorageAccountName
srcStorageAccountKey: ExampleSourceStorageAccountKey
DestStorageAccountName: ExampleTargetStorageAccountName
DestStorageAccountKey: ExampleTargetStorageAccountKey
AzCopyPath: C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy\AzCopy.exe
Se ocorrer uma falha e for necessário voltar a executar o exemplo a partir de um determinado contentor:
.\copyScript.ps1 -LastSuccessContainerName myContainerName
Script de exemplo
# Run the script in a new open Powershell window, which has not run other cmdlets, or AzCopy performance could suffer .
# Need install Azure PowerShell before runing the script: https://github.com/Azure/azure-powershell/releases
# Need install AzCopy before runing the script: https://docs.microsoft.com/Az.Storage/common/storage-use-azcopy
# Do not modify the Source or Destination accounts while the copy is running
param (
[Parameter(Mandatory = $true,
HelpMessage= "Source Storage account name.")]
[ValidatePattern("^[a-z0-9`]{3,24}$")]
[String]$srcStorageAccountName,
[Parameter(Mandatory = $true,
HelpMessage= "Source Storage account key.")]
[String]$srcStorageAccountKey,
[Parameter(Mandatory = $true,
HelpMessage= "Destination Storage account name.")]
[ValidatePattern("^[a-z0-9`]{3,24}$")]
[String]$DestStorageAccountName,
[Parameter(Mandatory = $true,
HelpMessage= "Destination Storage account key.")]
[String]$DestStorageAccountKey,
[Parameter(Mandatory = $false,
HelpMessage= "Input the full filePath of the AzCopy.exe, e.g.: C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy\AzCopy.exe")]
[String]$AzCopyPath = "C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy\AzCopy.exe",
[Parameter(Mandatory = $false,
HelpMessage='Sets the number of retries in an event of failure. Set to 0 for no retry, set -1 for infinite retry.')]
[Int32]$RetryTimes = 3,
[Parameter(Mandatory = $false,
ValueFromPipeline = $true,
HelpMessage='Used for resume operation. When provided, the script will copy containers that are alphabetically after $LastSuccessContainerName')]
[String]$LastSuccessContainerName = $nullz
)
if( (Get-Item $AzCopyPath).Exists)
{
$FileItemVersion = (Get-Item $AzCopyPath).VersionInfo
$FilePath = ("{0}.{1}.{2}.{3}" -f $FileItemVersion.FileMajorPart, $FileItemVersion.FileMinorPart, $FileItemVersion.FileBuildPart, $FileItemVersion.FilePrivatePart)
# only netcore version AzCopy.exe has version 0.0.0.0, and all netcore version AzCopy works in this script
if(([version] $FilePath -lt "7.0.0.2") -and ([version] $FilePath -ne "0.0.0.0"))
{
$AzCopyPath = Read-Host "Version of AzCopy found at default install directory is of a lower, unsupported version. Please input the full filePath of the AzCopy.exe that is version 7.0.0.2 or higher, e.g.: C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy\AzCopy.exe"
}
}
elseIf( (Get-Item $AzCopyPath).Exists -eq $false)
{
$AzCopyPath = Read-Host "Input the full filePath of the AzCopy.exe, e.g.: C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy\AzCopy.exe"
}
# Create and check Storage context
$Error.Clear()
$srcCtx = New-AzStorageContext -StorageAccountName $srcStorageAccountName -StorageAccountKey $srcStorageAccountKey
if ($srcCtx -eq $null)
{
Write-Error "Script could not create source Storage Context, possibly due to invalid StorageAccountName or StorageAccount Key terminating: $Error[0]";
return;
}
$destCtx = New-AzStorageContext -StorageAccountName $destStorageAccountName -StorageAccountKey $destStorageAccountKey
if ($destCtx -eq $null)
{
Write-Error "Script could not create destination storage context, possibly due to invalid StorageAccountName or StorageAccount Key terminating: $Error[0]";
return;
}
#Check Source and Destination Storage account Connection
$Error.Clear()
$Containers = Get-AzStorageContainer -MaxCount 1 -Context $srcCtx
if ($Error.Count -gt 0)
{
Write-Error "Script failed to connect to source Storage account, terminating: $Error[0]";
return;
}
$Containers = Get-AzStorageContainer -MaxCount 1 -Context $destCtx
if ($Error.Count -gt 0)
{
Write-Error "Script failed to connect to destination Storage account, terminating: $Error[0]";
return;
}
#Check AzCopy Path
if((Test-Path $AzCopyPath) -eq $false)
{
Write-Error "Script is terminating since the provided AzCopyPath does not exist: $AzCopyPath ";
return;
}
elseif((Get-Item $AzCopyPath).BaseName -ne "AzCopy" )
{
Write-Error "Script is terminating since the provided AzCopyPath does not refer to the AzCopy exe: $AzCopyPath ";
return;
}
elseif((Get-Item $AzCopyPath).BaseName -eq "AzCopy")
{
$FileItemVersion = (Get-Item $AzCopyPath).VersionInfo
$FilePath = ("{0}.{1}.{2}.{3}" -f $FileItemVersion.FileMajorPart, $FileItemVersion.FileMinorPart, $FileItemVersion.FileBuildPart, $FileItemVersion.FilePrivatePart)
if([version] $FilePath -lt "7.0.0.2")
{
$AzCopyPath = Read-Host "Version of AzCopy found at provided path is of a lower, unsupported version. Please input the full filePath of the AzCopy.exe that is version 7.0.0.2 or higher, e.g.: C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy\AzCopy.exe"
}
}
$OutputLastSuccessContainer = $LastSuccessContainerName;
$HasReachedLastSuccessContainer = $false;
if ($LastSuccessContainerName -eq $null -or $LastSuccessContainerName -eq "")
{
$HasReachedLastSuccessContainer = $true;
}
# For list container
$MaxReturn = 250
$Token = $Null
do{
# List source containers
$retry = 1
$Error.Clear()
$srcContainers = Get-AzStorageContainer -MaxCount $MaxReturn -ContinuationToken $Token -Context $srcCtx
# If list container fail, retry it
while(($Error.Count -gt 0) -and ($RetryTimes -eq -1 -or $retry -le $retryTimes))
{
Write-Host "Retry List containers $retry"
$Error.Clear()
$srcContainers = Get-AzStorageContainer -MaxCount $MaxReturn -ContinuationToken $Token -Context $srcCtx
$retry++
}
# If list container fail after retry, break script
if ($Error.Count -gt 0){
Write-Error "Terminating the script since listing source containers failed: $Error[0]";
$CopyContainerFail = $true
break;
}
$Token = $srcContainers[$srcContainers.Count -1].ContinuationToken;
# Transfer containers one by one
$CopyContainerFail = $false
foreach ($container in $srcContainers)
{
if (!$HasReachedLastSuccessContainer)
{
if ($container.Name -eq $LastSuccessContainerName)
{
$HasReachedLastSuccessContainer = $true;
}
Write-Host "Skipping container copy: $($container.Name)"
Continue;
}
Write-Host "Start copying container: $($container.Name)"
$retry = 1
# Get AzCopy command for transfer one container
$destContainer = $destCtx.StorageAccount.CreateCloudBlobClient().GetContainerReference($container.Name)
$azCopyCmd = [string]::Format("""{0}"" /source:{1} /dest:{2} /sourcekey:""{3}"" /destkey:""{4}"" /snapshot /y /s /synccopy",$AzCopyPath, $container.CloudBlobContainer.Uri.AbsoluteUri, $destContainer.Uri.AbsoluteUri, $srcStorageAccountKey, $DestStorageAccountKey)
# Execute the AzCopy command first time
Write-Host "$azCopyCmd"
$result = cmd /c $azCopyCmd
foreach($s in $result)
{
Write-Host $s
}
# If transfer failed, retry it
while(($LASTEXITCODE -ne 0) -and ($RetryTimes -eq -1 -or $retry -le $retryTimes))
{
Write-Host "Retry $retry : $azCopyCmd"
$result = cmd /c $azCopyCmd
foreach($s in $result)
{
Write-Host $s
}
$retry++
}
# If tranfer failed after retry, print error
if ($LASTEXITCODE -ne 0){
Write-Error "Container copy failed: $($container.Name)";
$CopyContainerFail = $true
break;
}
else
{
Write-Host "Finished copying container: $($container.Name)"
Write-Host ""
$OutputLastSuccessContainer = $container.Name
}
}
if($CopyContainerFail)
{
break;
}
}
While ($Token -ne $Null)
# Summary the copy result
if ($CopyContainerFail)
{
if(($OutputLastSuccessContainer -ne $null) -and ($OutputLastSuccessContainer -ne ""))
{
Write-Warning "To resume, rerun the script and append the parameter: ""-LastSuccessContainer $OutputLastSuccessContainer"""
return $OutputLastSuccessContainer
}
else
{
Write-Warning "To resume, rerun the script."
return $null
}
}
else
{
Write-Host "All Containers copied successfully."
return ""
}
Explicação do script
Este script utiliza os seguintes comandos para copiar dados de uma conta de armazenamento para outra. Cada item na tabela liga para documentação de comandos específicos.
Comando | Notas |
---|---|
Get-AzStorageContainer | Devolve os contentores associados a esta conta de armazenamento. |
New-AzStorageContext | Cria um contexto de armazenamento do Azure. |
Passos seguintes
Para obter mais informações sobre o módulo do Azure PowerShell, veja Documentação do Azure PowerShell.
Pode ver exemplos adicionais de scripts de armazenamento do PowerShell em PowerShell samples for Azure Blob storage (Exemplos do PowerShell para o armazenamento de Blobs do Azure).