Compartir vía


Tutorial: Uso de Service Connector para compilar una aplicación de Django con Postgres en Azure App Service

Nota:

En este tutorial, usará Service Connector para conectar una aplicación web a un servicio de base de datos. Este tutorial es una modificación del tutorial de App Service, por lo que puede que vea algunas similitudes. Consulte la sección Creación de un conector sin contraseña en la base de datos de Postgres para ver dónde entra en juego Service Connector y simplifica el proceso de conexión proporcionado en el tutorial de App Service.

En este tutorial se muestra cómo implementar una aplicación web Python Django controlada por datos en Azure App Service y cómo conectarla a una base de datos de Azure Database for PostgreSQL: servidor flexible.

En este tutorial, se usa la CLI de Azure para completar las siguientes tareas:

  • Configurar el entorno inicial con Python y la CLI de Azure
  • Creación de una base de datos de Azure Database for PostgreSQL: servidor flexible
  • Implementación de código en Azure App Service y conexión a PostgreSQL: servidor flexible
  • Actualizar el código y volver a implementarlo
  • Visualización de los registros de diagnóstico
  • Administrar la aplicación web en Azure Portal

Configuración del entorno inicial

Inicie desde Azure Cloud Shell en Azure Portal e instale la extensión sin contraseña del conector de servicio para la CLI de Azure.

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

Clonación o descarga de la aplicación de ejemplo

Clone el repositorio de ejemplo:

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

Vaya a la siguiente carpeta:

cd serviceconnector-webapp-postgresql-django-passwordless

En este tutorial, implementará una aplicación web Django en Azure App Service. La aplicación web usa una identidad administrada asignada por el sistema (conexiones sin contraseña) con el control de acceso basado en rol de Azure para acceder a Azure Storage y recursos de Azure Database for PostgreSQL: servidor flexible. El código usa DefaultAzureCredential de la biblioteca cliente de Azure Identity para Python. La clase DefaultAzureCredential detecta automáticamente si existe una identidad administrada para App Service y la usa para acceder a otros recursos de Azure.

  • La configuración para producción está en el archivo azuresite/production.py. Los valores del desarrollo están en el archivo azuresite/settings.py.
  • La aplicación usa la configuración de producción cuando la variable de entorno WEBSITE_HOSTNAME está establecida. Azure App Service establece automáticamente esta variable en la dirección URL de la aplicación web, como msdocs-django.azurewebsites.net.

Los valores de producción son específicos de la configuración de Django para ejecutarse en cualquier entorno de producción y no son específicos de App Service. Para obtener más información, consulte la lista de implementación de Django. Consulte también Configuración de producción para Django en Azure para los detalles de algunos de los cambios.

¿Tiene problemas? Póngase en contacto con nosotros.

