Partager via


Tutoriel : Utilisation de Service Connector pour créer une application Django avec Postgres dans Azure App Service

Remarque

Dans ce tutoriel, vous utilisez le Connecteur de services pour connecter une application web à un service de base de données. Ce tutoriel est une modification du Tutoriel App Service, vous pouvez donc voir quelques similitudes. Consultez la section Créer un connecteur sans mot de passe pour une base de données Postgres pour voir quand le connecteur de services est utilisé et simplifie le processus de connexion indiqué dans le tutoriel App Service.

Ce tutoriel explique comment déployer une application web Python Django pilotée par les données sur Azure App Service et la connecter à une base de données Azure Database pour PostgreSQL – Serveur flexible.

Ce tutoriel explique comment utiliser Azure CLI pour effectuer les tâches suivantes :

  • Configurer votre environnement initial avec Python et Azure CLI
  • Créer une base de données de serveur flexible Azure Database pour PostgreSQL
  • Déployer du code pour Azure App Service et se connecter à un serveur flexible PostgreSQL
  • Mettre à jour votre code et effectuer un redéploiement
  • Afficher les journaux de diagnostic
  • Gérer l’application web dans le portail Azure.

Configurer votre environnement initial

Lancez Azure Cloud Shell dans le portail Azure et installez l’extension sans mot de passe du connecteur de services pour Azure CLI.

az extension add --name serviceconnector-passwordless --upgrade

Cloner ou télécharger l’exemple d’application

Clonez l’exemple de dépôt :

git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git

Accédez au dossier suivant :

cd serviceconnector-webapp-postgresql-django-passwordless

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 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 Identité Azure pour Python. La classe DefaultAzureCredential détecte automatiquement si une identité managée existe pour App Service et l’utilise pour accéder aux autres ressources Azure.

  • Les paramètres de production se trouvent dans le fichier azuresite/production.py. Les paramètres de développement se trouvent dans azuresite/settings.py.
  • L’application utilise les paramètres de production quand la variable d’environnement WEBSITE_HOSTNAME est définie. Azure App Service définit automatiquement cette variable avec l’URL de l’application web, par exemple msdocs-django.azurewebsites.net.

Les paramètres de production sont propres à la configuration de Django pour s’exécuter dans n’importe quel environnement de production. Ils ne sont pas propres à App Service. Pour plus d’informations, consultez la liste de contrôle du déploiement de Django. Pour obtenir plus d’informations sur certaines modifications, consultez également Paramètres de production pour Django sur Azure.

Vous rencontrez des problèmes ? Faites-le nous savoir.

