Implementación de una aplicación de Python en contenedor en App Service
Este artículo forma parte de un tutorial sobre cómo incluir e implementar una aplicación web de Python en Azure App Service. App Service le permite ejecutar aplicaciones web en contenedor e implementarlas mediante funcionalidades de integración continua e implementación continua (CI/CD) con Docker Hub, Azure Container Registry y Visual Studio Team Services.
En esta parte del tutorial, aprenderá a implementar la aplicación web de Python en contenedor en App Service mediante la App Service Web App for Containers. Web App for Containers le permite centrarse en configurar sus contenedores sin preocuparse por administrar y mantener un orquestador de contenedores subyacente.
Después de seguir los pasos de este artículo, terminas con un sitio web App Service usando una imagen de contenedor Docker. App Service extrae la imagen inicial de Azure Container Registry mediante la identidad administrada para la autenticación.
En este diagrama de servicio se resaltan los componentes descritos en este artículo.
Creación de la aplicación web
Se pueden ejecutar los comandos de la CLI de Azure en Azure Cloud Shell o en una estación de trabajo con la CLI de Azure instalada .
Obtenga el ID de recurso del grupo que contiene Azure Container Registry con el comando az group show.
# RESOURCE_GROUP_NAME='msdocs-web-app-rg' RESOURCE_ID=$(az group show \ --resource-group $RESOURCE_GROUP_NAME \ --query id \ --output tsv) echo $RESOURCE_ID
RESOURCE_GROUP_NAME debe seguir estando configurado en su entorno con el nombre del grupo de recursos que usó en la parte 3. Construir un contenedor en Azure de este tutorial. Si no es así, retire el comentario de la primera línea y establezca el nombre que utilizó.
Cree un plan de App Service con el comando az appservice plan create.
APP_SERVICE_PLAN_NAME='msdocs-web-app-plan' az appservice plan create \ --name $APP_SERVICE_PLAN_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --sku B1 \ --is-linux
Cree una aplicación web usando el comando az webapp create.
El siguiente comando también habilita la identidad administrada asignada por el sistema para la aplicación web y le asigna el rol
AcrPull
en el recurso especificado--en este caso, el grupo de recursos que contiene el Azure Container Registry. Esto concede a la identidad administrada asignada por el sistema privilegios de extracción en cualquier Azure Container Registry del grupo de recursos.APP_SERVICE_NAME='<website-name>' # REGISTRY_NAME='<your Azure Container Registry name>' CONTAINER_NAME=$REGISTRY_NAME'.azurecr.io/msdocspythoncontainerwebapp:latest' az webapp create \ --resource-group $RESOURCE_GROUP_NAME \ --plan $APP_SERVICE_PLAN_NAME \ --name $APP_SERVICE_NAME \ --assign-identity '[system]' \ --scope $RESOURCE_ID \ --role acrpull \ --deployment-container-image-name $CONTAINER_NAME
Dónde:
- APP_SERVICE_NAME debe ser único globalmente, ya que se convierte en el nombre del sitio web en la dirección URL
https://<website-name>.azurewebsites.net
. - CONTAINER_NAME tiene la forma "yourregistryname.azurecr.io/repo_name:tag".
- REGISTRY_NAME aún debe establecerse en su entorno con el nombre de registro que utilizó en la parte 3. Compilar el contenedor en Azure de este tutorial. Si no es así, retire el comentario la línea donde se establece en el fragmento de código y establézcalo con el nombre que utilizó.
Nota
Es posible que vea un error similar al siguiente al ejecutar el comando:
No credential was provided to access Azure Container Registry. Trying to look up... Retrieving credentials failed with an exception:'No resource or more than one were found with name ...'
Este error se produce porque la aplicación web usa de forma predeterminada las credenciales de administrador de Azure Container Registry para autenticarse con el registro y las credenciales de administrador no se han habilitado en el registro. Puede omitir este error de forma segura porque establecerá la aplicación web para que use la identidad administrada asignada por el sistema para la autenticación en el siguiente comando.
- APP_SERVICE_NAME debe ser único globalmente, ya que se convierte en el nombre del sitio web en la dirección URL
Configuración de la identidad administrada y el webhook
Configure la aplicación web para utilizar identidades administradas para extraerlas del Azure Container Registry con el comando az webapp config set.
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --generic-configurations '{"acrUseManagedIdentityCreds": true}'
Dado que ha habilitado la identidad administrada asignada por el sistema al crear la aplicación web, será la identidad administrada que se usa para extraer de Azure Container Registry.
Obtenga la credencial de ámbito de aplicación con el comando az webapp deployment list-publishing-credentials.
CREDENTIAL=$(az webapp deployment list-publishing-credentials \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --query publishingPassword \ --output tsv) echo $CREDENTIAL
Utilice la credencial de ámbito de aplicación para crear un webhook con el comando az acr webhook create.
SERVICE_URI='https://$'$APP_SERVICE_NAME':'$CREDENTIAL'@'$APP_SERVICE_NAME'.scm.azurewebsites.net/api/registry/webhook' az acr webhook create \ --name webhookforwebapp \ --registry $REGISTRY_NAME \ --scope msdocspythoncontainerwebapp:* \ --uri $SERVICE_URI \ --actions push
De forma predeterminada, este comando crea el webhook en el mismo grupo de recursos y ubicación que el registro de contenedor de Azure especificado. Si lo desea, puede usar los parámetros
--resource-group
y--location
para invalidar este comportamiento.
Configuración de la conexión a MongoDB
En este paso, especificará las variables de entorno necesarias para conectarse a MongoDB.
Si necesita crear una instancia de Azure Cosmos DB for MongoDB, se recomienda seguir los pasos para configurar Cosmos DB for MangoDB en la parte 2. Compile y pruebe el contenedor localmente de este tutorial. Cuando haya terminado, debe tener una cadena de conexión de Azure Cosmos DB for MongoDB de la forma mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>
.
Necesita la cadena de conexión de MongoDB para seguir los pasos que se indican a continuación.
Para establecer variables de entorno en App Service, cree valores de aplicación mediante el comando az webapp config appsettings set siguiente.
MONGO_CONNECTION_STRING='your Mongo DB connection string in single quotes'
MONGO_DB_NAME=restaurants_reviews
MONGO_COLLECTION_NAME=restaurants_reviews
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP_NAME \
--name $APP_SERVICE_NAME \
--settings CONNECTION_STRING=$MONGO_CONNECTION_STRING \
DB_NAME=$MONGO_DB_NAME \
COLLECTION_NAME=$MONGO_COLLECTION_NAME
- CONNECTION_STRING: una cadena de conexión que comienza por "mongodb://".
- DB_NAME: Use "restaurants_reviews".
- COLLECTION_NAME: Use "restaurants_reviews".
Navegar por el sitio
Para verificar que el sitio se está ejecutando, vaya a https://<website-name>.azurewebsites.net
; donde nombre del sitio web es el nombre de su servicio de aplicación. Si se ha ejecutado correctamente, debería ver la aplicación de ejemplo de reseñas de restaurantes. El sitio puede tardar unos instantes en iniciarse por primera vez. Cuando aparezca el sitio, agregue un restaurante y una revisión para ese restaurante para confirmar que la aplicación de ejemplo funciona.
Si está ejecutando Azure CLI localmente, puede utilizar el comando az webapp browse para navegar al sitio web. Si usa Cloud Shell, abra una ventana del explorador y vaya a la dirección URL del sitio web.
az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
Nota
El comando az webapp browse
no se admite en Cloud Shell. Abra una ventana del explorador y vaya a la dirección URL del sitio web en su lugar.
Solución de problemas de implementación
Si no ve la aplicación de ejemplo, pruebe los pasos siguientes.
- Con la implementación de contenedores y App Service, compruebe siempre la página Centro de implementación / Registros en el portal Azure. Confirme que el contenedor se ha extraído y se está ejecutando. La extracción inicial y la ejecución del contenedor pueden tardar unos instantes.
- Intente reiniciar App Service y compruebe si se resuelve el problema.
- Si hay errores de programación, esos errores se muestran en los registros de la aplicación. En la página del portal de Azure para App Service, seleccione Diagnosticar y resolver problemas/Registros de aplicaciones.
- La aplicación de ejemplo se basa en una conexión a MongoDB. Confirme que App Service tiene la configuración de la aplicación con la información de conexión correcta.
- Confirme que la identidad administrada está habilitada para App Service y se usa en el Centro de implementación. En la página del portal Azure para el App Service, vaya al recurso App Service Centro de implementación y confirme que la Autenticación está establecida en Identidad administrada.
- Compruebe que el webhook está definido en Azure Container Registry. El webhook permite que App Service extraiga la imagen del contenedor. En concreto, compruebe que el URI del servicio termina con "/api/registry/webhook".
- Los diferentes SKU de Azure Container Registry tienen diferentes características, incluyendo el número de webhooks. Si está reutilizando un registro existente, podría ver el mensaje "Cuota superada para webhooks de tipo de recurso para la SKU del registro Básico. Obtenga más información sobre las diferentes cuotas de SKU y el proceso de actualización: https://aka.ms/acr/tiers". Si ve este mensaje, utilice un nuevo registro o reduzca el número de webhooks de registro en uso.