Ejecución de una aplicación en Azure App Service directamente desde un paquete ZIP
Nota:
No se admite la ejecución desde el paquete para las aplicaciones de Python. Al implementar un archivo ZIP del código Python, debe establecer una marca para habilitar la automatización de compilación de Azure. La automatización de compilación creará el entorno virtual de Python para la aplicación e instalará los requisitos y paquetes necesarios. Consulte automatización de compilación para obtener más información.
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 deploy --resource-group <group-name> --name <app-name> --src-path <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.
Nota:
Actualmente, no se puede migrar un recurso de App Service existente que ejecuta un paquete local para que se ejecute desde un paquete remoto. Tendrá que crear un nuevo recurso de App Service configurado para ejecutarse desde una dirección URL externa.
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
Puede configurar Azure Blob Storage para autorizar solicitudes con Microsoft Entra ID. Esta configuración significa que, en lugar de generar una clave SAS con una expiración, puede confiar en la identidad administrada de la aplicación. De manera predeterminada, se usa la identidad asignada por el sistema a 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. La configuración también puede aceptar SystemAssigned
como un valor, que es equivalente a omitir la configuración.
Para habilitar la captura del paquete mediante la identidad:
Asegúrese de que el blob esté configurado para acceso privado.
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.
Establezca la configuración de la aplicación
WEBSITE_RUN_FROM_PACKAGE
en la dirección URL del blob del paquete. Esta dirección URL suele ser del formatohttps://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package}
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).