Muchas veces en un entorno cloud, y en concreto en Azure, nos encontramos en la necesidad de mover todos los ficheros de un Blob Storage a otro.
El Pasado
Hasta hace poco teníamos tres opciones para hacerlo:
- Por AzCopy.
- Por la aplicación de Microsoft Azure Sotrage.
- O bien mediante código.
Al final la opción escogida normalmente es por AzCopy ya que las otras dos opciones tienen muchos inconvenientes y/o incomodidades, por lo que nos encontramos con el problema de que no podemos escribir un código que nos mueva los ficheros de un Blob a otro , que sea óptimo, rápido y aproveche toda la computación del hardware.
El Presente
Hace poquitos meses ya podemos escribir código que nos permite realizar estas operaciones. Azure Storage Data Movement Library (https://docs.microsoft.com/en-us/azure/storage/common/storage-use-data-movement-library) es una librería de Microsoft que se basa en la tecnología de AzCopy que nos permite realizar estas operaciones.
¿Qué podemos hacer con esta librería?
- Definir el número operaciones en paralelo que deseamos utilizar para subir, actualizar o bajar ficheros.
- El tamaño de bloque a utilizar. Cuando interactuamos con ficheros las operaciones nunca se hacen de golpe, sino que se hace mediante trocitos, denominados chunks, con el fin de optimizar las conexiones.
- Saber el progreso de transferencia.
- Subir ficheros y directorios a un Blob Storage.
- Copiar ficheros de una URL a un Blobl Storage.
- O como ya hemos comentado copiar ficheros de un Blob Storage a otro.
Perfecto, ahora ya tenemos una librería que nos permite realizar código para el objetivo deseado y de forma óptima y rápida, ahora solos nos queda tener suficientes máquinas para llevar a cabo la operación de la forma más rápida.
Pues bien, lo tenemos a nuestro alcance, simplemente hemos de utilizar Durable Azure Functions con Azure Storage Data Movement para paralelizar estas operaciones.
Demo Time
Vamos a ver cómo hacerlo.
Crearemos una Durable Azure Function que lo que hará es ir al Blob Storage de origen, obtener el nombre de todos los ficheros a mover, y después llamar a tantas funciones como archivos haya que lo que hagan es mover el fichero de un Blob a otro.
La Azure Durable Functions finalizará cuando todas las funciones de subida de ficheros hayan acabado.
El código de la Azure Durable Function sería:
Donde la función GetBloBNames devuelve el listado de ficheros a mover.
Después tenemos la función CopyBlob que tiene la forma siguiente:
Obtenemos la URI del Blob de origen, el de destino y mediante TransferManager.CopyBlob que es un método de la librería Azure Storage Data Movement lo llevamos de una al otro.
Show me the result
Vale, de acuerdo ¿queréis pruebas de que esto es la bomba? Ahí van :
Blob de origen –> West Europe – 198 ficheros 11,3 Gb en total
Blob de destino –> North Europe.
Imagen 1: La prueba que los Blobs están en regiones diferentes
Blob de origen:
Imagen 2: Número de ficheros en el Blob de origen
Blob de destino después de lanzar el proceso:
Imagen 3: Número de ficheros en el Blob de destino después del proceso.
Tiempo del proceso:
Imagen 4: Traza de inicio del proceso.
Imagen 5: Traza de fin del proceso.
Como se puede observar hemos transferido 198 ficheros de 11,3 Gb de un Blob a otro de diferentes regiones en 7 minutos aproximadamente.
El código completo lo podéis descargar en:
https://github.com/bermejoblasco/DataMovement-DurableFunctions
Happy coding!