Creación e implementación de una aplicación web de Python de Flask en Azure con identidad administrada asignada por el sistema

En este tutorial, implementará código de Python Flask para crear e implementar una aplicación web que se ejecute en App de Azure Service. La aplicación web usa su identidad administrada asignada por el sistema (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.

Puede configurar conexiones sin contraseña a los servicios de Azure mediante Service Conectar or o puede configurarlas manualmente. En este tutorial se muestra cómo usar Service Conectar or. Para más información sobre las conexiones sin contraseña, consulte Conexiones sin contraseña para los servicios de Azure. Para obtener información sobre Service Conectar or, consulte la documentación de Service Conectar or.

En este tutorial se muestra cómo crear e implementar una aplicación web de Python 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. Para obtener ejemplos de uso de una identidad administrada asignada por el usuario, consulte Creación e implementación de una aplicación web de Django en Azure con una identidad administrada asignada por el usuario.

Obtención de la aplicación de ejemplo

Hay disponible una aplicación de Python de ejemplo que usa el marco flask para ayudarle a seguir este tutorial. Descargue o clone una de las aplicaciones de ejemplo en la estación de trabajo local.

  1. Clone el ejemplo en una sesión de Azure Cloud Shell.

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

    cd msdocs-flask-web-app-managed-identity
    

Creación de un servidor 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"
    

    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 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 el shell si es necesario).

    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
    

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

  1. Cree un servicio de aplicaciones mediante el comando az webapp up .

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --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 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 conectores sin contraseña en recursos de Azure

Los comandos service Conectar or 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 la configuración de la aplicación en App Service que conecta la aplicación web a estos recursos. La salida de los comandos muestra las acciones del conector de servicio realizadas para habilitar la funcionalidad 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
    
  2. Agregue un conector de servicio de almacenamiento con el comando az webapp connection create storage-blob .

    Este comando también agrega una cuenta de almacenamiento y agrega la aplicación web con el rol Colaborador de datos de Storage Blob a la cuenta de almacenamiento.

    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))
    

Creación de un contenedor en la cuenta de almacenamiento

La aplicación de Python de ejemplo almacena las fotos enviadas por los revisores como blobs en un contenedor de la cuenta de almacenamiento.

  • Cuando un usuario envía una foto con su revisión, la aplicación de ejemplo escribe la imagen en el contenedor mediante su identidad administrada asignada por el sistema para la autenticación y autorización. Ha configurado esta funcionalidad en la última sección.

  • 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).

Para mejorar la seguridad, las cuentas de almacenamiento se crean con acceso anónimo a los datos de blobs deshabilitados de forma predeterminada. En esta sección, habilitará el acceso de lectura anónimo en la cuenta de almacenamiento y, a continuación, creará un contenedor denominado fotos que proporcione acceso público (anónimo) a sus blobs.

  1. Actualice la cuenta de almacenamiento para permitir el acceso de lectura anónimo a blobs con el comando az storage account update .

    az storage account update \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --allow-blob-public-access true
    

    La habilitación del acceso anónimo en la cuenta de almacenamiento no afecta al acceso para blobs individuales. Debe habilitar explícitamente el acceso público a blobs en el nivel de contenedor.

  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.

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --account-key $(az storage account keys list --account-name $STORAGE_ACCOUNT_NAME \
          --query [0].value --output tsv) 
    

    Nota:

    Por motivos de brevedad, este comando usa la clave de cuenta de almacenamiento para autorizar con la cuenta de almacenamiento. En la mayoría de los escenarios, el enfoque recomendado de Microsoft es usar roles de Id. de Microsoft Entra y Azure (RBAC). Para obtener un conjunto rápido de instrucciones, 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".

Para más información sobre el acceso de lectura anónimo a los datos de blobs, consulte Configuración del acceso de lectura anónimo para contenedores y blobs.

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