Tutorial: Conexión de una aplicación web de Django a Azure PostgreSQL mediante Service Connector

En este tutorial, aprenderá a implementar una aplicación web de Django controlada Python por datos para Azure App Service y usar Service Connector para conectarla a otros servicios Azure. La aplicación web de muestra guarda la información de los restaurantes y las reseñas en una base de datos de Azure Database for PostgreSQL y almacena fotos en un contenedor de Azure Storage.

Usa CLI de Azure para completar las siguientes tareas:

Nota:

Este tutorial es similar al tutorial de App Service Implementar una aplicación web de Django con Python y PostgreSQL en Azure, pero usa una identidad administrada sin contraseña asignada automáticamente por el sistema con control de acceso basado en roles de Azure para acceder a otros recursos de Azure. En la sección Creación de una conexión de servicio sin contraseña de este artículo se muestra cómo Service Connector simplifica el proceso de conexión.

La aplicación web usa la clase DefaultAzureCredential de la biblioteca cliente de Python Azure Identity para detectar automáticamente cuándo existe una identidad administrada y la usa para acceder a los demás recursos.

Prerrequisitos

  • Una suscripción de Azure con permisos de escritura y asignación de roles para los recursos del tutorial, en una región de Azure que admite Service Connector y tiene suficiente soporte y cuota de App Service.

  • Azure Cloud Shell para ejecutar los pasos del tutorial, o si prefiere ejecutar localmente:

    1. Instale CLI de Azure 2.30.0 o posterior. Para comprobar la versión, ejecute az --version. Para actualizar, ejecute az upgrade.
    2. Inicie sesión en Azure mediante az login y siga las indicaciones.

Configuración del entorno

  1. Asegúrese de que la suscripción está registrada para usar los proveedores de recursos Microsoft.ServiceLinker y Microsoft.DBforPostgreSQL. Si no es así, ejecute az provider register -n Microsoft.[name of service] para registrar los proveedores.

  2. Instale las siguientes extensiones de CLI de Azure:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    

Clonación de la aplicación de ejemplo

  1. Clona el repositorio de la app de ejemplo.

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    Como alternativa, puede descargar la aplicación desde https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless y descomprimirla en una carpeta denominada serviceconnector-webapp-postgresql-django-passwordless.

  2. Cambie los directorios a la carpeta del repositorio mediante cd serviceconnector-webapp-postgresql-django-passwordless y ejecute todos los comandos restantes de esa carpeta.

En la aplicación de ejemplo, la configuración de producción de la aplicación web se encuentra en el archivo azuresite/production.py . La configuración de desarrollo se encuentra en azuresite/settings.py. La configuración de producción configura Django para que se ejecute en cualquier entorno de producción y no sea específica de App Service.

La aplicación usa la configuración de producción cuando se establece la variable de entorno WEBSITE_HOSTNAME. Para las cadenas de conexión de Azure Postgres, App Service establece automáticamente esta variable en la dirección URL de la aplicación web, como https://msdocs-django.azurewebsites.net.

Para obtener más información, consulte la lista de comprobación de implementación de Django. Consulte también la configuración de Production para Django en Azure.

Definición de variables de entorno iniciales

El código siguiente define las variables de entorno necesarias para este tutorial.

  • LOCATION debe ser una región de Azure en la que la suscripción disponga de cuota suficiente para crear los recursos y no restrinja el uso de Azure Database for PostgreSQL en la suscripción.
  • ADMIN_PW debe contener de 8 a 128 caracteres de manera que incluya al menos tres de las cuatro categorías: mayúsculas, minúsculas, números y caracteres no alfanuméricos, excepto $.
  1. Configure las siguientes variables de entorno, reemplazando los <region> marcadores de posición y <database password> por valores válidos.

    LOCATION="<region>"
    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="<database password>"
    
  2. Cree un grupo de recursos para contener todos los recursos del proyecto. El nombre del grupo de recursos se almacena en caché y se aplica automáticamente a los comandos posteriores.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

Implementación del código de la aplicación en App Service

Cree el host de la aplicación en App Service e implemente el código de aplicación de ejemplo en ese host. El az webapp up comando realiza las siguientes acciones:

  • Crea un plan de App Service en el plan de tarifa Básico (B1).
  • Crea la aplicación de App Service.
  • Habilita el registro predeterminado para la aplicación.
  • Carga el repositorio mediante la implementación ZIP con la automatización de compilación habilitada.
  • Compila la aplicación.

En el código, sku define la CPU, la memoria y el costo del plan de App Service. El plan de servicio Básico (B1) incurre en un pequeño costo en la suscripción de Azure. Puede omitir el --sku parámetro para usar la SKU predeterminada, normalmente P1v3 (Premium v3). Para obtener una lista completa de los planes de App Service, consulte Precios de App Service.

  1. En la carpeta serviceconnector-webapp-postgresql-django-passwordless repository, ejecute el siguiente az webapp up comando:

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.10 \
      --sku B1
    

    Nota:

    La implementación tarda unos minutos y el comando puede bloquearse o agotar el tiempo de espera, especialmente en una SKU básica. Una vez que la aplicación se compila correctamente y la salida muestra Starting the site, puede salir del comando seleccionando Ctrl+C.

  2. Configure la aplicación para que use el repositorio start.sh archivo mediante la ejecución del 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 la base de datos de Postgres en Azure

