Servir sitios y aplicaciones web en Azure usando un archivo ZIP (Run From Package)

30/08/2018
Artículo original

Se trata de una (relativamente) nueva característica de Azure Web Apps que ha pasado inadvertida para la mayor parte de los usuarios de la nube de Microsoft y que, sin embargo, es muy interesante.

Cuando creamos una aplicación Web en Azure disponemos de una carpeta /site/wwwroot en la raíz que es la que alberga los archivos de nuestra aplicación. El despligue de la aplicación a esta carpeta se puede hacer de múltiples formas: copiando por FTP los archivos, haciendo un push a una rama de un repositorio Git en Gihub o en cualquier otro servicio de Git en la nube (incluyendo un propio repo local en el Azure Web site), e incluso desplegando desde un disco en la nube como Dropbox o OneDrive. Al final se trata tan solo de hacer llegar a esa carpeta los archivos pertinentes. A partir de ese momento el Sitio Web de Azure los ejecuta (si son de aplicaciones backend) o los sirve a Internet (en caso de archivos estáticos).

Desde mediados de febrero de este año 2018 existe una nueva opción muy interesante denominada Run From Package, y que no es ni más ni menos que servir nuestros archivos directamente desde un archivo ZIP que puede estar ubicado en cualquier sitio del mundo. Es decir, lo puedes compartir en tu Dropbox, un una release de Github, en otro servidor o en un Blob de Azure Storage de la misma zona (que es lo que recomienda Microsoft), pero con que sea accesible públicamente llega.

Lo que hace el servicio es montar el .zip en la carpeta /site/wwwroot, como si realmente estuvieran allí, y actúa con ellos como si los hubiésemos copiado mediante cualquier otro medio de despliegue. Espera que lo aclare mejor, que la sutileza igual no se pilla bien:

Azure Web Sites NO copia el zip, lo descomprime en esa carpeta y luego se pone a usarlo. No. Lo que hace es utilizar el ZIP directamente desde su ubicación. ¿Cuánto mola eso?

Aparte de molar mucho, esto tiene varias ventajas:

  • Atomicidad: cuando ejecutas un sitio web desde wwwroot tienes muchos archivos y carpetas y debes gestionarlos uno a uno. Si por ejemplo los copias por FTP (o con cualquier otro método), no se copian todos a la vez, sino uno a uno, por lo que la aplicación puede quedar en un estado indefinido mientras se están copiando, con una mezcla temporal y dinámica de archivos en la que algunos se han actualizado y otros están todavía con la versión antigua. Con Run From Package esto no ocurre y el despliegue de la aplicación se hace para todos los archivos a la vez, en el momento en el que se monta el ZIP. A la hora de desplegar no hay que copiar los archivos sino que el ZIP se monta y en el momento de hacerlo todos los archivos están disponibles a la vez.
  • Rapidez: especialmente en aplicaciones grandes, con muchos archivos. Dado que por debajo la app lee los archivos desde el ZIP a medida que los necesita (con una pequeña caché) no es necesario copiar o descomprimir miles de archivos, por lo que el despliegue es muy, muy rápido aunque haya muchos o sean grandes. Esto hace que además se inicien muy rápido también.
  • Versionamiento: si vas dejando los ZIPs de todas las versiones que vayas desplegando en sus ubicaciones originales, cambiar a una versión anterior cualquiera si algo va mal es tan fácil como apuntar de nuevo al archivo antiguo. Incluso podrías tener varios slots de la misma aplicación, cada uno apuntando a versiones diferentes de la aplicación.
  • Servir aplicaciones para otras personas/empresas: simplemente les pasas la ubicación del archivo y podrán tener la aplicación funcionando en unos segundos, como veremos enseguida. Si sacas una nueva versión, actualizas el ZIP y todo el mundo se actualiza automáticamente (aunque no lo verán hasta que se reinicie la Webapp en Azure, cosa que se hace periódicamente o que se puede forzar si los avisas: enseguida lo veremos). Cada app que "tire" del ZIP además podría configurar unos parámetros propios desde la interfaz de Azure para, por ejemplo, usar su propio almacenamiento externo o una clave de API que necesite la aplicación.

Estas aplicaciones ejecutadas desde un ZIP remoto también tienen sus limitaciones:

  • La principal limitación es que, dado que se ejecutan desde un ZIP remoto, son aplicaciones de solo lectura. Es decir, no se puede escribir a disco desde las aplicaciones. Esto, en realidad, es casi más una ventaja que una limitación ya que una app en Azure debería escribir la información en cualquier caso a almacenamiento externo a las Azure Webapps. Por ejemplo, si los usuarios suben archivos anotarás el nombre del archivo en una base de datos (o una tabla de Azure Storage) y el archivo en sí deberías guardarlo en un Blog de Azure Storage. Así que realmente no es un grave problema.
  • Solo funciona (al menos por el momento) en Web Apps bajo Windows. De todos modos puedes usar .NET, .NET Core, Node.js Python, Java, PHP... no es una limitación tampoco demasiado grave.

Bueno, ya está bien de hablar. Vamos a la práctica. Simplemente quédate con un dato: WEBSITE_RUN_FROM_ZIP.

Este es el nombre del parámetro de la Azure Web App que debes configurar para indicarle en dónde está el ZIP que quieres utilizar. Vas a la interfaz de tu Azure Web App en el portal de Azure, en el apartado de "Settings" creas este apartado, y listo.

Nota: hace unos días anunciaron en GitHub que, dado que la característica se llama "Run From Package" (Ejecutar Desde Paquete), en breve podrás usar también el ajuste WEBSITE_RUN_FROM_PACKAGE en vez del anterior, que es el que yo uso en el vídeo. Funcionarán ambos siempre, aunque no aclaran cuál tendrá preferencia en caso de definir ambos.

Te lo enseño en la práctica en funcionamiento, en el siguiente vídeo:

[youtube:FWnsZpbSJX8]

Aquí te dejo también algunos enlaces de interés:

¡Espero que te parezca útil!