Ejecución de una aplicación en Azure App Service directamente desde un paquete ZIP

En Azure App Service, puede ejecutar sus aplicaciones directamente desde un archivo de paquete ZIP de implementación. En este artículo se muestra cómo habilitar esta funcionalidad en la aplicación.

Todos los demás métodos de implementación de App Service tienen algo en común: los archivos se implementan en D:\home\site\wwwroot en la aplicación (o /home/site/wwwroot para las aplicaciones de Linux). Dado que la aplicación usa el mismo directorio en tiempo de ejecución, es posible que la implementación no se realice correctamente debido a conflictos de bloqueo de archivos, y que la aplicación se comporte de forma impredecible porque algunos de los archivos aún no se han actualizado.

Por el contrario, cuando se ejecuta directamente desde un paquete, los archivos del paquete no se copian en el directorio wwwroot. En su lugar, el propio paquete ZIP se monta directamente como directorio wwwroot de solo lectura. Son varias las ventajas de ejecutar directamente desde un paquete:

  • Elimina los conflictos de bloqueo de archivos entre la implementación y el tiempo de ejecución.
  • Garantiza que solo se ejecuten aplicaciones de implementación completa en todo momento.
  • Se pueden implementar en una aplicación de producción (con reinicio).
  • Mejora el rendimiento de las implementaciones de Azure Resource Manager.
  • Puede reducir los tiempos de arranque en frío, especialmente para las funciones de JavaScript con árboles de paquete de npm grandes.

Nota

Actualmente, solo se admiten archivos de paquete ZIP.

Creación de un paquete ZIP de proyecto

Importante

Al crear el paquete ZIP para la implementación, no incluya el directorio raíz, sino solo los archivos y directorios que contiene. Si descarga un repositorio de GitHub como un archivo ZIP, no puede implementar ese archivo tal cual en App Service. GitHub agrega directorios anidados adicionales en el nivel superior que no funcionan con App Service.

En la ventana de un terminal local, navegue hasta el directorio raíz del proyecto de la aplicación.

Este directorio debería contener el archivo de entrada para la aplicación web como, por ejemplo, index.html, index.php y app.js. También puede contener archivos de administración de paquetes como project.json, composer.json, package.json, bower.json y requirements.txt.

A menos que desee que App Service ejecute la automatización de implementación automáticamente, ejecute todas las tareas de compilación (por ejemplo, npm, bower, gulp, composer y pip) y asegúrese de que tiene todos los archivos que necesita para ejecutar la aplicación. Este paso es necesario si desea ejecutar su paquete directamente.

Cree un archivo ZIP con todo el contenido del proyecto. En el caso de los proyectos dotnet, todo está en el directorio de salida del comando dotnet publish (excepto el propio directorio de salida). Por ejemplo, el siguiente comando en el terminal para crear un paquete ZIP del contenido del directorio actual:

# Bash
zip -r <file-name>.zip .

# PowerShell
Compress-Archive -Path * -DestinationPath <file-name>.zip

Habilitación de la ejecución desde el paquete

La configuración de aplicación WEBSITE_RUN_FROM_PACKAGE permite ejecutar desde un paquete. Para establecerlo, ejecute los siguientes comandos con la CLI de Azure.

az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings WEBSITE_RUN_FROM_PACKAGE="1"

WEBSITE_RUN_FROM_PACKAGE="1" permite ejecutar la aplicación desde un paquete local en la aplicación. También puede ejecutar desde un paquete remoto.

Ejecutar el paquete

La manera más sencilla de ejecutar un paquete en App Service es con el comando az webapp deployment source config-zip de la CLI de Azure. Por ejemplo:

az webapp deployment source config-zip --resource-group <group-name> --name <app-name> --src <filename>.zip

Dado que la configuración de la aplicación WEBSITE_RUN_FROM_PACKAGE está establecida, este comando no extrae el contenido del paquete en el directorio D:\home\site\wwwroot de la aplicación. En su lugar, carga el archivo ZIP tal cual en D:\home\data\SitePackages y crea un nombredelpaquete.txt en el mismo directorio, que contiene el nombre del paquete ZIP que se cargará en tiempo de ejecución. Si carga el paquete ZIP de manera diferente (por ejemplo, FTP), debe crear el directorio D:\home\data\SitePackages y el archivo nombredelpaquete.txt manualmente.

