Créer et déployer une application web Django sur Azure avec une identité managée affectée par l’utilisateur

Dans ce tutoriel, vous déployez une application web Django sur Azure App Service. L’application web utilise une identité managée affectée par l’utilisateur (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.

Dans ce tutoriel, vous allez créer une identité managée affectée par l’utilisateur et l’affecter à App Service afin qu’elle puisse accéder aux ressources de base de données et de compte de stockage. Pour obtenir un exemple d’utilisation d’une identité managée affectée par le système, consultez Créer et déployer une application web Python Flask sur Azure avec une identité managée affectée par le système. Les identités managées affectées par l’utilisateur sont recommandées, car elles peuvent être utilisées par plusieurs ressources et leurs cycles de vie sont dissociés des cycles de vie des ressources avec lesquels ils sont associés. Pour plus d’informations sur les meilleures pratiques relatives à l’utilisation d’identités managées, consultez les recommandations relatives aux meilleures pratiques d’identité managée.

Ce tutoriel vous montre comment déployer l’application web Python et créer des ressources Azure à 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.

Obtenir l’exemple d’application

Utilisez l’exemple d’application Django pour suivre ce didacticiel. Téléchargez ou clonez l’exemple d’application dans votre environnement de développement.

  1. Clonez l’exemple.

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

    cd msdocs-django-web-app-managed-identity
    

Créer un serveur flexible 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"
    UA_NAME="UAManagedIdentityPythonTest$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 flexible 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 pour d’autres interpréteurs de commandes.)

    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 \
      --public-access 0.0.0.0
    

    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. Ajoutez votre compte Azure en tant qu’administrateur Microsoft Entra pour le serveur avec la commande az postgres flexible-server ad-admin create .

    ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv)
    ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv)
    echo $ACCOUNT_EMAIL, $ACCOUNT_ID
    az postgres flexible-server ad-admin create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --display-name $ACCOUNT_EMAIL \
      --object-id $ACCOUNT_ID \
      --type User
    
  5. Configurez une règle de pare-feu sur votre serveur avec la commande az postgres flexible-server firewall-rule create . Cette règle permet à votre environnement local de se connecter au serveur. (Si vous utilisez Azure Cloud Shell, vous pouvez ignorer cette étape.)

    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
    

    Utilisez n’importe quel outil ou site web qui affiche votre adresse IP pour remplacer <your IP> dans la commande. Par exemple, vous pouvez utiliser le site web Qu’est-ce que mon adresse IP ?

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

Exécutez ces commandes dans le dossier racine de l’exemple d’application pour créer un App Service et déployer le code sur celui-ci.

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

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --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 l’exemple de dépôt 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 un compte de stockage et un conteneur

L’exemple d’application stocke les photos soumises par les réviseurs en tant qu’objets blob dans Stockage Azure.

  • Lorsqu’un utilisateur envoie une photo avec sa révision, l’exemple d’application écrit l’image dans le conteneur à l’aide de l’identité managée et DefaultAzureCredential pour accéder au compte de stockage.

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

Dans cette section, vous créez un compte de stockage et un conteneur qui autorisent l’accès en lecture public aux objets blob dans le conteneur. Dans les sections ultérieures, vous créez une identité managée affectée par l’utilisateur et configurez-la pour écrire des objets blob dans le compte de stockage.

  1. Utilisez la commande az storage create pour créer un compte de stockage.

    STORAGE_ACCOUNT_NAME="msdocsstorage$RAND_ID"
    az storage account create \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --sku Standard_LRS \
      --allow-blob-public-access true
    
  2. Créez un conteneur appelé photos dans le compte de stockage avec la commande az storage container create .

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login
    

    Remarque

    Si la commande échoue, par exemple, si vous recevez une erreur indiquant que la demande peut être bloquée par des règles réseau du compte de stockage, entrez la commande suivante pour vous assurer que votre compte d’utilisateur Azure reçoit un rôle Azure avec l’autorisation de créer un conteneur.

    az role assignment create --role "Storage Blob Data Contributor" --assignee $ACCOUNT_EMAIL --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
    

    Pour plus d’informations, 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 ».

Créer une identité managée attribuée par l’utilisateur

Créez une identité managée affectée par l’utilisateur et affectez-la à App Service. L’identité managée est utilisée pour accéder à la base de données et au compte de stockage.

  1. Utilisez la commande az identity create pour créer une identité managée affectée par l’utilisateur et générer l’ID client vers une variable pour une utilisation ultérieure.

    UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv)
    echo $UA_CLIENT_ID
    
  2. Utilisez la commande az account show pour obtenir votre ID d’abonnement et le générer dans une variable qui peut être utilisée pour construire l’ID de ressource de l’identité managée.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME"
    echo $RESOURCE_ID
    
  3. Affectez l’identité managée à App Service avec la commande az webapp identity assign .

    export MSYS_NO_PATHCONV=1
    az webapp identity assign \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $APP_SERVICE_NAME \
        --identities $RESOURCE_ID
    
  4. Créez des paramètres d’application App Service qui contiennent l’ID client de l’identité managée et d’autres informations de configuration avec la commande az webapp config appsettings set .

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \
        STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \
        STORAGE_CONTAINER_NAME=photos \
        DBHOST=$DB_SERVER_NAME \
        DBNAME=restaurant \
        DBUSER=$UA_NAME
    

L’exemple d’application utilise des variables d’environnement (paramètres d’application) pour définir des informations de connexion pour la base de données et le compte de stockage, mais ces variables n’incluent pas de mots de passe. Au lieu de cela, l’authentification est effectuée sans mot de passe avec DefaultAzureCredential.

L’exemple de code d’application utilise le DefaultAzureCredential constructeur de classe sans passer l’ID client d’identité managée affectée par l’utilisateur au constructeur. Dans ce scénario, le secours consiste à case activée pour la variable d’environnement AZURE_CLIENT_ID, que vous définissez comme paramètre d’application.

Si la variable d’environnement AZURE_CLIENT_ID n’existe pas, l’identité managée affectée par le système est utilisée si elle est configurée. Pour plus d’informations, consultez Présentation de DefaultAzureCredential.

Créer des rôles pour l’identité managée

Dans cette section, vous allez créer des attributions de rôles pour l’identité managée afin d’activer l’accès au compte de stockage et à la base de données.

  1. Créez une attribution de rôle pour l’identité managée pour permettre l’accès au compte de stockage avec la commande az role assignment create .

    export MSYS_NO_PATHCONV=1
    az role assignment create \
    --assignee $UA_CLIENT_ID \
    --role "Storage Blob Data Contributor" \
    --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME"
    

    La commande spécifie l’étendue de l’attribution de rôle au groupe de ressources. Pour plus d’informations, consultez Comprendre les attributions de rôles.

  2. Utilisez la commande az postgres flexible-server execute pour vous connecter à la base de données Postgres et exécuter les mêmes commandes pour attribuer des rôles à l’identité managée.

    ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)
    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ACCOUNT_EMAIL \
      --admin-password $ACCOUNT_EMAIL_TOKEN \
      --database-name postgres \
      --querytext "select * from pgaadauth_create_principal('"$UA_NAME"', false, false);select * from pgaadauth_list_principals(false);"
    

    Si vous ne parvenez pas à exécuter la commande, veillez à ajouter votre compte d’utilisateur en tant qu’administrateur Microsoft Entra pour le serveur PosgreSQL et que vous avez autorisé l’accès à votre adresse IP dans les règles de pare-feu. Pour plus d’informations, consultez la section Créer un serveur flexible Azure PostgreSQL.

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