Trabajando con Azure Storage y Data Movement Library

Desde que se lanzó AzCopy, un gran número de usuarios solicitaron acceso por código a sus funcionalidades, y no solo usarlo como la herramienta de linea de comandos que es. Y como ya sabes, nos gusta escuchar a nuestros usuarios, por lo que en septiembre de 2015 se anunció la versión 0.1.0 de Azure Storage Data Movement Library, que acaba de ser actualizada a su versión 0.2.0 en este comienzo de año. Esta librería se basa en el framework de transferencia de datos que conforma el núcleo de AzCopy, está diseñada para operaciones de transferencia de datos de alto rendimiento usando Azure Storage, de manera fiable y sencilla, y permite escenarios tales como:

  • Subida, descarga y copiado de datos entre Blobs y Files en Azure Storage
  • Migración de datos desde otros proveedores de la nube (como AWS S3) a Azure Blob Storage
  • Backup de datos almacenados en Azure Storage

Veamos un ejemplo de cómo podríamos subir un blob (puedes ver más ejemplos en GitHub):

 using System;
using System.Threading;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
// Incluimos Azure Storage Data Movement Library como librería del proyecto
using Microsoft.WindowsAzure.Storage.DataMovement;

// Establecemos el contexto de almacenamiento y el contenido a subir
string storageConnectionString = "myStorageConnectionString";
CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString);
CloudBlobClient blobClient = account.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference("mycontainer");
blobContainer.CreateIfNotExists();
string sourcePath = "path\\to\\test.txt";
CloudBlockBlob destBlob = blobContainer.GetBlockBlobReference("myblob");

// Usamos las interfaces de Azure Storage Data Movement Library para subir el blob
// Configuramos el número de operaciones concurrentes
TransferManager.Configurations.ParallelOperations = 64;

// Configuramos el contexto de transferencia y controlamos el progreso de la subida
TransferContext context = new TransferContext();
context.ProgressHandler = new Progress<TransferProgress>((progress) =>
{
    Console.WriteLine("Bytes uploaded: {0}", progress.BytesTransferred);
});

// Subida del blob desde el contenido en local
var task = TransferManager.UploadAsync(sourcePath, 
                                       destBlob, 
                                       null, 
                                       context,
                                       CancellationToken.None);
task.Wait();

Funcionalidad original en la versión 0.1.0

Azure Storage Data Movement Library tiene el mismo rendimiento y expone las mismas funcionalidades que AzCopy, y pone todo esto a tu alcance para ser usado desde el código de cualquier proyecto en .NET. Puedes instalar la preview de esta librería desde Nuget o descargar el código fuente desde GitHub. En la versión inicial de la librería (0.1.0), se incluyeron las siguientes funcionalidades:

  • Soporte de transferencia de datos para Blobs en Azure Storage
  • Soporte de transferencia de datos para Files en Azure Storage
  • Descarga, subida y copiado de un elemento
  • Control sobre el número de operaciones concurrentes
  • Copiado síncrono y asíncrono
  • Definición del sufijo del user agent
  • Definición del content type
  • Definición de condiciones para el copiado de objetos, por ejemplo: copiar objetos que hayan cambiado desde una fecha dada
  • Descarga de un snapshot concreto de un blob
  • Tracking del progreso de una transferencia de datos: bytes transferidos, número de archivos subidos exitosamente o con fallo o  excluidos
  • Recuperación (establecer y/o obtener checkpoints en una transferencia de datos)
  • Manejo de errores en transferencias de datos (Transfer Exception y código de error)
  • Logs en la parte de cliente

Novedades de la nueva versión 0.2.0

El comienzo de 2016 nos ha traído las siguientes nuevas funcionalidades incluidas en la nueva versión de la librería, con las cuales podrás transferir datos a nivel de Blob container y de directorio virtual (tanto de Blobs como de Files):

  • Descarga, subida y copiado de directorios (tanto locales como de Blobs o de Files en Azure)
  • Transferencia de directorios en modo recursivo
  • Transferencia de directorios en modo flat (directorios locales)
  • Especificar el patrón de búsqueda cuando se estén copiando archivos y directorios
  • Evento para obtener el resultado de una transferencia de un único archivo
  • Descarga de snapshots bajo directorios

¿Echas algo en falta? ¿Necesitas ayuda?

Azure Data Movement Library es un proyecto open-source, y las aportaciones de la comunidad son más que bienvenidas. Nuevos ejemplos se van añadiendo a la librería en su repositorio de GitHub, y especialmente aquí es donde más se agradecen estas contribuciones, para ayudar a hacer los ejemplos lo más completos posible.

Si empiezas a jugar con ello y encuentras algún problema, siempre puedes dirigir tus dudas a nuestros foros (en este caso al de Azure, por ejemplo) en los que los miembros de nuestras comunidades participan activamente y siempre están dispuestos a ayudarse y colaborar entre todos.

Un saludo,

Gorka Madariaga - Technical Evangelist - @Gk_8