El comando también reinicia la aplicación. Dado que WEBSITE_RUN_FROM_PACKAGE se ha establecido, App Service monta el paquete cargado como directorio wwwroot de solo lectura y ejecuta la aplicación directamente desde ese directorio montado.

Ejecución desde una dirección URL externa en su lugar

También puede ejecutar un paquete desde una dirección URL externa, como Azure Blob Storage. Puede usar el Explorador de Azure Storage para cargar archivos de paquete en la cuenta de Blob Storage. Debe usar un contenedor de almacenamiento privado con una Firma de acceso compartido (SAS) o bien una identidad administrada para permitir que el entorno de ejecución de App Service acceda al paquete de manera segura.

Una vez que cargue el archivo en Blob Storage y tenga una dirección URL de SAS para el archivo, establezca la configuración de la aplicación WEBSITE_RUN_FROM_PACKAGE en la dirección URL. En el ejemplo siguiente se usa la CLI de Azure:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_RUN_FROM_PACKAGE="https://myblobstorage.blob.core.windows.net/content/SampleCoreMVCApp.zip?st=2018-02-13T09%3A48%3A00Z&se=2044-06-14T09%3A48%3A00Z&sp=rl&sv=2017-04-17&sr=b&sig=bNrVrEFzRHQB17GFJ7boEanetyJ9DGwBSV8OM3Mdh%2FM%3D"

Si publica un paquete actualizado con el mismo nombre en Blob Storage, debe reiniciar la aplicación para que el paquete actualizado se cargue en App Service.

Acceso a un paquete en Azure Blob Storage mediante una identidad administrada

Azure Blob Storage se puede configurar para autorizar solicitudes con Microsoft Entra ID. Esto significa que, en lugar de generar una clave SAS con una fecha de expiración, puede confiar en la identidad administrada de la aplicación. De manera predeterminada, se usará la identidad asignada por el sistema de la aplicación. Si desea especificar una identidad asignada por el usuario, puede establecer la configuración de la aplicación WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID en el identificador de recurso de esa identidad. El valor también puede aceptar "SystemAssigned" como valor, aunque esto es lo mismo que omitir la configuración por completo.

Para habilitar la captura del paquete mediante la identidad:

  1. Asegúrese de que el blob esté configurado para acceso privado.

  2. Conceda a la identidad el rol Lector de datos de Storage Blob con ámbito en el blob del paquete. Consulte Asignación de un rol de Azure para acceder a datos de blobs para obtener información sobre la creación de la asignación de roles.

  3. Establezca la configuración de la aplicación WEBSITE_RUN_FROM_PACKAGE en la dirección URL del blob del paquete. Probablemente tendrá el formato "https://{nombre-de-la-cuenta-de-almacenamiento}.blob.core.windows.net/{nombre-del-contenedor}/{ruta-de-acceso-al-paquete}" o similar.

Implementación de archivos de WebJob cuando se ejecutan desde el paquete

Hay dos maneras de implementar archivos de WebJob al habilitar la ejecución de una aplicación desde el paquete:

  • Implementarlos en el mismo paquete ZIP que la aplicación: inclúyalos como lo haría normalmente en <project-root>\app_data\jobs\... (que se asigna a la ruta de acceso de implementación \site\wwwroot\app_data\jobs\..., tal como se especifica en el Inicio rápido de WebJobs).
  • Implementarlos por separado desde el paquete ZIP de la aplicación: dado que la ruta de acceso de implementación \site\wwwroot\app_data\jobs\... habitual ahora es de solo lectura, no se pueden implementar archivos de WebJob ahí. En su lugar, implemente los archivos de WebJob en \site\jobs\..., que no es de solo lectura. Tanto los archivos de WebJobs implementados en \site\wwwroot\app_data\jobs\... como en \site\jobs\... se ejecutan.

Nota

Cuando \site\wwwroot es de solo lectura, se producirá un error en las operaciones como la creación del archivo disable.job.

Solución de problemas

  • La ejecución directa desde un paquete hace que wwwroot sea de solo lectura. La aplicación recibirá un error si intenta escribir archivos en este directorio.
  • No se admiten los formatos de archivo TAR y GZIP.
  • El archivo ZIP puede tener un máximo de 1 GB
  • Esta característica no es compatible con caché local.
  • Para mejorar el rendimiento del arranque en frío, utilice la opción de archivo zip local (WEBSITE_RUN_FROM_PACKAGE = 1).

Más recursos