Créer et déployer une application web Python Flask sur Azure avec une identité managée affectée par le système

Dans ce tutoriel, vous déployez du code Python Flask pour créer et déployer une application web s’exécutant dans Azure App Service. L’application web utilise son identité managée affectée par le système (connexions sans mot de passe) avec le contrôle d’accès en fonction du rôle Azure pour accéder aux ressources Stockage Azure et Azure Database pour PostgreSQL - Serveur flexible. Le code utilise la classe DefaultAzureCredential de la bibliothèque de client Azure Identity pour Python. La DefaultAzureCredential classe détecte automatiquement qu’une identité managée existe pour App Service et l’utilise pour accéder à d’autres ressources Azure.

Vous pouvez configurer des connexions sans mot de passe aux services Azure à l’aide du service Connecter or ou vous pouvez les configurer manuellement. Ce tutoriel montre comment utiliser service Connecter or. Pour plus d’informations sur les connexions sans mot de passe, consultez Connexions sans mot de passe pour les services Azure. Pour plus d’informations sur service Connecter or, consultez la documentation de service Connecter or.

Ce tutoriel vous montre comment créer et déployer une application web Python à l’aide d’Azure CLI. Les commandes de ce didacticiel sont écrites pour être exécutées dans un interpréteur de commandes Bash. Vous pouvez exécuter les commandes du didacticiel dans n’importe quel environnement Bash avec l’interface CLI installée, comme votre environnement local ou Azure Cloud Shell. Avec une modification (par exemple, la définition et l’utilisation de variables d’environnement), vous pouvez exécuter ces commandes dans d’autres environnements comme l’interpréteur de commandes Windows. Pour obtenir des exemples d’utilisation d’une identité managée affectée par l’utilisateur, consultez Créer et déployer une application web Django sur Azure avec une identité managée affectée par l’utilisateur.

Obtenir l’exemple d’application

Un exemple d’application Python utilisant l’infrastructure Flask est disponible pour vous aider à suivre ce tutoriel. Téléchargez ou clonez l’un des exemples d’application sur votre station de travail locale.

  1. Clonez l’exemple dans une session Azure Cloud Shell.

    git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
    
  2. Accédez au dossier de l’application.

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

