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.
Puede ejecutar comandos CLI de Azure en el Azure Cloud Shell o en un equipo local con el CLI de Azure instalado.
Importante
Use Azure Cloud Shell para todos los pasos basados en la CLI de este tutorial porque:
- Viene autenticado previamente con la cuenta de Azure, por lo que no encuentra problemas de autenticación.
- Incluye todas las extensiones de CLI de Azure necesarias
- 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_KEYaplicación web.
Configure el Key Vault 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
Cree el Key Vault lo antes posible para asegurarse de que puede asignar roles antes de intentar acceder a los secretos. Este enfoque también ayuda a evitar retrasos de propagación en las asignaciones de roles. Dado que Key Vault no depende de App Service, aprovisionarlo con antelación mejora la fiabilidad y la secuencia.
Use el comando az keyvault create para crear un 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 usa para autenticarse de forma segura en Azure Container Registry (ACR) y Azure Key Vault.
En este paso, complete 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
Debe crear la aplicación web antes de asignar acceso a ACR o Key Vault porque la identidad administrada solo se crea en tiempo de 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.
Use el comando az appservice plan create para aprovisionar el entorno de proceso de 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-linuxUse 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, pero las credenciales de administrador están deshabilitadas de forma predeterminada. Puede ignorar este mensaje con absoluta tranquilidad. El paso siguiente configura la aplicación web para que use su identidad administrada para autenticarse con ACR.
Concesión del rol de oficial de secretos de Key Vault al usuario autenticado
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 concede permiso para crear y gestionar secretos dentro de la bóveda.
En este paso, el script asigna ese rol al usuario autenticado 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.
Mediante el uso de Azure RBAC, se garantiza el acceso seguro y auditable en función de la identidad, por lo que no es necesario usar credenciales codificadas de forma rígida.
Nota
Asigne al usuario el rol Responsable de secretos de Key Vaultantes de que intente almacenar secretos en su almacén de claves. Use el comando az role assignment create con alcance en Key Vault para crear esta asignación.
Use 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, configure la aplicación web para que use su identidad administrada asignada por el sistema. Con la identidad administrada, no necesita credenciales de administrador y puede admitir 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, recupere el identificador principal (identificador de objeto único) de la identidad administrada de la aplicación web con el comando az webapp identity show. A continuación, habilite el uso de la identidad administrada para la autenticación de ACR estableciendo la propiedad
acrUseManagedIdentityCredsentruemediante az webapp config set. 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, asigne el rol Usuario de secretos de Key Vault a la identidad administrada asignada por el sistema de la aplicación web.
En este paso, use el identificador único (identificador de entidad de seguridad) de la identidad administrada asignada por el sistema de la aplicación web para conceder a la aplicación web acceso a 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, almacene la cadena de conexión de MongoDB y la clave secreta de la aplicación web en Azure Key Vault. La aplicación web puede acceder de forma segura a estos secretos en tiempo de ejecución a través de su identidad administrada, por lo que no es necesario almacenar credenciales en código o 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.
Use el comando az cosmosdb keys list para recuperar el cadena de conexión de MongoDB. A continuación, use el comando az keyvault secret set para almacenar tanto el cadena de conexión como 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 Key Vault
Para acceder a secretos de forma segura en tiempo de ejecución, configure la aplicación web para hacer referencia a los secretos almacenados en Azure Key Vault. Use referencias de Key Vault para inyectar 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.
Use el comando az webapp config appsettings set para agregar valores de configuración de la aplicación que hagan referencia a los secretos de Key Vault. En concreto, configure los valores de configuración de la aplicación
MongoConnectionStringyMongoSecretKeypara que hagan 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
Al habilitar la implementación continua, la aplicación web extrae y ejecuta automáticamente la imagen de contenedor más reciente cada vez que se inserta una en Azure Container Registry (ACR). Esta característica reduce los pasos de implementación manuales y ayuda a garantizar que la aplicación permanezca actualizada.
Nota
En el paso siguiente, registra un webhook en ACR para notificar a la aplicación web cuando se envía una nueva imagen.
Use 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
Registro de 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. Con el webhook, la aplicación extrae y ejecuta automáticamente la versión más reciente.
El webhook que configure 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 msdocspythoncontainerwebapp repositorio. 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.
Use el comando az acr webhook create para registrar el webhook y configurarlo para que se desencadene en
pusheventos.#!/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 el CLI de Azure localmente, use 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.
- Para la implementación de contenedores y App Service, compruebe siempre la página de Centro de implementación / Registros en el portal de Azure. Confirme que el contenedor se ha descargado y está en ejecución. 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, es posible que vea el siguiente mensaje: "Se ha superado la cuota para el tipo de recurso webhooks en la SKU Basic 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.