Creación de una base de datos de Postgres en Azure

  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="{your database password}"
    

    Importante

    La ADMIN_PW debe contener entre 8 y 128 caracteres de tres de las siguientes categorías: Letras del alfabeto inglés mayúsculas y minúsculas, números y caracteres no alfanuméricos. 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. Cree un grupo de recursos (puede cambiarle el nombre, si lo desea). 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
    
  3. Cree un servidor de base de datos. Si se le pide que habilite el acceso a la dirección IP del cliente actual, escriba y para sí. Este proceso tarda unos minutos:

    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
    

    Si no se reconoce el comando az, asegúrese de que tiene instalada la CLI de Azure tal y como se describe en Configuración del entorno inicial.

    El comando az postgres flexible-server create realiza las siguientes acciones, que pueden tardar unos minutos:

    • Cree un grupo de recursos predeterminado si aún no hay un nombre almacenado en caché.
    • Cree un servidor flexible de PostgreSQL:
      • Con el nombre del servidor especificado con el parámetro --name. El nombre debe ser único en todo Azure.
      • Con la SKU especificada con el parámetro --sku-name.
    • Cree una cuenta de administrador con un nombre de usuario y una contraseña especificados con los parámetros --admin-user y --admin-password.
    • Cree una base de datos cuyo nombre se especifique con el parámetro --database-name.
  4. 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. (Si se le pide que habilite el acceso desde la dirección IP del cliente en el paso anterior, 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 utilizar el sitio web ¿Cuál es mi dirección IP?.

  5. Cree una base de datos denominada restaurant 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;'
    

Implementación del código en Azure App Service

En esta sección, creará un host de aplicación en la aplicación de App Service, conectará esta aplicación a la base de datos de Postgres y, a continuación, implementará el código en ese host.

Creación de la aplicación de App Service

  1. En el terminal, asegúrese de que está en la carpeta del repositorio serviceconnector-webapp-postgresql-django-passwordless que contiene el código de la aplicación.

  2. Ejecute el siguiente comando az webapp up para crear el host de App Service para la aplicación:

    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 coste del plan de App Service. El plan de servicio B1 (Básico) incurre en un pequeño coste en su suscripción Azure. Para obtener una lista completa de los planes de App Service, vea la página Precios de App Service.

    Este comando realiza las siguientes acciones, que pueden tardar unos minutos, para lo que usa el grupo de recursos y la ubicación almacenados en caché del comando az group create anterior (el grupo $RESOURCE_GROUP_NAME de la región eastus en este ejemplo).

    • Cree un plan de App Service en el plan de tarifa Básico (B1). Puede omitir --sku para usar los valores predeterminados.
    • Cree la aplicación de App Service.
    • Habilite el registro predeterminado para la aplicación.
    • Cargue el repositorio mediante la implementación del archivo ZIP con la automatización de compilación habilitada.
  3. Configure App Service para usar start.sh en el repositorio 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 un conector sin contraseña en la base de datos de Postgres

Con el código ahora implementado en App Service, el paso siguiente consiste en conectar la aplicación a la base de datos de Postgres en Azure. El código de la aplicación espera encontrar información de base de datos en una variable de entorno denominada AZURE_POSTGRESQL_CONNECTIONSTRING para el servidor flexible de PostgresSQL y una variable de entorno denominada AZURE_STORAGEBLOB_RESOURCEENDPOINT para la cuenta de Azure Storage.

Los comandos de Service Connector configuran los recursos de Azure Storage y Azure Database for PostgreSQL para usar la identidad administrada y el control de acceso basado en rol de Azure. Los comandos crean configuraciones de aplicación en App Service que conectan su aplicación web a estos recursos. La salida de los comandos enumera las acciones del conector de servicio realizadas para habilitar la capacidad sin contraseña.

  1. Agregue un conector de servicio PostgreSQL con el comando az webapp connection create postgres-flexible. La identidad administrada asignada por el sistema se usa para autenticar la aplicación web en el recurso de destino, PostgreSQL en este caso.
    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
    

Nota:

Si ve el mensaje de error "La suscripción no está registrada para usar Microsoft.ServiceLinker", ejecute az provider register -n Microsoft.ServiceLinker para registrar el proveedor de recursos del conector de servicio y vuelva a ejecutar el comando de conexión.

En el código de Python, tiene acceso a esta configuración como variables de entorno con instrucciones como os.environ.get('AZURE_POSTGRESQL_HOST'). Para obtener más información, consulte Acceso a variables de entorno.

¿Tiene problemas? Consulte primero la Guía de solución de problemas, de lo contrario, háganoslo saber.

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

  1. Use el comando az webapp connection create storage-blob para crear una cuenta de almacenamiento y cree un conector de servicio que realice las siguientes configuraciones:
  • 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 cuenta de almacenamiento recién creada.

  • Configure la red de la cuenta de almacenamiento para aceptar el acceso desde la aplicación web.

    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))
    
  1. Actualice la cuenta de almacenamiento para permitir el acceso público de blobs para que la aplicación de restaurante de usuarios accedan a imágenes.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  2. Cree un contenedor denominado photos en la cuenta de almacenamiento con el comando az storage container create. Permitir el acceso anónimo de lectura (público) a blobs en el contenedor recién creado.

    # 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
    

Probar una aplicación web de Python en Azure

La aplicación Python de ejemplo utiliza el paquete azure.identity y su clase DefaultAzureCredential. Cuando la app se ejecuta en Azure, DefaultAzureCredential detecta automáticamente si existe una identidad administrada para el 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 o credenciales al 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 uno o dos minutos en iniciarse. Si ve una página de aplicación predeterminada que no es la página de aplicación de muestra predeterminada, espere un minuto y actualice el navegador.

  2. Pruebe la funcionalidad de la aplicación de ejemplo y añada un restaurante y algunas reseñas con fotos del restaurante. La información del restaurante y las reseñas se almacenan en Azure Database for PostgreSQL y las fotos se almacenan en Azure Storage. He aquí una captura de pantalla de ejemplo:

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

Limpieza de recursos

Si desea mantener la aplicación o continuar con más tutoriales, vaya a Pasos siguientes. De lo contrario, para evitar incurrir en cargos continuos, elimine el grupo de recursos creado para este tutorial:

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

Al eliminar el grupo de recursos, también se desasignan y eliminan todos los recursos que contiene. Asegúrese de que ya no necesita los recursos del grupo antes de usar el comando.

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

¿Tiene problemas? Háganoslo saber.

Paso siguiente