Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En esta parte de la serie de tutoriales, aprenderá a implementar una aplicación web de Python en contenedor en Azure App Service Web App for Containers. Este servicio totalmente administrado le permite ejecutar aplicaciones en contenedores sin tener que mantener su propio orquestador de contenedores.
App Service simplifica la implementación mediante canalizaciones de integración continua e implementación continua (CI/CD) que funcionan con Docker Hub, Azure Container Registry, Azure Key Vault y otras herramientas de DevOps. Este tutorial es la parte 4 de una serie de tutoriales de 5 partes.
Al final de este artículo, tiene una aplicación web de App Service segura y lista para producción que se ejecuta desde una imagen de contenedor de Docker. La aplicación usa una identidad administrada asignada por el sistema para extraer la imagen de Azure Container Registry y recuperar secretos de Azure Key Vault.
En este diagrama de servicio se resaltan los componentes descritos en este artículo.
Los comandos de la CLI de Azure se pueden ejecutar en Azure Cloud Shell o en una máquina local con la CLI de Azure instalada.
Importante
Se recomienda usar Azure Cloud Shell para todos los pasos basados en la CLI de este tutorial porque:
- Viene autenticado previamente con su cuenta de Azure, evitando problemas de inicio de sesión.
- Incluye todas las extensiones de la CLI de Azure necesarias de forma predeterminada.
- Garantiza un comportamiento coherente independientemente del sistema operativo local o del entorno.
- No requiere ninguna instalación local, ideal para los usuarios sin derechos de administrador
- Proporciona acceso directo a los servicios de Azure desde el portal: no se requiere ninguna configuración local de Docker o de red.
- Evita problemas de configuración de red o firewall local
Creación de Key Vault con autorización de RBAC
Azure Key Vault es un servicio seguro para almacenar secretos, claves de API, cadenas de conexión y certificados. En este script, este almacena la cadena de conexión de MongoDB y la SECRET_KEY
aplicación web.
Key Vault está configurado para usar el control de acceso basado en rol (RBAC) para administrar el acceso a través de roles de Azure en lugar de directivas de acceso tradicionales. La aplicación web usa su identidad administrada asignada por el sistema para recuperar secretos de forma segura en tiempo de ejecución.
Nota
La creación temprana de Key Vault garantiza que los roles se puedan asignar antes de cualquier intento de acceder a los secretos. También ayuda a evitar retrasos de propagación en las asignaciones de funciones. Dado que Key Vault no depende de App Service, aprovisionarlo temprano mejora la confiabilidad y la secuenciación.
En este paso, usará el comando az keyvault create para crear una instancia de Azure Key Vault con RBAC habilitado.
#!/bin/bash RESOURCE_GROUP_NAME="msdocs-web-app-rg" LOCATION="westus" KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv" az keyvault create \ --name "$KEYVAULT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --___location "$LOCATION" \ --enable-rbac-authorization true
Creación del plan de App Service y la aplicación web
El plan de App Service define los recursos de proceso, el plan de tarifa y la región de la aplicación web. La aplicación web ejecuta la aplicación en contenedor y se aprovisiona con una identidad administrada asignada por el sistema que se usa para autenticarse de forma segura en Azure Container Registry (ACR) y Azure Key Vault.
En este paso, realizará las siguientes tareas:
- Crear un plan de App Service
- Creación de la aplicación web con su identidad administrada
- Configuración de la aplicación web para implementar mediante una imagen de contenedor específica
- Preparación para la implementación continua a través de ACR
Nota
La aplicación web debe crearse antes de asignar acceso a ACR o Key Vault porque la identidad administrada solo se crea en el momento de la implementación. Además, asignar la imagen de contenedor durante la creación garantiza que la aplicación se inicie correctamente con la configuración prevista.
En este paso, usará el comando az appservice plan create para aprovisionar el entorno de proceso para la aplicación.
#!/bin/bash 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
En este paso, usará el comando az webapp create para crear la aplicación web. Este comando también habilita una identidad administrada asignada por el sistema y establece la imagen de contenedor que ejecuta la aplicación.
#!/bin/bash APP_SERVICE_NAME="msdocs-website-name" #APP_SERVICE_NAME must be globally unique as it becomes the website name in the URL `https://<website-name>.azurewebsites.net`. # Use the same registry name as in part 2 of this tutorial series. REGISTRY_NAME="msdocscontainerregistryname" #REGISTRY_NAME is the registry name you used in part 2 of this tutorial. CONTAINER_NAME="$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest" #CONTAINER_NAME is of the form "yourregistryname.azurecr.io/repo_name:tag". az webapp create \ --resource-group "$RESOURCE_GROUP_NAME" \ --plan "$APP_SERVICE_PLAN_NAME" \ --name "$APP_SERVICE_NAME" \ --assign-identity '[system]' \ --deployment-container-image-name "$CONTAINER_NAME"
Nota
Al ejecutar este comando, es posible que vea el siguiente error:
No credential was provided to access Azure Container Registry. Trying to look up... Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n msdocscontainerregistryname --admin-enabled true' to enable admin first.'
Este error se produce porque la aplicación web intenta usar credenciales de administrador para acceder a ACR, que las credenciales están deshabilitadas de forma predeterminada. Es seguro omitir este mensaje: el siguiente paso configura la aplicación web para usar su identidad administrada para autenticarse con ACR.
Concesión del rol del oficial de secretos al usuario que ha iniciado sesión
Para almacenar secretos en Azure Key Vault, el usuario que ejecuta el script debe tener el rol De oficial de secretos de Key Vault . Este rol permite crear y administrar datos confidenciales dentro de la bóveda.
En este paso, el script asigna ese rol al usuario que ha iniciado sesión actualmente. A continuación, este usuario puede almacenar de forma segura secretos de aplicación, como la cadena de conexión de MongoDB y la aplicación SECRET_KEY
.
Esta asignación de roles es la primera de dos asignaciones de roles relacionadas con Key Vault. Más adelante, a la identidad administrada asignada por el sistema de la aplicación web se le concede acceso para recuperar secretos del almacén.
El uso de Azure RBAC garantiza un acceso seguro y auditable basado en la identidad, lo que elimina la necesidad de credenciales codificadas de forma rígida.
Nota
El usuario debe tener asignado el rol de Key Vault Secrets Officerantes de intentar almacenar secretos en el Key Vault. Esta asignación se realiza mediante el comando az role assignment create en el ámbito del Key Vault.
En este paso, usará el comando az role assignment create para asignar el rol en el ámbito de Key Vault.
#!/bin/bash CALLER_ID=$(az ad signed-in-user show --query id -o tsv) echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully. az role assignment create \ --role "Key Vault Secrets Officer" \ --assignee "$CALLER_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Concesión de acceso web a ACR mediante identidad administrada
Para extraer imágenes de Azure Container Registry (ACR) de forma segura, la aplicación web debe configurarse para usar su identidad administrada asignada por el sistema. El uso de identidad administrada evita la necesidad de credenciales de administrador y admite la implementación segura sin credenciales.
Este proceso implica dos acciones clave:
- Habilitación de la aplicación web para usar su identidad administrada al acceder a ACR
- Asignación del rol AcrPull a esa identidad en el ACR de destino
En este paso, recuperará el ID principal (identificador de objeto único) de la identidad administrada de la aplicación web mediante el comando az webapp identity show. A continuación, habilitará el uso de la identidad administrada para la autenticación de ACR estableciendo la propiedad en
acrUseManagedIdentityCreds
mediantetrue
. A continuación, asigne el rol AcrPull a la identidad administrada de la aplicación web mediante el comando az role assignment create . Este rol concede permiso a la aplicación web para extraer imágenes del registro.#!/bin/bash PRINCIPAL_ID=$(az webapp identity show \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --query principalId \ -o tsv) echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`. az webapp config set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --generic-configurations '{"acrUseManagedIdentityCreds": true}' az role assignment create \ --role "AcrPull" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME"
Conceder acceso a la bóveda de claves a la identidad administrada de la aplicación web
La aplicación web necesita permiso para acceder a secretos como la cadena de conexión de MongoDB y SECRET_KEY
. Para conceder estos permisos, debe asignar el rol Usuario de secretos de Key Vault a la identidad administrada asignada por el sistema de la aplicación web.
En este paso, usará el ID principal de la identidad administrada asignada automáticamente por el sistema en la aplicación web para concederle acceso al Key Vault con el rol Usuario de secretos de Key Vault, mediante el comando az role assignment create.
#!/bin/bash az role assignment create \ --role "Key Vault Secrets User" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Almacenamiento de secretos en Key Vault
Para evitar la codificación de secretos en la aplicación, este paso almacena la cadena de conexión de MongoDB y la clave secreta de la aplicación web en Azure Key Vault. A continuación, la aplicación web puede acceder a estos secretos de forma segura a través de su identidad administrada, sin necesidad de almacenar credenciales en el código o la configuración.
Nota
Aunque en este tutorial solo se almacena la cadena de conexión y la clave secreta en el almacén de claves, también puede almacenar otras opciones de configuración de la aplicación, como el nombre de la base de datos de MongoDB o el nombre de la colección en Key Vault.
En este paso, usará el comando az cosmosdb keys list para recuperar la cadena de conexión de MongoDB. A continuación, use el comando az keyvault secret set para almacenar la cadena de conexión y una clave secreta generada aleatoriamente en Key Vault.
#!/bin/bash ACCOUNT_NAME="msdocs-cosmos-db-account-name" MONGO_CONNECTION_STRING=$(az cosmosdb keys list \ --name "$ACCOUNT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --type connection-strings \ --query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" -o tsv) SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9') # This key is cryptographically secure, using OpenSSL’s strong random number generator. az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoConnectionString" \ --value "$MONGO_CONNECTION_STRING" az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoSecretKey" \ --value "$SECRET_KEY"
Configuración de la aplicación web para usar secretos de Kay Vault
Para acceder a secretos de forma segura en tiempo de ejecución, la aplicación web debe configurarse para hacer referencia a los secretos almacenados en Azure Key Vault. Este paso se realiza mediante referencias de Key Vault, que insertan los valores secretos en el entorno de la aplicación a través de su identidad administrada asignada por el sistema.
Este enfoque evita la codificación rígida de secretos y permite a la aplicación recuperar de forma segura valores confidenciales, como la cadena de conexión de MongoDB y la clave secreta durante la ejecución.
En este paso, usará el comando az webapp config appsettings set para agregar configuraciones de la aplicación que hacen referencia a los secretos del Key Vault. En concreto, establece las configuraciones de la
MongoConnectionString
yMongoSecretKey
aplicación para hacer referencia a los secretos correspondientes almacenados en Key Vault.#!/bin/bash MONGODB_NAME="restaurants_reviews" MONGODB_COLLECTION_NAME="restaurants_reviews" az webapp config appsettings set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --settings \ CONNECTION_STRING="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)" \ SECRET_KEY="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)" \ DB_NAME="$MONGODB_NAME" \ COLLECTION_NAME="$MONGODB_COLLECTION_NAME"
Habilitación de la implementación continua desde ACR
La habilitación de la implementación continua permite que la aplicación web extraiga y ejecute automáticamente la imagen de contenedor más reciente siempre que se inserte en Azure Container Registry (ACR). Esto reduce los pasos de implementación manuales y ayuda a garantizar que la aplicación permanezca actualizada.
Nota
En el siguiente paso, registrarás un webhook en Azure Container Registry (ACR) para notificar a la aplicación web cuando se suba una nueva imagen.
En este paso, usará el comando az webapp deployment container config para habilitar la implementación continua desde ACR a la aplicación web.
#!/bin/bash az webapp deployment container config \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --enable-cd true
Registra un webhook de ACR para la implementación continua
Para automatizar las implementaciones, registre un webhook en Azure Container Registry (ACR) que notifique la aplicación web cada vez que se inserte una nueva imagen de contenedor. El webhook permite que la aplicación extraiga y ejecute automáticamente la versión más reciente.
El webhook configurado en Azure Container Registry (ACR) envía una solicitud POST al punto de conexión SCM (SERVICE_URI) de la aplicación web cada vez que se inserta una nueva imagen en el repositorio msdocspythoncontainerwebapp. Esta acción desencadena la aplicación web para extraer e implementar la imagen actualizada, completando la canalización de implementación continua entre ACR y Azure App Service.
Nota
El URI del webhook debe seguir este formato:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook
Debe terminar con /api/registry/webhook
. Si recibe un error de URI, confirme que la ruta de acceso es correcta.
En este paso, use el comando az acr webhook create para registrar el webhook y configurarlo para que se desencadene en
push
eventos.#!/bin/bash CREDENTIAL=$(az webapp deployment list-publishing-credentials \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --query publishingPassword --output tsv) # Web app publishing credentials may not be available immediately. In production, poll until non-empty. 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
Navegar por el sitio
Para comprobar que la aplicación web se está ejecutando, abra https://<website-name>.azurewebsites.net
y reemplace <website-name>
con el nombre de su Servicio de Aplicación. Deberías ver la aplicación de ejemplo de reseñas de restaurantes. Puede tardar unos instantes en cargarse la primera vez.
Una vez que aparezca el sitio, intente agregar un restaurante y envíe una revisión para confirmar que la aplicación funciona correctamente.
Nota
El comando az webapp browse
no se admite en Cloud Shell. Si usa Cloud Shell, abra manualmente un explorador y vaya a la dirección URL del sitio.
Si usa la CLI de Azure localmente, puede usar el comando az webapp browse para abrir el sitio en el explorador predeterminado:
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 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, 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 Azure Cosmos DB para 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". Si no es así, agréguelo.
- Los diferentes SKU de Azure Container Registry tienen diferentes características, incluyendo el número de webhooks. Si reutiliza un registro existente, podría ver el mensaje "Cuota superada para webhooks de tipo de recurso para la SKU Básica del registro. 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.