Compartir a través de


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 App de Azure 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 contenedores en App Service mediante App Service Web App for Containers. Web App for Containers permite centrarse en la composición de los contenedores sin tener que preocuparse de administrar y mantener un orquestador de contenedores subyacente.

Siguiendo estos pasos, terminará con un sitio web de App Service mediante una imagen de contenedor de Docker. App Service extrae la imagen inicial de Azure Container Registry mediante la identidad administrada para la autenticación.

En el diagrama de servicio que se muestra a continuación se resaltan los componentes descritos en este artículo.

A screenshot of the services using in the Tutorial - Containerized Python App on Azure with deployment path highlighted.

1. Creación de la aplicación web

Los comandos de la CLI de Azure se pueden ejecutar en Azure Cloud Shell o en una estación de trabajo que tenga la CLI de Azure instalada.

Paso 1. Obtenga el identificador 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

En el comando anterior, RESOURCE_GROUP_NAME debe establecerse en el entorno en el nombre del grupo de recursos que usó en la parte 3. Cree un contenedor en Azure de este tutorial. Si no es así, quite la marca de comentario de la primera línea y asegúrese de que se establece en el nombre que usó.

Paso 2. 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

Paso 3. Cree una aplicación web con el comando az webapp create .

El siguiente comando también habilita la identidad administrada asignada por el sistema para la aplicación web y la asigna al AcrPull rol en el recurso especificado; en este caso, el grupo de recursos que contiene Azure Container Registry. Esto concede a la identidad administrada asignada por el sistema privilegios de extracción en cualquier instancia de 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 

En el comando anterior:

  • 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 es de la forma "yourregistryname.azurecr.io/repo_name:tag".
  • REGISTRY_NAME todavía debe establecerse en el entorno en el nombre del Registro que usó en la parte 3. Cree un contenedor en Azure de este tutorial. Si no es así, quite la marca de comentario de la línea donde está establecida anteriormente y asegúrese de que está establecida en el nombre que usó.

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.

2. Configuración de la identidad administrada y el webhook

Paso 1. Configure la aplicación web para usar identidades administradas para extraer de 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.

Paso 2. 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 

Paso 3. Use 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 --resource-group parámetros y --location para invalidar este comportamiento.

3. 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 para MongoDB, se recomienda seguir los pasos para configurar Cosmos DB para MangoDB en la parte 2. Compile y pruebe el contenedor localmente de este tutorial. Cuando haya terminado, debe tener una instancia de Azure Cosmos DB para MongoDB cadena de conexión del formulario mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>.

Necesitará la información 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: un cadena de conexión que comienza por "mongodb://".
  • DB_NAME: use "restaurants_reviews".
  • COLLECTION_NAME: use "restaurants_reviews".

4. Examinar el sitio

Para comprobar que el sitio se está ejecutando, vaya a https://<website-name>.azurewebsites.net; donde el nombre del sitio web es el nombre del servicio de aplicaciones. Si se ejecuta correctamente, debería ver la aplicación de ejemplo de revisión del restaurante. 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 ejecuta la CLI de Azure localmente, puede usar el comando az webapp browse para ir 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 az webapp browse comando no se admite en Cloud Shell. Abra una ventana del explorador y vaya a la dirección URL del sitio web en su lugar.

5. 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 Registros del Centro / de implementación en Azure Portal. 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, estos errores se mostrarán en los registros de la aplicación. En la página de Azure Portal de 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 de Azure Portal de App Service, vaya al recurso del Centro de implementación de App Service 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".
  • Las distintas sku de Azure Container Registry tienen características diferentes, incluido el número de webhooks. Si va a reutilizar un registro existente, puede 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, use un nuevo registro o reduzca el número de webhooks del Registro en uso.

Paso siguiente