Créer une base de données Postgres dans Azure

  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="{your database password}"
    

    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éez 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 (vous pouvez modifier le nom, si vous le souhaitez). Le nom du groupe de ressources est mis en cache et appliqué automatiquement aux commandes suivantes.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    
  3. Créez le serveur de base de données. Si vous êtes invité à activer l’accès sur l’adresse IP du client actuelle, tapez y pour oui. Ce processus prend quelques minutes :

    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
    

    Si la commande az n’est pas reconnue, vérifiez qu’Azure CLI est installé, comme décrit dans Configurer votre environnement initial.

    La commande az postgres flexible-server create effectue les actions suivantes, qui prennent quelques minutes :

    • Créez un groupe de ressources par défaut s’il n’existe pas déjà de nom mis en cache.
    • Créez un serveur flexible PostgreSQL :
      • Le nom du serveur est spécifié avec le paramètre --name. Le nom doit être unique dans tout Azure.
      • La référence SKU est spécifiée avec le paramètre --sku-name.
    • Créez un compte d’administrateur avec un nom d’utilisateur et un mot de passe, que vous spécifiez avec les paramètres --admin-user et --admin-password.
    • Créez une base de données dont le nom est spécifié avec le paramètre --database-name.
  4. 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 d’accéder au serveur. (Si vous avez été invité à activer l’accès à partir de votre adresse IP cliente à l’étape précédente, 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 affichant votre adresse IP pour remplacer <your IP> dans la commande. Par exemple, vous pouvez utiliser le site web Quelle est mon adresse IP ?

  5. Créez une base de données nommée restaurant avec 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;'
    

Déployer l’image dans Azure App Service

Dans cette section, vous allez créer un hôte d’application dans l’application App Service, connecter cette application à la base de données Postgres, puis déployer votre code sur cet hôte.

Créer l’application App Service

  1. Dans le terminal, vérifiez que vous êtes dans le dossier de dépôt serviceconnector-webapp-postgresql-django-passwordless qui contient le code de l’application.

  2. Exécutez la commande az webapp up suivante pour créer l’hôte App service pour l’application :

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

    Le paramètre 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.

    Cette commande effectue les actions suivantes, qui peuvent prendre quelques minutes, en utilisant le groupe de ressources et l’emplacement mis en cache à partir de la commande précédente az group create(le groupe $RESOURCE_GROUP_NAME dans la région eastus de cet exemple).

    • Créez un plan App service dans le niveau tarifaire de base (B1). Vous pouvez omettre --sku pour utiliser les valeurs par défaut.
    • Créez l’application App Service.
    • Activez la journalisation par défaut pour l'application.
    • Chargez le dépôt à l’aide du déploiement ZIP avec l’automatisation de la génération activée.
  3. Configurez App Service pour utiliser start.sh dans le 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 connecteur sans mot de passe pour la base de données Postgres

Le code étant maintenant déployé sur App Service, l’étape suivante consiste à connecter l’application à la base de données Postgres dans Azure. Le code de l’application s’attend à trouver les informations de base de données dans une variable d’environnement nommée AZURE_POSTGRESQL_CONNECTIONSTRING pour le serveur flexible PostgresSQL, et dans une variable d’environnement nommée AZURE_STORAGEBLOB_RESOURCEENDPOINT pour le compte de stockage Azure.

Les commandes du connecteur de services configurent les ressources Stockage Azure et Azure Database pour PostgreSQL afin d’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, 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 sur 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
    

Remarque

Si vous voyez le message d’erreur « L’abonnement n’est pas inscrit pour utiliser Microsoft.ServiceLinker », exécutez az provider register -n Microsoft.ServiceLinker pour inscrire le fournisseur de ressources Service Connector et réexécutez la commande de connexion.

Dans votre code Python, vous accédez à ces paramètres comme à des variables d’environnement avec des instructions telles que os.environ.get('AZURE_POSTGRESQL_HOST'). Pour en savoir plus, consultez Accéder aux variables d’environnement.

Vous rencontrez des problèmes ? Consultez d’abord le Guide de résolution des problèmes ; autrement, faites-le nous savoir.

Créer un compte de stockage et s’y connecter

  1. Utilisez la commande az webapp connection create storage-blob pour créer un compte de stockage et un connecteur de services qui effectue les configurations suivantes :
  • Active l’identité managée affectée par le système sur l’application web

  • Ajoute l’application web avec le rôle Contributeur aux données Blob de stockage au compte de stockage nouvellement créé.

  • Configurez le réseau du compte de stockage pour accepter l’accès à partir de l’application web.

    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))
    
  1. Mettez à jour le compte de stockage pour autoriser l’accès public aux blobs et permettre aux utilisateurs de l’application restaurant d’accéder aux images.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  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 blobs dans le conteneur nouvellement créé.

    # Set the BLOB_ENDPOINT variable
    BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g')
    echo $BLOB_ENDPOINT
    
    # Create the storage container using the BLOB_ENDPOINT variable
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

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é d’évaluation de restaurant en utilisant Azure App Service, Azure PostgreSQL Database et le Stockage Azure.

Nettoyer les ressources

Si vous souhaitez conserver l’application ou passer à d’autres tutoriels, allez directement à Étapes suivantes. Autrement, pour éviter des frais récurrents, supprimez le groupe de ressources créé pour ce tutoriel :

az group delete --name $RESOURCE_GROUP_NAME --no-wait

En supprimant le groupe de ressources, vous désallouez et supprimez également toutes les ressources qu’il contient. Vérifiez bien que vous n’avez plus besoin des ressources du groupe avant d’exécuter la commande.

La suppression de toutes les ressources peut prendre un certain temps. L’argument --no-wait permet à la commande de revenir immédiatement.

Vous rencontrez des problèmes ? Faites-le nous savoir.

Étape suivante