Créer et déployer une application web Django sur Azure avec une identité managée affectée par l’utilisateur
Avec ce tutoriel, vous pourrez déployer 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 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.
Dans ce tutoriel, vous allez créer une identité managée affectée par l’utilisateur et l’affecter à App Service pour lui permettre d’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 plusieurs ressources peuvent les utiliser, et leurs cycles de vie sont dissociés des cycles de vie des ressources auxquelles elles sont associées. Pour en savoir plus sur les bonnes pratiques d’utilisation des identités managées, consultez Recommandations relatives aux meilleures pratiques liées aux identités managées.
Ce tutoriel vous montre comment déployer l’application web Python et créer des ressources Azure à l’aide de l’interface de ligne de commande Azure. 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.
Obtenir l’exemple d’application
Utilisez l’exemple d’application Django pour suivre ce tutoriel. Téléchargez ou clonez l’exemple d’application dans votre environnement de développement.
Clonez de l’exemple.
git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
Accédez au dossier de l’application.
cd msdocs-django-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 une identité managée affectée par l’utilisateur.
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 utilisez des commandes Azure CLI pour créer une identité managée affectée par l’utilisateur et l’affecter à votre application dans Azure. Vous affectez ensuite manuellement ces rôles appropriés à l’identité sur votre compte de stockage Azure et Azure Database pour PostgreSQL serveur. Enfin, vous définissez la variable d’environnement AZURE_CLIENT_ID
de votre application dans Azure pour configurer DefaultAzureCredential
pour utiliser l’identité managée.
Une fois que l’identité managée affectée par l’utilisateur est configurée sur votre application et son environnement d’exécution, et une fois qu’elle a 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 ./restaurant_review/views.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é pour définir le mot de passe dans l’URI de connexion PostgreSQL.
azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conf.settings.DATABASES['default']['PASSWORD'] = 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 flexible Azure PostgreSQL
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" UA_NAME="UAManagedIdentityPythonTest$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.Créez un groupe de ressources avec la commande az group create.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
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 l’interpréteur de commandes Bash (’\’). 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 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.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
Configurez une règle de pare-feu sur votre serveur à l’aide de la commande az postgres flexible-server firewall-rule create. Cette règle accorde à votre environnement local un accès pour se connecter au serveur. (Vous pouvez ignorer cette étape si vous utilisez Azure Cloud Shell.)
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 Quelle est mon adresse IP ?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
Exécutez ces commandes dans le dossier racine de l’exemple d’application pour créer une instance App Service et déployer le code sur celle-ci.
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 (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.
Configurez App Service pour utiliser le start.sh dans l’exemple de 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 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 Azure Storage.
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 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é).
Dans cette section, vous allez créer un compte de stockage et un conteneur qui autorisent l’accès en lecture publique aux objets blob dans le conteneur. Dans les sections ultérieures, vous créerez une identité managée affectée par l’utilisateur et vous la configurerez pour écrire des objets blob dans le compte de stockage.
Utilisez la commande az storage account 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
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, notamment si vous recevez un message d’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 qu’un rôle Azure a été affecté à votre compte d’utilisateur Azure et qu’il est autorisé à 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 en savoir plus, 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 ».
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.
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 dans 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
Utilisez la commande az account show pour obtenir votre ID d’abonnement et le générer dans une variable que l’on peut utiliser 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
Affectez l’identité managée à Azure 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
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 de l’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. L’authentification est ainsi effectuée sans mot de passe avec DefaultAzureCredential
.
L’exemple de code d’application utilise le constructeur de classe DefaultAzureCredential
, sans transmettre l’ID client d’identité managée affectée par l’utilisateur au constructeur. Dans un tel cas, la solution de repli consiste à vérifier la présence de 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 en savoir plus, consultez Présentation de DefaultAzureCredential.
Créez des rôles pour le l’identité managée
Dans cette section, vous allez créer des attributions de rôles pour l’identité managée afin de permettre l’accès au compte de stockage et à la base de données.
Créez une attribution de rôle pour l’identité managée en vue de 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 en savoir plus, consultez Comprendre les affectations de rôles.
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 avez des difficultés à exécuter la commande, assurez-vous d’avoir ajouté votre compte utilisateur en tant qu’administrateur Microsoft Entra pour le serveur PosgreSQL et d’avoir autorisé l’accès à votre adresse IP dans les règles du pare-feu. Pour en savoir plus, 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 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.
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.
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 :
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.