Per la memorizzazione di file, piccoli e grandi che siano, Azure Storage è il servizio di riferimento sulla piattaforma Microsoft. E' altamente scalabile, affidabile, interamente gestito, ridondato su più regioni e praticamente con spazio infinito.
Può capitare di conseguenza di dover copiare o spostare blob da un container all'altro, magari anche di due account diversi, eventualmente di due regioni diverse. Finché ci troviamo a lavorare con pochi file può bastare l'utilizzo delle API o di tool come Azure Storage Explorer per fare il download e poi effettuare l'upload dei file. Quando però i file sono di qualche GB questa tecnica si dimostra per nulla efficace.
Viene in aiuto un tool di nome AzCopy che troviamo a questo indirizzo https://docs.microsoft.com/it-it/azure/storage/common/storage-use-azcopy, disponibile per Windows e Linux, il quale ottimizza questo processo sfruttando un API specifica dei blob che permette di copiare un contenuto con un trasferimento server, senza coinvolgere il client. Questo significa che il client non fa più da passacarte e ottimizziamo il traffico tra due container, anche su due account diversi.
Con il seguente script PowerShell possiamo quindi indicare l'account sorgente e quello destinatario per avviare un trasferimento.
$sourceStorageAccountName = "account1" $sourceStorageAccountKey = "Abc==" $sourceContainer = "source" $destStorageAccountName = "account2" $destStorageAccountKey = "Abc==" $destContainer = "dest" azcopy --source https://$sourceStorageAccountName.blob.core.windows.net/$sourceContainer --source-key $sourceStorageAccountKey --destination https://$destStorageAccountName.blob.core.windows.net/$destContainer --dest-key $destStorageAccountKey --recursive --resume --quiet
Con questa tecnica, se i file sono di grandi dimensioni, riusciamo a raggiungere anche velocità di trasferimento di 80/100 Mb/s, meno se i file sono di piccola dimensione.
Nella figura il tool è lanciato da Cloud Shell, il quale dispone già dello strumento installato. Dobbiamo solo prestare attenzione al fatto che la shell ha un timeout e chiudersi se non restiamo attivi sulla finestra. Per questo motivo il comando prima indicato usa le opzioni --resume e --quiet per riprendere il trasferimento da dove si è interrotto, senza chiedere conferme. Il tool utilizza infatti un journal per mantenere lo stato di trasferimento e poterlo riprendere.
Possiamo inoltre sfruttare altre API di PowerShell per trasferire tutti i container di un account interrogando prima i container presenti.
$sourceStorageAccountName = "account1" $sourceStorageAccountKey = "Abc==" $destStorageAccountName = "account2" $destStorageAccountKey = "Abc==" $sourceStorageAccount = New-AzureStorageContext -StorageAccountName $sourceStorageAccountName -StorageAccountKey $sourceStorageAccountKey $destStorageAccount = New-AzureStorageContext -StorageAccountName $destStorageAccountName -StorageAccountKey $destStorageAccountKey $containers = Get-AzureStorageContainer -Context $sourceStorageAccount foreach($container in $containers) { Write-Host "Copying container $($container.Name) from $($sourceStorageAccountName) to $($destStorageAccountName)" azcopy --source https://$sourceStorageAccountName.blob.core.windows.net/$($container.Name) --source-key $sourceStorageAccountKey --destination https://$destStorageAccountName.blob.core.windows.net/$($container.Name) --dest-key $destStorageAccountKey --recursive }
Lo script avvia un trasferimento per volta e se il container destinatario non esiste viene creato automaticamente dal tool stesso.
Occorre prestare attenzione, infine, alla posizione degli account sorgente e destinatario. Il traffico effettuato tra due diverse regioni, infatti, ha un costo, secondo quando previsto dalla piattaforma.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Catturare la telemetria degli eventi di output cache in ASP.NET Core
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Gestire domini wildcard in Azure Container Apps
Verificare la provenienza di un commit tramite le GitHub Actions
Utilizzare ChatGPT con Azure OpenAI
Eseguire una GroupBy per entity in Entity Framework
Utilizzare domini personalizzati gestiti automaticamente con Azure Container Apps
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Routing statico e PreRendering in una Blazor Web App
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Utilizzare Model as a Service su Microsoft Azure