Cree la base de datos Azure Database for PostgreSQL para almacenar la información de la aplicación. El comando az postgres flexible-server create crea un servidor flexible Azure Database for PostgreSQL en el grupo de recursos especificado que tiene:

  • Nombre del servidor especificado en el --name parámetro . El nombre debe ser único en todo Azure.
  • SKU especificado en el --sku-name parámetro.
  • Nombre de usuario y contraseña de la cuenta de administrador especificados en los --admin-user y --admin-password parámetros.
  1. Cree el servidor de Azure Database para PostgreSQL. Si se le pide que habilite el acceso a la dirección IP del cliente actual, escriba y sí.

    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 \
      --microsoft-entra-auth Enabled
    
  2. Si no se le pide que habilite el acceso a la dirección IP del cliente actual, configure una regla de firewall en el servidor con el comando az postgres flexible-server firewall-rule create . Esta regla permite el acceso del entorno local al servidor.

    IP_ADDRESS=<your IP address>
    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
    

    Sugerencia

    Use cualquier herramienta o sitio web que muestre su dirección IP para sustituir <your IP address> en el comando. Por ejemplo, puede usar ¿Qué es mi dirección IP?.

  3. Cree una base de datos denominada restaurant en el servidor mediante 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 una conexión de servicio sin contraseña

Use az webapp connection create postgres-flexible para agregar un conector de servicio que conecte la aplicación web de Azure a la base de datos postgres mediante la autenticación de identidad administrada sin contraseña. El comando siguiente configura Azure Database for PostgreSQL para usar la identidad administrada y Azure control de acceso basado en rol. La salida del comando muestra las acciones que realiza Service Connector.

El comando crea una variable de entorno denominada AZURE_POSTGRESQL_CONNECTIONSTRING que proporciona la información de conexión de la base de datos para la aplicación. El código de la aplicación accede a las variables de entorno de la aplicación con instrucciones como os.environ.get('AZURE_POSTGRESQL_HOST'). Para obtener más información, consulte Variables de entorno de Access.

az webapp connection create postgres-flexible \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --server $DB_SERVER_NAME \
  --database restaurant \
  --client-type python \
  --system-identity

Creación y conexión a una cuenta de almacenamiento

Use az webapp connection create storage-blob para crear una cuenta de almacenamiento Azure y un conector de servicio. El comando realiza las siguientes acciones:

  • Habilita la identidad administrada asignada por el sistema en la aplicación web.
  • Agrega la aplicación web con el rol Colaborador de datos de Storage Blob a la nueva cuenta de almacenamiento.
  • Configura la red de la cuenta de almacenamiento para aceptar el acceso desde la aplicación web.
  • Crea una variable de entorno denominada AZURE_STORAGEBLOB_RESOURCEENDPOINT para la cuenta de Azure Storage.
  1. Ejecute el siguiente comando para crear la cuenta de almacenamiento y la conexión:

    STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \
      --new true \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --client-type python \
      --system-identity \
      --query configurations[].value \
      --output tsv)
    STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))
    
  2. Actualice la cuenta de almacenamiento para permitir el acceso público de blobs para que los usuarios de la aplicación accedan a fotos.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  3. Use az storage container create para crear un contenedor llamado photos en la cuenta de almacenamiento, permitiendo el acceso de lectura público anónimo a objetos en el nuevo contenedor.

    # Set the BLOB_ENDPOINT variable
    BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g')
    echo $BLOB_ENDPOINT
    
    # Create the storage container using the BLOB_ENDPOINT variable
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

Prueba de la aplicación web de Python en Azure

Abra y pruebe la aplicación web Azure Restaurant Review. La aplicación usa el paquete azure.identity y su DefaultAzureCredential clase. Cuando la aplicación se ejecuta en Azure, el DefaultAzureCredential detecta automáticamente cuándo existe una identidad administrada para App Service y la usa para acceder a los recursos de Azure Storage y Azure Database for PostgreSQL. La aplicación no necesita proporcionar claves de almacenamiento, certificados ni credenciales para acceder a estos recursos.

  • Para una instalación de CLI de Azure local, puede usar az webapp browse para abrir la aplicación en el explorador predeterminado:

    az webapp browse --name $APP_SERVICE_NAME.azurewebsites.net --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell no puede abrir un explorador local, por lo que no admite el comando az webapp browse. Desde Cloud Shell, la manera más fácil de abrir la aplicación web es seleccionar el dominio Default vínculo situado en la esquina superior derecha de la página del portal de Azure de la aplicación.

La aplicación puede tardar uno o dos minutos en iniciarse. Si ve una página de aplicación predeterminada que no es la aplicación de ejemplo, espere un minuto y actualice el explorador.

Pruebe la funcionalidad de la aplicación de ejemplo agregando un restaurante y algunas opiniones con fotos. La aplicación debe ser similar a la siguiente captura de pantalla:

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

Limpieza de recursos

Para evitar cargos continuos, puede eliminar los recursos que creó para este tutorial mediante la eliminación del grupo de recursos que los contiene. Asegúrese de que ya no necesita la aplicación o los recursos antes de ejecutar el comando.

az group delete --name $RESOURCE_GROUP_NAME --no-wait

La eliminación de todos los recursos puede llevar tiempo. El --no-wait argumento permite que el comando devuelva inmediatamente.

Solución de problemas

Si tiene problemas al ejecutar este tutorial, consulte los siguientes recursos: