Creación e implementación de una aplicación web de Django en Azure con una identidad administrada asignada por el usuario
En este tutorial, implementará una aplicación web de Django en App de Azure Service. La aplicación web usa una identidad administrada asignada por el usuario (conexiones sin contraseña) con el control de acceso basado en rol de Azure para acceder a los recursos de Azure Storage y Azure Database for PostgreSQL: servidor flexible. El código usa la clase DefaultAzureCredential de la biblioteca cliente de Azure Identity para Python. La DefaultAzureCredential
clase detecta automáticamente que existe una identidad administrada para App Service y la usa para acceder a otros recursos de Azure.
En este tutorial, creará una identidad administrada asignada por el usuario y la asignará a App Service para que pueda acceder a los recursos de la cuenta de almacenamiento y la base de datos. Para ver un ejemplo del uso de una identidad administrada asignada por el sistema, consulte Creación e implementación de una aplicación web de Python de Flask en Azure con identidad administrada asignada por el sistema. Se recomiendan identidades administradas asignadas por el usuario porque pueden usar varios recursos y sus ciclos de vida se desacoplan de los ciclos de vida de los recursos con los que están asociados. Para más información sobre los procedimientos recomendadosjfor usar identidades administradas, consulte Recomendaciones de procedimientos recomendados de identidad administrada.
En este tutorial se muestra cómo implementar la aplicación web de Python y crear recursos de Azure mediante la CLI de Azure. Los comandos de este tutorial se escriben para ejecutarse en un shell de Bash. Puede ejecutar los comandos del tutorial en cualquier entorno de Bash con la CLI instalada, como el entorno local o Azure Cloud Shell. Con alguna modificación (por ejemplo, establecer y usar variables de entorno), puede ejecutar estos comandos en otros entornos, como el shell de comandos de Windows.
Obtención de la aplicación de ejemplo
Use la aplicación de ejemplo de Django para seguir este tutorial. Descargue o clone la aplicación de ejemplo en el entorno de desarrollo.
Clone el ejemplo.
git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
Vaya a la carpeta de la aplicación.
cd msdocs-django-web-app-managed-identity
Creación de un servidor flexible de Azure PostgreSQL
Configure las variables de entorno necesarias para el tutorial.
LOCATION="eastus" RAND_ID=$RANDOM RESOURCE_GROUP_NAME="msdocs-mi-web-app" APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID" DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID" ADMIN_USER="demoadmin" ADMIN_PW="ChAnG33#ThsPssWD$RAND_ID" UA_NAME="UAManagedIdentityPythonTest$RAND_ID"
Importante
El
ADMIN_PW
debe contener de 8 a 128 caracteres de tres de las siguientes categorías: letras mayúsculas en inglés, letras minúsculas en inglés, números y caracteres nonfanúmeros. Al crear nombres de usuario o contraseñas, no use el carácter$
. Más adelante creará variables de entorno con estos valores, donde el carácter$
tiene un significado especial dentro del contenedor de Linux que se usa para ejecutar aplicaciones de Python.Para crear un grupo de recursos, use el comando az group create.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
Cree un servidor flexible de PostgreSQL con el comando az postgres flexible-server create . (Este y los comandos posteriores usan el carácter de continuación de línea para Shell de Bash ('\'). Cambie el carácter de continuación de línea para otros shells).
az postgres flexible-server create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_SERVER_NAME \ --location $LOCATION \ --admin-user $ADMIN_USER \ --admin-password $ADMIN_PW \ --sku-name Standard_D2ds_v4 \ --active-directory-auth Enabled \ --public-access 0.0.0.0
SKU-name es el nombre del plan de tarifa y la configuración de proceso. Para más información, consulte los precios de Azure Database for PostgreSQL. Para enumerar las SKU disponibles, use
az postgres flexible-server list-skus --location $LOCATION
.Agregue su cuenta de Azure como administrador de Microsoft Entra para el servidor con el comando az postgres flexible-server ad-admin create .
ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv) ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv) echo $ACCOUNT_EMAIL, $ACCOUNT_ID az postgres flexible-server ad-admin create \ --resource-group $RESOURCE_GROUP_NAME \ --server-name $DB_SERVER_NAME \ --display-name $ACCOUNT_EMAIL \ --object-id $ACCOUNT_ID \ --type User
Configure una regla de firewall en el servidor con el comando az postgres flexible-server firewall-rule create . Esta regla permite que el entorno local acceda al servidor. (Si usa Azure Cloud Shell, puede omitir este paso).
IP_ADDRESS=<your IP> az postgres flexible-server firewall-rule create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_SERVER_NAME \ --rule-name AllowMyIP \ --start-ip-address $IP_ADDRESS \ --end-ip-address $IP_ADDRESS
Use cualquier herramienta o sitio web que muestre su dirección IP para sustituir
<your IP>
en el comando. Por ejemplo, puede usar el sitio web ¿Qué es mi dirección IP?Cree una base de datos denominada
restaurant
con el comando az postgres flexible-server execute .az postgres flexible-server execute \ --name $DB_SERVER_NAME \ --admin-user $ADMIN_USER \ --admin-password $ADMIN_PW \ --database-name postgres \ --querytext 'create database restaurant;'
Creación de un servicio App de Azure e implementación del código
Ejecute estos comandos en la carpeta raíz de la aplicación de ejemplo para crear una instancia de App Service e implementar el código en ella.
Cree un servicio de aplicaciones mediante el comando az webapp up .
az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --location $LOCATION \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.9 \ --sku B1
La SKU define el tamaño (CPU, memoria) y el costo del plan de App Service. El plan de servicio B1 (Básico) conlleva un pequeño costo en la suscripción de Azure. Para obtener una lista completa de los planes de App Service, vea la página Precios de App Service.
Configure App Service para usar el start.sh en el repositorio de ejemplo con el comando az webapp config set .
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --startup-file "start.sh"
Creación de una cuenta de almacenamiento y un contenedor
La aplicación de ejemplo almacena las fotos enviadas por los revisores como blobs en Azure Storage.
Cuando un usuario envía una foto con su revisión, la aplicación de ejemplo escribe la imagen en el contenedor mediante la identidad administrada y
DefaultAzureCredential
para acceder a la cuenta de almacenamiento.Cuando un usuario ve las opiniones de un restaurante, la aplicación devuelve un vínculo a la foto en Blob Storage para cada revisión que tenga una asociada. Para que el explorador muestre la foto, debe poder acceder a ella en su cuenta de almacenamiento. Los datos del blob deben estar disponibles para leerse públicamente a través del acceso anónimo (sin autenticar).
En esta sección, creará una cuenta de almacenamiento y un contenedor que permita el acceso de lectura público a los blobs del contenedor. En secciones posteriores, creará una identidad administrada asignada por el usuario y la configurará para escribir blobs en la cuenta de almacenamiento.
Use el comando az storage create para crear una cuenta de almacenamiento.
STORAGE_ACCOUNT_NAME="msdocsstorage$RAND_ID" az storage account create \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --location $LOCATION \ --sku Standard_LRS \ --allow-blob-public-access true
Cree un contenedor denominado photos en la cuenta de almacenamiento con el comando az storage container create .
az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --auth-mode login
Nota:
Si se produce un error en el comando, por ejemplo, si recibe un error que indica que las reglas de red de la cuenta de almacenamiento pueden bloquear la solicitud, escriba el comando siguiente para asegurarse de que a su cuenta de usuario de Azure se le asigna un rol de Azure con permiso para crear un contenedor.
az role assignment create --role "Storage Blob Data Contributor" --assignee $ACCOUNT_EMAIL --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
Para más información, consulte Inicio rápido: Creación, descarga y enumeración de blobs con la CLI de Azure. Tenga en cuenta que varios roles de Azure permiten crear contenedores en una cuenta de almacenamiento, como "Propietario", "Colaborador", "Propietario de datos de Blob de Storage" y "Colaborador de datos de Blob storage".
Crear una identidad administrada asignada por el usuario
Cree una identidad administrada asignada por el usuario y asígnela a App Service. La identidad administrada se usa para acceder a la base de datos y la cuenta de almacenamiento.
Use el comando az identity create para crear una identidad administrada asignada por el usuario y generar el identificador de cliente en una variable para su uso posterior.
UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv) echo $UA_CLIENT_ID
Use el comando az account show para obtener el identificador de suscripción y generarlo en una variable que se puede usar para construir el identificador de recurso de la identidad administrada.
SUBSCRIPTION_ID=$(az account show --query id --output tsv) RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME" echo $RESOURCE_ID
Asigne la identidad administrada a App Service con el comando az webapp identity assign .
export MSYS_NO_PATHCONV=1 az webapp identity assign \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --identities $RESOURCE_ID
Cree la configuración de la aplicación de App Service que contenga el identificador de cliente de la identidad administrada y otra información de configuración con el comando az webapp config appsettings set .
az webapp config appsettings set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \ STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \ STORAGE_CONTAINER_NAME=photos \ DBHOST=$DB_SERVER_NAME \ DBNAME=restaurant \ DBUSER=$UA_NAME
La aplicación de ejemplo usa variables de entorno (configuración de la aplicación) para definir información de conexión para la base de datos y la cuenta de almacenamiento, pero estas variables no incluyen contraseñas. En su lugar, la autenticación se realiza sin contraseña con DefaultAzureCredential
.
El código de aplicación de ejemplo usa el DefaultAzureCredential
constructor de clase sin pasar el identificador de cliente de identidad administrada asignada por el usuario al constructor. En este escenario, la reserva consiste en comprobar la variable de entorno AZURE_CLIENT_ID, que se establece como una configuración de aplicación.
Si la variable de entorno AZURE_CLIENT_ID no existe, se usará la identidad administrada asignada por el sistema si está configurada. Para obtener más información, consulte Introducción a DefaultAzureCredential.
Creación de roles para la identidad administrada
En esta sección, creará asignaciones de roles para la identidad administrada para habilitar el acceso a la cuenta de almacenamiento y la base de datos.
Cree una asignación de roles para la identidad administrada para habilitar el acceso a la cuenta de almacenamiento con el comando az role assignment create .
export MSYS_NO_PATHCONV=1 az role assignment create \ --assignee $UA_CLIENT_ID \ --role "Storage Blob Data Contributor" \ --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME"
El comando especifica el ámbito de la asignación de roles al grupo de recursos. Para obtener más información, consulte Descripción de las asignaciones de roles.
Use el comando az postgres flexible-server execute para conectarse a la base de datos de Postgres y ejecutar los mismos comandos para asignar roles a la identidad administrada.
ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) az postgres flexible-server execute \ --name $DB_SERVER_NAME \ --admin-user $ACCOUNT_EMAIL \ --admin-password $ACCOUNT_EMAIL_TOKEN \ --database-name postgres \ --querytext "select * from pgaadauth_create_principal('"$UA_NAME"', false, false);select * from pgaadauth_list_principals(false);"
Si tiene problemas para ejecutar el comando, asegúrese de agregar la cuenta de usuario como administrador de Microsoft Entra para el servidor PosgreSQL y de que ha permitido el acceso a la dirección IP en las reglas de firewall. Para más información, consulte la sección Creación de un servidor flexible de Azure PostgreSQL.
Prueba de la aplicación web de Python en Azure
La aplicación de Python de ejemplo usa el paquete azure.identity y su DefaultAzureCredential
clase. Cuando la aplicación se ejecuta en Azure, DefaultAzureCredential
detecta automáticamente si existe una identidad administrada para App Service y, si es así, la usa para acceder a otros recursos de Azure (almacenamiento y PostgreSQL en este caso). No es necesario proporcionar claves de almacenamiento, certificados ni credenciales a App Service para acceder a estos recursos.
Vaya a la aplicación implementada en la dirección URL
http://$APP_SERVICE_NAME.azurewebsites.net
.La aplicación puede tardar un minuto o dos en iniciarse. Si ve una página de aplicación predeterminada que no es la página de aplicación de ejemplo predeterminada, espere un minuto y actualice el explorador.
Pruebe la funcionalidad de la aplicación de ejemplo agregando un restaurante y algunas opiniones con fotos para el restaurante.
El restaurante y la información de revisión se almacenan en Azure Database for PostgreSQL y las fotos se almacenan en Azure Storage. Esta es una captura de pantalla de ejemplo:
Limpiar
En este tutorial, todos los recursos de Azure se crearon en el mismo grupo de recursos. Quitar el grupo de recursos quita con el comando az group delete quita todos los recursos del grupo de recursos y es la manera más rápida de quitar todos los recursos de Azure usados para la aplicación.
az group delete --name $RESOURCE_GROUP_NAME
Opcionalmente, puede agregar el argumento --no-wait
para permitir que el comando devuelva antes de que se complete la operación.
Pasos siguientes
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente las Cuestiones de GitHub como mecanismo de retroalimentación para el contenido y lo sustituiremos por un nuevo sistema de retroalimentación. Para más información, consulta:Enviar y ver comentarios de