Servir sitios y aplicaciones web en Azure usando un archivo ZIP (Run From Package)
Tags: azure, webdev, spanish
Published: 2018-09-18 08:04:35

---
title: Servir sitios y aplicaciones web en Azure usando un archivo ZIP (Run From Package)
published: true
tags: Azure, WebDev, Spanish
canonical_url: https://www.jasoft.org/Blog/post/servir-sitios-y-aplicaciones-web-en-azure-usando-un-archivo-zip.aspx
---

![cover_image](https://thepracticaldev.s3.amazonaws.com/i/jr3chz1q6jpry3l5r1bf.png)

Se trata de una (relativamente) **nueva característica de [Azure Web Apps](https://www.jasoft.org/Blog/?Tag=/Azure%20Web%20Apps)** 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:

- [Deploy your app to Azure App Service with a ZIP or WAR file](https://docs.microsoft.com/en-us/azure/app-service/app-service-deploy-zip)
- [Zip Push Deployment for Web Apps, Functions and WebJobs](https://blogs.msdn.microsoft.com/appserviceteam/2017/10/16/zip-push-deployment-for-web-apps-functions-and-webjobs/)
- [El issue original en el que se anunció la característica](https://github.com/Azure/app-service-announcements/issues/84)
- [El _issue_ de Github en el que se deben discutir dudas](https://github.com/Azure/app-service-announcements-discussions/issues/32) con el equipo de Azure responsable de esto.

¡Espero que te parezca útil!