Créer un serveur Azure PostgreSQL

  1. Configurez les variables d’environnement nécessaires pour le didacticiel.

    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"
    

    Important

    La ADMIN_PW valeur doit contenir 8 à 128 caractères de trois des catégories suivantes : lettres majuscules anglaises, lettres minuscules, chiffres et caractères non alphanumériques. Lorsque vous créez des noms d’utilisateur ou des mots de passe, n’utilisez pas le caractère $. Par la suite, vous créerez des variables d’environnement avec ces valeurs où le caractère $ a une signification spéciale dans le conteneur Linux utilisé pour exécuter des applications Python.

  2. Créez un groupe de ressources avec la commande az group create.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. Créez un serveur PostgreSQL avec la commande az postgres flexible-server create . (Cette commande et les commandes suivantes utilisent le caractère de continuation de ligne pour Bash Shell ('\'). Modifiez le caractère de continuation de ligne de votre interpréteur de commandes si nécessaire.)

    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
    

    Le nom de la référence SKU est le nom du niveau tarifaire et de la configuration de calcul. Pour plus d’informations, consultez Niveaux tarifaires d’Azure Database pour PostgreSQL. Pour répertorier les références SKU disponibles, utilisez az postgres flexible-server list-skus --location $LOCATION.

  4. Créez une base de données nommée restaurant à l’aide de la commande 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;'
    

Créer un service Azure App Service et déployer le code

  1. Créez un service d’application à l’aide de la commande az webapp up .

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

    La référence SKU définit la taille (processeur, mémoire) et le coût du plan App Service. Le plan de service B1 (de base) entraîne un petit coût dans votre abonnement Azure. Pour obtenir la liste complète des plans App Service, consultez la page de Tarification App Service.

  2. Configurez App Service pour utiliser le start.sh dans le référentiel avec la commande az webapp config set .

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Créer des connecteurs sans mot de passe pour les ressources Azure

Les commandes de Connecter or de service configurent Stockage Azure et Azure Database pour PostgreSQL ressources pour utiliser l’identité managée et le contrôle d’accès en fonction du rôle Azure. Les commandes créent des paramètres d’application dans App Service qui connectent votre application web à ces ressources. La sortie des commandes répertorie les actions du connecteur de service effectuées pour activer la fonctionnalité sans mot de passe.

  1. Ajoutez un connecteur de service PostgreSQL avec la connexion az webapp create postgres-flexible command. L’identité managée affectée par le système est utilisée pour authentifier l’application web auprès de la ressource cible, PostgreSQL dans ce cas.

    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. Ajoutez un connecteur de service de stockage avec la commande az webapp connection create storage-blob .

    Cette commande ajoute également un compte de stockage et ajoute l’application web avec le rôle Stockage Contributeur aux données Blob au compte de stockage.

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

Créer un conteneur dans le compte de stockage

L’exemple d’application Python stocke les photos soumises par les réviseurs en tant qu’objets blob dans un conteneur dans votre compte de stockage.

  • Lorsqu’un utilisateur envoie une photo avec sa révision, l’exemple d’application écrit l’image dans le conteneur à l’aide de son identité managée affectée par le système pour l’authentification et l’autorisation. Vous avez configuré cette fonctionnalité dans la dernière section.

  • Lorsqu’un utilisateur affiche les avis d’un restaurant, l’application retourne un lien vers la photo dans le stockage d’objets blob pour chaque révision associée. Pour que le navigateur affiche la photo, il doit pouvoir y accéder dans votre compte de stockage. Les données d’objet blob doivent être disponibles publiquement par le biais d’un accès anonyme (non authentifié).

Pour améliorer la sécurité, les comptes de stockage sont créés avec un accès anonyme aux données d’objet blob désactivées par défaut. Dans cette section, vous activez l’accès en lecture anonyme sur votre compte de stockage, puis créez un conteneur nommé photos qui fournit un accès public (anonyme) à ses objets blob.

  1. Mettez à jour le compte de stockage pour autoriser l’accès en lecture anonyme aux objets blob avec la commande az storage account update .

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

    L’activation de l’accès anonyme sur le compte de stockage n’affecte pas l’accès pour les objets blob individuels. Vous devez activer explicitement l’accès public aux objets blob au niveau du conteneur.

  2. Créez un conteneur appelé photos dans le compte de stockage avec la commande az storage container create . Autoriser l’accès en lecture anonyme (public) aux objets blob dans le conteneur nouvellement créé.

    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) 
    

    Remarque

    Pour des raisons de concision, cette commande utilise la clé de compte de stockage pour autoriser avec le compte de stockage. Pour la plupart des scénarios, l’approche recommandée par Microsoft consiste à utiliser des rôles Microsoft Entra ID et Azure (RBAC). Pour obtenir un ensemble rapide d’instructions, consultez Démarrage rapide : Créer, télécharger et répertorier des objets blob avec Azure CLI. Notez que plusieurs rôles Azure vous permettent de créer des conteneurs dans un compte de stockage, notamment « Propriétaire », « Contributeur », « Stockage Propriétaire des données Blob » et « Contributeur aux données blob Stockage ».

Pour en savoir plus sur l’accès en lecture anonyme aux données d’objet blob, consultez Configurer l’accès en lecture anonyme pour les conteneurs et les objets blob.

Tester l’application web Python dans Azure

L’exemple d’application Python utilise le package azure.identity et sa DefaultAzureCredential classe. Lorsque l’application s’exécute dans Azure, DefaultAzureCredential détecte automatiquement si une identité managée existe pour App Service et, le cas échéant, l’utilise pour accéder à d’autres ressources Azure (stockage et PostgreSQL dans ce cas). Il n’est pas nécessaire de fournir des clés de stockage, des certificats ou des informations d’identification à App Service pour accéder à ces ressources.

  1. Accédez à l’application déployée à l’URL http://$APP_SERVICE_NAME.azurewebsites.net.

    Le démarrage de l’application peut prendre une minute ou deux. Si vous voyez une page d’application par défaut qui n’est pas l’exemple de page d’application par défaut, attendez une minute et actualisez le navigateur.

  2. Testez les fonctionnalités de l’exemple d’application en ajoutant un restaurant et quelques commentaires avec des photos pour le restaurant.

    Le restaurant et les informations de révision sont stockées dans Azure Database pour PostgreSQL et les photos sont stockées dans Stockage Azure. Voici un exemple de capture d’écran :

    Capture d’écran de l’exemple d’application montrant la fonctionnalité de révision des restaurants à l’aide d’Azure App Service, d’Azure PostgreSQL Database et de Stockage Azure.

Nettoyage

Dans ce tutoriel, toutes les ressources Azure ont été créées dans le même groupe de ressources. La suppression du groupe de ressources supprime avec la commande az group delete supprime toutes les ressources du groupe de ressources et est le moyen le plus rapide de supprimer toutes les ressources Azure utilisées pour votre application.

az group delete  --name $RESOURCE_GROUP_NAME 

Vous pouvez éventuellement ajouter l’argument --no-wait pour permettre à la commande de retourner avant que l’opération soit terminée.

Étapes suivantes