Share via


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.

  1. Clone el ejemplo.

    git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
    
  2. Vaya a la carpeta de la aplicación.

    cd msdocs-django-web-app-managed-identity
    

Creación de un servidor flexible de Azure PostgreSQL

  1. 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.

  2. Para crear un grupo de recursos, use el comando az group create.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. 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.

  4. 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
    
  5. 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?

  6. 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.

  1. 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.

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

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

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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.

  1. 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.

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

  1. 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.

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

    Captura de pantalla de la aplicación de ejemplo que muestra la funcionalidad de revisión de restaurantes mediante App de Azure Service, Azure PostgreSQL Database y Azure Storage.

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