Déployer une application web Python (Django ou Flask) avec PostgreSQL dans Azure
Dans ce tutoriel, vous allez déployer une application web Python pilotée par les données (Django ou Flask) sur Azure App Service avec le service de base de données relationnelle Azure Database pour PostgreSQL. Azure App Service prend en charge Python dans un environnement serveur Linux.
Pour suivre ce didacticiel, vous aurez besoin des éléments suivants :
- Compte Azure avec un abonnement actif. Si vous ne possédez pas de compte Azure, vous pouvez créer un compte gratuit.
- Connaissance du développement en Python avec Flask ou Python avec Django
- Compte Azure avec un abonnement actif. Si vous ne possédez pas de compte Azure, vous pouvez créer un compte gratuit.
- Azure Developer CLI installé. Vous pouvez suivre les étapes avec Azure Cloud Shell, car Azure Developer CLI est déjà installé.
- Connaissance du développement en Python avec Flask ou Python avec Django
Passer à la fin
Avec Azure Developer CLI installé, vous pouvez déployer un exemple d’application entièrement configuré présenté dans ce tutoriel et le voir s’exécuter dans Azure. Exécutez simplement les commandes suivantes dans un répertoire de travail vide :
azd auth login
azd init --template msdocs-flask-postgresql-sample-app
azd up
Exemple d’application
Des exemples d’applications Python utilisant l’infrastructure Flask et Django sont fournis pour vous aider à suivre ce tutoriel. Pour les déployer sans les exécuter localement, ignorez cette partie.
Pour lancer l’application localement, assurez-vous que Python 3.7 ou version ultérieure et PostgreSQL sont installés localement. Ensuite, clonez la branche starter-no-infra
de l’exemple de référentiel et passez à la racine de référentiel.
git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
cd msdocs-flask-postgresql-sample-app
Créez un fichier .env comme montré ci-dessous en utilisant le fichier .env.sample comme guide. Définissez la valeur de DBNAME
sur le nom d’une base de données existante dans votre instance PostgreSQL locale. Définissez les valeurs de DBHOST
, DBUSER
et DBPASS
en fonction de votre instance PostgreSQL locale.
DBNAME=<database name>
DBHOST=<database-hostname>
DBUSER=<db-user-name>
DBPASS=<db-password>
Créez un environnement virtuel pour l’application :
py -m venv .venv
.venv\scripts\activate
Installez les dépendances :
pip install -r requirements.txt
Exécutez l’exemple d’application avec la commande suivante :
# Run database migration
flask db upgrade
# Run the app at http://127.0.0.1:5000
flask run
1. Créer les instances App Service et PostgreSQL
Dans cette étape, vous créez les ressources Azure. La procédure indiquée dans ce tutoriel permet de créer un ensemble de ressources sécurisées par défaut qui incluent App Service et Azure DB pour PostgreSQL. Pour le processus de création, vous devez spécifier :
- Le nom de l’application web. Il s’agit du nom utilisé dans le cadre du nom DNS de votre application web sous la forme
https://<app-name>.azurewebsites.net
. - La Région du monde où l’application sera physiquement exécutée.
- La Pile du runtime de l’application. C’est là que vous sélectionnez la version de Python à utiliser pour votre application.
- Le Plan d’hébergement de l’application. Il s’agit du niveau tarifaire qui inclut l’ensemble des fonctionnalités et la scalabilité de l’application.
- Le groupe de ressources pour l’application. Un groupe de ressources vous permet de regrouper (dans un conteneur logique) toutes les ressources Azure nécessaires à l’application.
Connectez-vous au portail Azure et procédez comme suit pour créer vos ressources Azure App Service.
Étape 1 : Dans le Portail Azure :
- Entrez « base de données d’application web » dans la barre de recherche située en haut du portail Azure.
- Sélectionnez l’élément intitulé Application web + Base de données sous le titre Place de marché. Vous pouvez également accéder directement à l’Assistant de création.
Étape 2 : Dans la page Créer une application web + base de données, remplissez le formulaire comme suit.
- Groupe de ressources → Sélectionnez Créer et utilisez le nom msdocs-python-postgres-tutorial.
- Région → Toute région Azure près de chez vous.
- Nom → msdocs-python-postgres-XYZ, où XYZ est un ensemble de trois caractères aléatoires quelconques. Ce nom doit être unique au sein d’Azure.
- Runtime stack → Python 3.10.
- Base de données → PostgreSQL - Serveur Flexible est sélectionné par défaut comme moteur de base de données. Les noms du serveur et de la base de données sont aussi définis par défaut sur les valeurs appropriées.
- Plan d’hébergement → De base. Vous pourrez ultérieurement effectuer un scale-up vers un niveau tarifaire de production.
- Sélectionnez Revoir + créer.
- Une fois la validation terminée, sélectionnez Créer.
Étape 3 : Le déploiement prend quelques minutes. Une fois le déploiement terminé, sélectionnez le bouton Accéder à la ressource. L’application App Service s’ouvre automatiquement, mais les ressources suivantes sont créées :
- Groupe de ressources → Conteneur pour toutes les ressources créées.
- Plan App Service → Définit les ressources de calcul pour App Service. Un plan Linux est créé sur le niveau De base.
- App Service → Représente votre application et s’exécute dans le plan App Service.
- Réseau virtuel → Intégré à l’application App Service, isole le trafic réseau principal.
- Azure Database pour PostgreSQL - Serveur flexible → Accessible uniquement à partir du réseau virtuel. Une base de données et un utilisateur sont créés pour vous sur le serveur.
- Zone DNS privée → active la résolution DNS du serveur PostgreSQL dans le réseau virtuel.
2. Vérifier les paramètres de connexion
L’assistant de création a généré les variables de connectivité pour vous déjà en tant que paramètres d’application. Les paramètres d’application sont un moyen de préserver les secrets de connexion hors de votre référentiel de code. Lorsque vous êtes prêt à déplacer vos secrets vers un emplacement plus sécurisé, voici un article concernant le stockage dans Azure Key Vault.
Étape 1 : Dans le menu de gauche de la page App Service, sélectionnez Configuration.
Étape 2 : Dans l’onglet Paramètres de l’application de la page Configuration, vérifiez que AZURE_POSTGRESQL_CONNECTIONSTRING
est présent. Ce sera injecté dans l’environnement runtime en tant que variable d’environnement.
Étape 3 : À l’invite du terminal ou de commandes, exécutez le script Python suivant pour générer un secret unique : python -c 'import secrets; print(secrets.token_hex())'
. Copiez la valeur de sortie pour l’utiliser à l’étape suivante.
3. Déployer l’exemple de code
Dans cette étape, vous allez configurer le déploiement GitHub avec GitHub Actions. Cette méthode fait partie des nombreuses façons de déployer sur App Service, mais elle permet également de bénéficier d’une intégration continue dans votre processus de déploiement. Par défaut, chaque git push
dans votre dépôt GitHub lance l’action de build et de déploiement.
Étape 1 : Dans une nouvelle fenêtre de navigateur :
- Connectez-vous à votre compte GitHub.
- Accédez à https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.
- Sélectionnez Fork.
- Sélectionnez Créer la duplication.
Étape 2 : Dans la page GitHub, ouvrez Visual Studio Code dans le navigateur en appuyant sur la touche .
.
Étape 3 :Dans Visual Studio Code, ouvrez azureproject/production.py dans l’explorateur. Consultez les variables d’environnement utilisées dans l’environnement de production, notamment les paramètres d’application que vous avez vus dans la page de configuration.
Étape 4 : De retour dans la page App Service, sélectionnez Centre de déploiement dans le menu de gauche.
Étape 5 : Dans la page Centre de déploiement :
- Dans Source, sélectionnez GitHub. Par défaut, GitHub Actions est sélectionné en tant que fournisseur de build.
- Connectez-vous à votre compte GitHub et suivez l’invite pour autoriser Azure.
- Dans Organisation, sélectionnez votre compte.
- Dans Référentiel, sélectionnez msdocs-flask-postgresql-sample-app.
- Dans Branche, sélectionnez principal.
- Conservez l’option sélectionnée par défaut pour Ajouter un flux de travail.
- Sous Type d’authentification, sélectionnez Identité affectée par l’utilisateur.
- Dans le menu principal, sélectionnez Enregistrer. App Service valide un fichier de flux de travail dans le référentiel GitHub choisi, au sein du répertoire
.github/workflows
.
Étape 6 : Dans la page Centre de déploiement :
- Sélectionnez Journaux d’activité. Une exécution de déploiement a déjà démarré.
- Dans l’élément de journal de l’exécution du déploiement, sélectionnez Générer/Déployer des journaux.
Étape 7 : Vous êtes dirigé vers votre référentiel GitHub où vous voyez que l’action GitHub est en cours d’exécution. Le fichier de workflow définit deux étapes distinctes : la build et le déploiement. Attendez que l’exécution de GitHub affiche l’état Terminé. Cela prend environ 5 minutes.
Vous rencontrez des problèmes ? Consultez le Guide de résolution des problèmes.
4. Générer le schéma de la base de données
Avec la base de données PostgreSQL protégée par le réseau virtuel, le moyen le plus simple d’exécuter les migrations de base de données Flask est de le faire dans une session SSH avec le conteneur App Service.
Étape 1 : De retour dans la page App Service, dans le menu de gauche,
- Sélectionnez SSH.
- Sélectionnez Go.
Étape 2 : Dans le terminal SSH, exécutez flask db upgrade
. Si cela réussit, App Service se connecte avec succès à la base de données.
Seules les modifications apportées aux fichiers dans /home
peuvent être conservées au-delà des redémarrages d’application. Les modifications effectuées en dehors de /home
ne sont pas conservées.
5. Accéder à l’application
Étape 1 : Dans la page App Service :
- Dans le menu de gauche, sélectionnez Vue d’ensemble.
- Sélectionnez l’URL de votre application. Vous pouvez également naviguer directement vers
https://<app-name>.azurewebsites.net
.
Étape 2 : Ajoutez quelques restaurants à la liste. Félicitations, vous exécutez une application web Flask dans Azure App Service, avec une connectivité sécurisée vers Azure Database pour PostgreSQL.
6. Diffuser les journaux de diagnostic
Azure App Service capture tous les messages qui s’affichent sur la console pour vous aider à diagnostiquer les problèmes liés à votre application. L’exemple d’application inclut des instructions print()
pour montrer cette fonctionnalité, comme ci-dessous.
@app.route('/', methods=['GET'])
def index():
print('Request for index page received')
restaurants = Restaurant.query.all()
return render_template('index.html', restaurants=restaurants)
Étape 1 : Dans la page App Service :
- Dans le menu de gauche, sélectionnez Journaux App Service.
- Sous Application Logging, sélectionnez Système de fichiers.
- Dans le menu principal, sélectionnez Enregistrer.
Étape 2 : Dans le menu de gauche, sélectionnez Flux de journaux. Les journaux de votre application (notamment les journaux de plateforme et ceux issus de l’intérieur du conteneur) apparaissent.
Apprenez-en davantage sur la journalisation dans les applications Python dans la série sur la configuration d’Azure Monitor pour votre application Python.
7. Nettoyer les ressources
Lorsque vous avez terminé, vous pouvez supprimer toutes les ressources de votre abonnement Azure en supprimant le groupe de ressources.
Étape 1 : Dans la barre de recherche située en haut du Portail Microsoft Azure :
- Entrez le nom du groupe de ressources.
- Sélectionnez le groupe de ressources.
Étape 2 : Sur la page Groupe de ressources, sélectionnez Supprimer un groupe de ressources.
Étape 3 :
- Entrer le nom du groupe de ressources pour confirmer la suppression.
- Sélectionnez Supprimer.
1. Créer des ressources Azure et déployer un exemple d’application
Dans cette étape, vous allez créer les ressources Azure et déployer un exemple d’application dans App Service sur Linux. La procédure indiquée dans ce tutoriel permet de créer un ensemble de ressources sécurisées par défaut qui incluent App Service et Azure DB pour PostgreSQL.
Si ce n’est déjà fait, clonez la branche
starter-no-infra
de l’exemple de référentiel dans un terminal local.git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app cd msdocs-flask-postgresql-sample-app
Cette branche clonée est votre point de départ. Il contient une simple application Flask de lecteur de données.
Depuis la racine du référentiel, exécutez
azd init
.azd init --template python-app-service-postgresql-infra
Lorsque vous y êtes invité, fournissez les réponses suivantes :
Question Réponse Le répertoire actif n’est pas vide. Voulez-vous initialiser un projet ici dans «<votre-répertoire>» ? Y Que souhaitez-vous faire de ces fichiers ? Conserver mes fichiers existants inchangés Entrer un nom pour le nouvel environnement Tapez un nom unique. Le modèle azd utilise ce nom dans le cadre du nom DNS de votre application web dans Azure ( <app-name>.azurewebsites.net
). Les caractères alphanumériques et les traits d’union sont autorisés.Exécutez la commande
azd up
pour provisionner les ressources Azure nécessaires et déployer le code de l’application. Si vous n’êtes pas déjà connecté à Azure, le navigateur s’ouvre et vous y invite. La commandeazd up
vous invite également à sélectionner l’abonnement et l’emplacement souhaités sur lesquels effectuer le déploiement.azd up
L’exécution de la commande
azd up
peut prendre quelques instants. Il compile et déploie également le code de votre application, mais vous allez modifier votre code ultérieurement pour utiliser App Service. Pendant son exécution, la commande fournit des messages sur le processus d’approvisionnement et de déploiement, y compris un lien vers le déploiement dans Azure. Une fois l’opération terminée, la commande affiche également un lien vers l’application de déploiement.Ce modèle azd contient des fichiers (azure.yaml et le répertoire infra) qui génèrent une architecture sécurisée par défaut avec les ressources Azure suivantes :
- Groupe de ressources → Conteneur pour toutes les ressources créées.
- Plan App Service → Définit les ressources de calcul pour App Service. Un plan Linux est spécifié dans le niveau B1.
- App Service → Représente votre application et s’exécute dans le plan App Service.
- Réseau virtuel → Intégré à l’application App Service, isole le trafic réseau principal.
- Azure Database pour PostgreSQL - Serveur flexible → Accessible uniquement à partir du réseau virtuel. Une base de données et un utilisateur sont créés pour vous sur le serveur.
- Zone DNS privée → active la résolution DNS du serveur PostgreSQL dans le réseau virtuel.
- L’espace de travail Log Analytics → agit comme le conteneur cible de votre application pour expédier ses journaux d’activité, dans lequel vous pouvez également interroger les journaux.
2. Utiliser la chaîne de connexion de base de données
Le modèle azd utilisé a généré les variables de connectivité pour vous en tant que paramètres d’application et les restitue sur le terminal pour plus de facilité. Les paramètres d’application sont un moyen de préserver les secrets de connexion hors de votre référentiel de code.
Dans la sortie azd, retrouvez les paramètres de l’application et les paramètres
AZURE_POSTGRESQL_CONNECTIONSTRING
etAZURE_REDIS_CONNECTIONSTRING
. Pour préserver la sécurité des secrets, seuls les noms des paramètres sont affichés. Ils ressemblent à ceci dans la sortie azd :App Service app has the following settings: - AZURE_POSTGRESQL_CONNECTIONSTRING - AZURE_REDIS_CONNECTIONSTRING - FLASK_DEBUG - SCM_DO_BUILD_DURING_DEPLOYMENT - SECRET_KEY
AZURE_POSTGRESQL_CONNECTIONSTRING
contient la chaîne de connexion vers la base de données Postgres dans Azure etAZURE_REDIS_CONNECTIONSTRING
contient la chaîne de connexion vers le cache Redis dans Azure. Vous devez les utiliser dans votre code pour vous y connecter. Ouvrez azureproject/production.py, supprimez les marques de commentaire dans les lignes suivantes et enregistrez le fichier :conn_str = os.environ['AZURE_POSTGRESQL_CONNECTIONSTRING'] conn_str_params = {pair.split('=')[0]: pair.split('=')[1] for pair in conn_str.split(' ')} DATABASE_URI = 'postgresql+psycopg2://{dbuser}:{dbpass}@{dbhost}/{dbname}'.format( dbuser=conn_str_params['user'], dbpass=conn_str_params['password'], dbhost=conn_str_params['host'], dbname=conn_str_params['dbname'] )
Votre code d’application est désormais configuré pour se connecter à la base de données PostgreSQL dans Azure. Si vous le souhaitez, ouvrez
app.py
et voyez comment la variable d’environnementDATABASE_URI
est utilisée.Dans le terminal, exécutez
azd deploy
.azd deploy
4. Générer le schéma de la base de données
Avec la base de données PostgreSQL protégée par le réseau virtuel, le moyen le plus simple d’exécuter les migrations de base de données Flask est de le faire dans une session SSH avec le conteneur App Service.
Dans la sortie azd, retrouvez l’URL de la session SSH et accédez-y dans le navigateur. Cela ressemble à ceci dans la sortie :
Open SSH session to App Service container at: https://<app-name>.scm.azurewebsites.net/webssh/host
Dans le terminal SSH, exécutez
flask db upgrade
. Si cela réussit, App Service se connecte avec succès à la base de données.Remarque
Seules les modifications apportées aux fichiers dans
/home
peuvent être conservées au-delà des redémarrages d’application. Les modifications effectuées en dehors de/home
ne sont pas conservées.
5. Accéder à l’application
Dans la sortie azd, retrouvez l’URL de votre application et accédez-y dans le navigateur. L’URL ressemble à ceci dans la sortie AZD :
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: https://<app-name>.azurewebsites.net/
Ajoutez quelques restaurants à la liste.
Félicitations, vous exécutez une application web Flask dans Azure App Service, avec une connectivité sécurisée vers Azure Database pour PostgreSQL.
6. Diffuser les journaux de diagnostic
Azure App Service peut capturer les journaux de la console pour vous aider à diagnostiquer les problèmes liés à votre application. Pour plus de facilité, le modèle azd a déjà activé la journalisation sur le système de fichiers local, ainsi que leur expédition vers un espace de travail Log Analytics.
L’exemple d’application contient des instructions print()
pour montrer cette fonctionnalité, comme illustré dans l’extrait suivant.
@app.route('/', methods=['GET'])
def index():
print('Request for index page received')
restaurants = Restaurant.query.all()
return render_template('index.html', restaurants=restaurants)
Dans la sortie azd, retrouvez le lien pour diffuser en continu les journaux App Service et accédez-y dans le navigateur. Le lien ressemble à ceci dans la sortie azd :
Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream
Apprenez-en davantage sur la journalisation dans les applications Python dans la série sur la configuration d’Azure Monitor pour votre application Python.
7. Nettoyer les ressources
Pour supprimer toutes les ressources Azure dans le présent environnement de déploiement, exécutez azd down
.
azd down
Résolution des problèmes
Vous allez trouver ci-dessous les problèmes que vous pouvez rencontrer lorsque vous travaillez avec ce tutoriel et les étapes à suivre pour les résoudre.
Je n’arrive pas à me connecter à la session SSH
Si vous ne pouvez pas vous connecter à la session SSH, c’est que l’application elle-même n’a pas pu démarrer. Pour plus d’informations, consultez les journaux de diagnostic. Par exemple, si vous voyez une erreur du type KeyError: 'AZURE_POSTGRESQL_CONNECTIONSTRING'
, cela peut signifier que la variable d’environnement est manquante (vous pouvez avoir supprimé le paramètre de l’application).
Je reçois une erreur lors de l’exécution des migrations de bases de données
Si vous rencontrez des erreurs liées en lien avec la connexion à la base de données, vérifiez si les paramètres de l’application (AZURE_POSTGRESQL_CONNECTIONSTRING
) ont été modifiés. Sans cette chaîne de connexion, la commande de migration ne peut pas communiquer avec la base de données.
Forum aux questions
- Quel est le coût de cette configuration ?
- Comment se connecter au serveur PostgreSQL sécurisé derrière le réseau virtuel avec d’autres outils ?
- Comment le développement d’applications locales fonctionne-t-il avec GitHub Actions ?
- Comment l’exemple Django est-il configuré pour fonctionner sur Azure App Service ?
Quel est le coût de cette configuration ?
Le prix des ressources créées est calculé comme suit :
- Le plan App Service est créé au niveau De base. Il peut faire l’objet d’un scale-up ou d’un scale-down. Consultez la tarification App Service.
- Le serveur flexible PostgreSQL est créé dans le plus bas niveau burstable Standard_B1ms, avec la taille minimale de stockage qui peut être augmentée ou diminuée. Consultez Tarifs d’Azure Database pour PostgreSQL.
- Le réseau virtuel n’entraîne pas de frais, sauf si vous configurez des fonctionnalités supplémentaires, telles que le peering. Consultez Tarification du réseau virtuel Azure.
- La zone DNS privée entraîne des frais minimes. Consultez la tarification d’Azure DNS.
Comment se connecter au serveur PostgreSQL sécurisé derrière le réseau virtuel avec d’autres outils ?
- Pour un accès de base à partir d’un outil en ligne de commande, vous pouvez exécuter
psql
à partir du terminal SSH de l’application. - Pour vous connecter à partir d’un outil de bureau, votre ordinateur doit se trouver dans le réseau virtuel. Par exemple, il peut s’agir d’une machine virtuelle Azure connectée à l’un des sous-réseaux ou d’une machine dans un réseau local disposant d’une connexion VPN de site à site avec le réseau virtuel Azure.
- Vous pouvez également intégrer Azure Cloud Shell au réseau virtuel.
Comment le développement d’applications locales fonctionne-t-il avec GitHub Actions ?
Grâce au fichier de flux de travail généré automatiquement à partir d’App Service comme exemple, chaque git push
démarre une nouvelle exécution de build et de déploiement. À partir d’un clone local du référentiel GitHub, vous effectuez les mises à jour souhaitées et poussez vers GitHub. Par exemple :
git add .
git commit -m "<some-message>"
git push origin main
Comment l’exemple Django est-il configuré pour fonctionner sur Azure App Service ?
Notes
Si vous suivez ce tutoriel avec votre propre application, consultez la description du fichier requirements.txt dans le fichier README.md de chaque projet (Flask, Django) pour voir les packages dont vous aurez besoin.
L’exemple d’application Django configure les paramètres dans le fichier azureproject/production.py afin qu’il puisse s’exécuter dans Azure App Service. Ces modifications sont courantes pour déployer Django en production et non spécifiques à App Service.
Django valide l’en-tête HTTP_HOST dans les requêtes entrantes. L’exemple de code utilise la variable d’environnement
WEBSITE_HOSTNAME
dans App Service pour ajouter le nom de domaine de l’application au paramètre ALLOWED_HOSTS de Django.# Configure the domain name using the environment variable # that Azure automatically creates for us. ALLOWED_HOSTS = [os.environ['WEBSITE_HOSTNAME']] if 'WEBSITE_HOSTNAME' in os.environ else []
Django ne prend pas en charge le traitement des fichiers statiques en production. Pour ce tutoriel, vous utilisez WhiteNoise pour permettre le traitement des fichiers. Le package WhiteNoise a déjà été installé avec requirements.txt, et son intergiciel est ajouté à la liste.
# WhiteNoise configuration MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', # Add whitenoise middleware after the security middleware 'whitenoise.middleware.WhiteNoiseMiddleware',
Ensuite, les paramètres de fichier statique sont configurés en fonction de la documentation Django.
SESSION_ENGINE = "django.contrib.sessions.backends.cache" STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
Pour plus d’informations, consultez Paramètres de production des applications Django.
Étapes suivantes
Passez au tutoriel suivant pour apprendre à sécuriser votre application avec un domaine personnalisé et un certificat.
Découvrez comment App Service exécute une application Python :