Partager via


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

Dans ce tutoriel, vous allez déployer 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 basé sur le rôle Azure pour accéder aux ressources Azure Storage et Azure Database pour PostgreSQL - Serveur flexible. Le code utilise la classe DefaultAzureCredential de la bibliothèque cliente Azure Identity pour Python. La classe DefaultAzureCredential détecte automatiquement l’existence d’une identité managée pour App Service et l’emploie pour accéder à d’autres ressources Azure.

Vous pouvez configurer des connexions sans mot de passe aux services Azure à l’aide de Service Connector ou les configurer manuellement. Ce tutoriel explique comment utiliser Service Connector. Pour en savoir plus sur les connexions sans mot de passe, consultez Connexions sans mot de passe pour les services Azure. Pour en savoir plus sur Service Connector, consultez la Documentation de Service Connector.

Ce tutoriel vous montre comment créer et déployer une application web Python à l’aide d’Azure CLI. Les commandes de ce tutoriel sont écrites pour leur exécution dans un interpréteur de commandes Bash. Vous pouvez les exécuter dans n’importe quel environnement Bash dans lequel l’interface de ligne de commande est installée, comme votre environnement local, ou Azure Cloud Shell. Avec certaines modifications (par exemple, en définissant et en utilisant des variables d’environnement), vous pouvez exécuter ces commandes dans d’autres environnements, comme l’interpréteur de commandes de 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 au moyen d’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
    

Examiner le code d’authentification

L’exemple d’application web doit s’authentifier auprès de deux magasins de données :

  • Le serveur de stockage Blob Azure où il stocke et récupère les photos soumises par les réviseurs.
  • Une base de données Azure Database pour PostgreSQL - Serveur flexible où il stocke les restaurants et les revues.

Il utilise DefaultAzureCredential pour s’authentifier auprès des deux magasins de données. DefaultAzureCredential permet de configurer l’application pour qu’elle s’exécute sous l’identité de différents principaux de service, selon l’environnement dans lequel elle s’exécute, sans modifier le code. Par exemple, dans un environnement de développement local, l’application peut s’exécuter sous l’identité du développeur connecté à l’interface de ligne de commande Azure, alors que dans Azure, comme dans le présent tutoriel, elle peut s’exécuter sous son identité managée affectée par le système.

Dans les deux cas, le principal de sécurité sous lequel l’application s’exécute doit avoir un rôle sur chaque ressource Azure utilisée par l’application qui lui permet d’effectuer les actions sur la ressource requise par l’application. Dans ce tutoriel, vous allez utiliser des connecteurs de service pour activer automatiquement l’identité managée affectée par le système sur votre application dans Azure et pour attribuer ces rôles appropriés à l’identité sur votre compte de stockage Azure et le serveur Azure Database pour PostgreSQL.

Une fois que l’identité managée affectée par le système est activée et qu’elle à reçu des rôles appropriés sur les magasins de données, vous pouvez utiliser DefaultAzureCredential pour vous authentifier auprès des ressources Azure requises.

Le code suivant permet de créer un client de stockage d’objets blob pour charger des photos dans app.py. Une instance de DefaultAzureCredential est fournie au client, qu’il utilise pour acquérir des jetons d’accès en vue d’effectuer des opérations sur le stockage Azure.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

azure_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
    account_url=account_url,
    credential=azure_credential)

Une instance de DefaultAzureCredential est également utilisée pour obtenir un jeton d’accès pour Azure Database pour PostgreSQL dans ./azureproject/get_conn.py. Dans ce cas, le jeton est directement acquis en appelant get_token sur l’instance d’informations d’identification et en lui transmettant la valeur scope appropriée. Le jeton est ensuite utilisé à la place du mot de passe dans l’URI de connexion PostgreSQL retourné à l’appelant.

azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conn = str(current_app.config.get('DATABASE_URI')).replace('PASSWORDORTOKEN', token.token)

Pour en savoir plus sur l’authentification de vos applications auprès des services Azure, consultez Authentifier des applications Python auprès des services Azure à l’aide du Kit de développement logiciel (SDK) Azure pour Python. Pour en savoir plus sur DefaultAzureCredential, y compris sur la façon de personnaliser la chaîne d’informations d’identification évaluée pour votre environnement, consultez Vue d’ensemble de DefaultAzureCredential.

Créer un serveur Azure PostgreSQL

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

    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

    Le ADMIN_PW doit contenir entre 8 et 128 caractères de trois des catégories suivantes : Lettres majuscules, 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 l’interpréteur de commandes Bash (’\’). 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 sku-name est le nom du niveau tarifaire et de la configuration de calcul. Pour plus d’informations, consultez Niveaux tarifaires d’Azure Database pour PostgreSQL. Utilisez az postgres flexible-server list-skus --location $LOCATION pour répertorier les références SKU disponibles.

  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 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 (UC, mémoire) et le coût du plan App Service. Le plan de service B1 (Essentiel) entraîne un faible 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 Service Connector configurent les ressources Azure Storage et Azure Database pour PostgreSQL pour utiliser l’identité managée et le contrôle d’accès basé sur le rôle Azure. Les commandes créent des paramètres d’application dans App Service, les quels 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 commande az webapp connection create postgres-flexible. 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 Contributeur aux données Blob du stockage 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 section précédente.

  • Lorsqu’un utilisateur affiche les revues d’un restaurant, l’application renvoie un lien vers la photo dans le stockage 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 publiquement disponibles à travers 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 allez activer l’accès en lecture anonyme sur votre compte de stockage, puis créer 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. Autorisez l’accès en lecture anonyme (public) aux objets blob dans le conteneur 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

    Par souci de concision, cette commande utilise la clé du compte de stockage pour autoriser l’utilisation de ce dernier. Pour la plupart des cas, l’approche recommandée par Microsoft consiste à utiliser des rôles Microsoft Entra ID et Azure (RBAC). Pour obtenir une série d’instructions rapides, consultez Démarrage rapide : Créer, télécharger et lister des objets blob avec Azure CLI. Il convient de noter que plusieurs rôles Azure vous permettent de créer des conteneurs dans un compte de stockage, notamment « Propriétaire », « Contributeur », « Propriétaire de données Blob du stockage » et « Contributeur aux données Blob du stockage ».

Pour en savoir plus sur l’accès en lecture anonyme aux données 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 classe DefaultAzureCredential. Lorsque l’application s’exécute dans Azure, DefaultAzureCredential détecte automatiquement l’existence d’une identité managée pour App Service et, le cas échéant, l’utilise pour accéder à d’autres ressources Azure (stockage et PostgreSQL dans ce cas). Pour accéder à ces ressources, il est inutile de fournir des clés de stockage, des certificats ou des informations d’identification à App Service.

  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 une page d’application par défaut s’affiche alors qu’il ne s’agit pas de la page de l’exemple 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 revues avec des photos pour le restaurant.

    Le restaurant et les informations de revue sont stockées dans Azure Database pour PostgreSQL et les photos dans Stockage Azure. Voici une 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, Azure PostgreSQL Database et Azure Storage.

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 à l’aide de la commande az group delete supprime toutes les ressources de ce dernier et constitue 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