Générer et déployer une application web Python avec Azure Container Apps et PostgreSQL
Cet article fait partie d’un tutoriel qui explique comment conteneuriser et déployer une application web Python sur Azure Container Apps. Container Apps vous permet de déployer des applications conteneurisées sans avoir à gérer une infrastructure complexe.
Cette partie du tutoriel explique comment conteneuriser et déployer un exemple d’application web Python (Django ou Flask). Plus précisément, vous générez l’image conteneur dans le cloud et vous la déployez dans Azure Container Apps. Vous définissez des variables d’environnement qui permettent à l’application conteneur de se connecter à une instance Azure Database pour PostgreSQL - Serveur flexible, où l’exemple d’application stocke les données.
Ce diagramme de service met en lumière les composants abordés dans cet article : création et déploiement d’une image conteneur.
Obtenir l’exemple d’application
Dupliquer et cloner l’exemple de code dans votre environnement de développement.
Étape 1. Accédez au dépôt GitHub de l’exemple d’application (Django ou Flask), puis sélectionnez Dupliquer.
Suivez les étapes de duplication du répertoire sur votre compte GitHub. Vous pouvez également télécharger le dépôt de code directement sur votre ordinateur local sans duplication ni compte GitHub, mais vous ne pourrez pas configurer les pipelines CI/CD abordés plus loin dans le tutoriel.
Étape 2. Utilisez la commande git clone pour cloner le dépôt dupliqué dans le dossier python-container :
# Django
git clone https://github.com/$USERNAME/msdocs-python-django-azure-container-apps.git python-container
# Flask
# git clone https://github.com/$USERNAME/msdocs-python-flask-azure-container-apps.git python-container
Étape 3. Modifier le répertoire.
cd python-container
Créer une image conteneur à partir du code de l’application web
Après avoir appliqué ces étapes, vous disposez d’un registre de conteneurs Azure qui contient une image conteneur Docker générée à partir de l’exemple de code.
Les commandes Azure CLI peuvent être exécutées dans Azure Cloud Shell ou sur une station de travail dans laquelle l’interface Azure CLI est installée.
Étape 1. Créez un groupe de ressources avec la commande az group create.
az group create \
--name pythoncontainer-rg \
--location <location>
<location> est l’une des valeurs du Name de l’emplacement Azure issue de la commande az account list-locations -o table
.
Étape 2. Créez un registre de conteneurs avec la commande az acr create.
az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled
<registry-name> doit être unique dans Azure et contenir entre 5 et 50 caractères alphanumériques.
Vous pouvez afficher les informations d’identification créées pour l’administrateur avec :
az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg
Étape 3. Connectez-vous au registre avec la commande az acr login.
az acr login --name <registry-name>
La commande ajoute «azurecr.io » au nom pour créer le nom complet du registre. Si l’opération réussit, le message « Connexion réussie » s’affiche. Si vous accédez au registre à partir d’un abonnement différent de celui dans lequel le registre a été créé, utilisez le commutateur --suffix
.
Étape 4. Créez l’image avec la commande az acr build.
az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .
Notez les points suivants :
Le point (« . ») à la fin de la commande indique l’emplacement du code source à générer. Si vous n’exécutez pas cette commande dans le répertoire racine de l’exemple d’application, spécifiez le chemin d’accès au code.
Si vous exécutez la commande dans Azure Cloud Shell, utilisez
git clone
pour commencer par extraire le dépôt dans l’environnement Cloud Shell et modifier le répertoire dans la racine du projet afin que le point (« . ») soit interprété correctement.Si vous ne laissez pas l’option
-t
(identique à--image
), la commande met en file d’attente une build de contexte local sans l’envoyer au registre. La génération sans envoi peut s’avérer utile pour vérifier que l’image est générée.
Étape 5. Vérifiez que l’image conteneur a été créée avec la commande az acr repository list.
az acr repository list --name <registry-name>
Créer une instance de serveur flexible PostgreSQL
L’exemple d’application (Django ou Flask) stocke les données des avis sur le restaurant dans une base de données PostgreSQL. En suivant ces étapes, vous créez le serveur qui contiendra la base de données.
Les commandes Azure CLI peuvent être exécutées dans Azure Cloud Shell ou sur une station de travail dans laquelle l’interface Azure CLI est installée.
Étape 1. Utilisez la commande az postgres flexible-server create pour créer un serveur PostgreSQM dans Azure. Il n’est pas rare que l’exécution de cette commande prenne quelques minutes.
az postgres flexible-server create \
--resource-group pythoncontainer-rg \
--name <postgres-server-name> \
--location <location> \
--admin-user <admin-username> \
--admin-password <admin-password> \
--sku-name Standard_D2s_v3 \
--public-access 0.0.0.0
« pythoncontainer-rg » → Le nom du groupe de ressources utilisé dans ce tutoriel. Si vous avez utilisé un autre nom, changez cette valeur.
<postgres-server-name> → Nom du serveur de base de données PostgreSQL. Ce nom doit être unique au sein d’Azure. Le point de terminaison du serveur est « https://<postgres-server-name>.postgres.database.azure.com ». Les caractères autorisés sont « A »-« Z », « 0 »-« 9 » et « - ».
<location> → Utilisez l’emplacement que vous avez utilisé pour l’application web. <location> est l’une des valeurs du Name de l’emplacement Azure issue de la commande
az account list-locations -o table
.<admin-username> → Nom d’utilisateur du compte administrateur. Il ne peut pas être « azure_superuser » (superutilisateur_azure), « admin », « administrator » (administrateur), « root » (racine), « guest » (invité) ni « public ». Pour ce tutoriel, utilisez « demoadmin ».
<admin-password> → Mot de passe de l’utilisateur administrateur. Il 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.
Important
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.
<sku-name>
→ Nom du niveau tarifaire et de la configuration de calcul, par exemple « Standard_D2s_v3 ». Pour plus d’informations, consultez Niveaux tarifaires d’Azure Database pour PostgreSQL. Utilisezaz postgres flexible-server list-skus --location <location>
pour répertorier les références SKU disponibles.<public-access>
→ Utilisez « 0.0.0.0.0 », qui permet l’accès public au serveur à partir de n’importe quel service Azure, tel que Container Apps.
Remarque
Si vous avez l’intention d’utiliser le serveur PostgreSQL depuis votre poste de travail local avec des outils autres qu’Azure CLI, vous devrez ajouter une règle de pare-feu à l’aide de la commande az postgres flexible-server firewall-rule create.
Créer une base de données sur le serveur
À ce stade, vous disposez d’un serveur PostgreSQL. Dans cette section, vous allez créer une base de donnée sur le serveur.
Vous pouvez utiliser le terminal interactif PostgreSQL psql dans votre environnement local ou dans Azure Cloud Shell, qui est également accessible dans le portail Azure. Lorsque vous travaillez avec psql, il est souvent plus facile d’utiliser Cloud Shell, car toutes les dépendances sont incluses pour vous dans l’interpréteur de commandes.
Étape 1. Se connecter à la base de données avec psql.
psql --host=<postgres-server-name>.postgres.database.azure.com \
--port=5432 \
--username=demoadmin@<postgres-server-name> \
--dbname=postgres
Où <postgres-server-name> est le nom du serveur PostgreSQL. La commande vous demandera le mot de passe administrateur.
Si vous rencontrez des problèmes de connexion, redémarrez la base de données, puis réessayez. Si vous vous connectez à partir de votre environnement local, il faut ajouter votre adresse IP à la liste des règles de pare-feu pour le service de base de données.
Étape 2. Créez la base de données.
Dans l’invite postgres=>
, saisissez :
CREATE DATABASE restaurants_reviews;
Le point-virgule (« ; ») à la fin de la commande est nécessaire. Pour vérifier que la base de donnée a bien été créée, utilisez la commande \c restaurants_reviews
. Tapez \?
pour afficher l’aide ou \q
pour quitter.
Vous pouvez également vous connecter au serveur flexible Azure PostgreSQL et créer une base de données avec Azure Data Studio ou un autre IDE prenant en charge PostgreSQL.
Déployer une application Web sur Container Apps
Les applications conteneur sont déployées dans des environnements Container Apps, qui font office de limite sécurisée. Dans les étapes suivantes, vous allez créer l’environnement, un conteneur à l’intérieur de l’environnement et configurer le conteneur afin que le site Web soit visible en externe.
Étape 1. Connectez-vous à Azure et authentifiez-vous, si nécessaire.
az login
Étape 2. Installez ou mettez à niveau l’extension pour Azure Container Apps avec la commande az extension add.
az extension add --name containerapp --upgrade
Étape 3. Créez un environnement Container Apps avec la commande az containerapp env create.
az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>
<location> est l’une des valeurs du Name de l’emplacement Azure issue de la commande az account list-locations -o table
.
Étape 4. Obtenez les informations d’identification de connexion pour Azure Container Registry.
az acr credential show -n <registry-name>
Utilisez le nom d’utilisateur et l’un des mots de passe renvoyés à partir de la sortie de la commande.
Étape 5. Créez une application conteneur dans l’environnement avec la commande az containerapp create.
az containerapp create \
--name python-container-app \
--resource-group pythoncontainer-rg \
--image <registry-name>.azurecr.io/pythoncontainer:latest \
--environment python-container-env \
--ingress external \
--target-port 8000 \
--registry-server <registry-name>.azurecr.io \
--registry-username <registry-username> \
--registry-password <registry-password> \
--env-vars <env-variable-string>
--query properties.configuration.ingress.fqdn
<env-variable-string> est une chaîne composée de valeurs séparées par des espaces au format key="value" avec les valeurs suivantes.
- AZURE_POSTGRESQL_HOST=<postgres-server-name>.postgres.database.azure.com
- AZURE_POSTGRESQL_DATABASE=restaurants_reviews
- AZURE_POSTGRESQL_USERNAME=demoadmin
- AZURE_POSTGRESQL_PASSWORD=<db-password>
- RUNNING_IN_PRODUCTION=1
- AZURE_SECRET_KEY=<YOUR-SECRET-KEY>
Générez une valeur AZURE_SECRET_KEY
à l’aide de la sortie de python -c 'import secrets; print(secrets.token_hex())'
.
Voici un exemple : --env-vars AZURE_POSTGRESQL_HOST="my-postgres-server.postgres.database.azure.com" AZURE_POSTGRESQL_DATABASE="restaurants_reviews" AZURE_POSTGRESQL_USERNAME="demoadmin" AZURE_POSTGRESQL_PASSWORD="somepassword" RUNNING_IN_PRODUCTION="1" AZURE_SECRET_KEY=asdfasdfasdf
.
Étape 7. Pour Django uniquement, migrez et créez un schéma de base de données. (Dans l’exemple d’application Flask, cela se fait automatiquement et vous pouvez ignorer cette étape.)
Connectez-vous avec la commande az containerapp exec :
az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg
Puis, à l’invite de la commande shell, saisissez python manage.py migrate
.
Vous n’avez pas besoin de migrer pour les révisions du conteneur.
Étape 8 : Tester le site web.
La commande az containerapp create
que vous avez saisie précédemment génère une URL d’application que vous pouvez utiliser pour accéder à l’application. L’URL se termine par « azurecontainerapps.io ». Accédez à l’URL dans un navigateur Web. Vous pouvez également utiliser la commande az containerapp browse .
Voici un exemple de site Web après l’ajout d’un restaurant et de deux avis.
Résoudre les problèmes de déploiement
Vous avez oublié l’URL de l’application pour accéder au site Web.
- Dans le portail Azure, accédez à la page Vue d’ensemble de l’application conteneur et recherchez URL de l’application.
- Dans VS Code, accédez à la vue Azure (Ctrl+Maj+A) et développez l’abonnement dans lequel vous travaillez. Développez le nœud Container Apps, puis développez l’environnement managé, cliquez avec le bouton droit sur python-container-app et sélectionnez Parcourir. Le navigateur s’ouvre avec l’URL de l’application.
- Avec Azure CLI, utilisez la commande
az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn
.
Dans VS Code, la tâche Générer une image dans Azure renvoie une erreur.
- Si le message « Erreur : échec du téléchargement du contexte » s’affiche. Vérifiez si l’URL est erronée» dans la fenêtre Sortie de VS Code, puis actualisez le registre dans l’extension Docker. Pour actualiser, sélectionnez l’extension Docker, accédez à la section Registres, recherchez le registre et sélectionnez-le.
- Si vous exécutez à nouveau la tâche Générer une image dans Azure, assurez-vous que le registre de l’exécution précédente existe et, si c’est le cas, utilisez-le.
Dans le portail Azure, lors de la création d’une application conteneur, vous voyez une erreur d’accès qui contient « Impossible d’accéder à ACR ’<name>.azurecr.io’ ».
- Cette erreur se produit lorsque les informations d’identification de l’administrateur sur l’ACR sont désactivées. Pour vérifier l’état de l’administrateur dans le portail, accédez à votre registre de Azure Container Registry, sélectionnez la ressource Clés d’accès et vérifiez que l’Utilisateur administrateur est activé.
Votre image conteneur n’apparaît pas dans Azure Container Registry.
- Vérifiez la sortie de la commande Azure CLI ou de la sortie VS Code, et recherchez les messages pour confirmer le succès.
- Assurez-vous que le nom du registre a été spécifié correctement dans votre commande build avec Azure CLI ou dans les invites de tâche VS Code.
- Assurez-vous que vos informations d’identification n’ont pas expiré. Par exemple, dans VS Code, recherchez le registre cible dans l’extension Docker et actualisez. Dans Azure CLI, exécutez
az login
.
Le site Web renvoie « Demande incorrecte (400) ».
- Vérifiez les variables d’environnement PostgreSQL transmises au conteneur. L’erreur 400 indique souvent que le code Python ne peut pas se connecter à l’instance PostgreSQL.
- L’exemple de code utilisé dans ce tutoriel vérifie l’existence de la variable d’environnement de conteneur
RUNNING_IN_PRODUCTION
, qui peut être définie sur n’importe quelle valeur comme « 1 ».
Le site Web renvoie « Introuvable (404) ».
- Vérifiez l’URL de l’application sur la page Vue d’ensemble du conteneur. Si l’URL de l’application contient le mot « interne », l’entrée n’est pas définie correctement.
- Examinez l’entrée du conteneur. Par exemple, dans le portail Azure, accédez à la ressource Entrée du conteneur et vérifiez que l’Entrée HTTP est activée et que Acceptation du trafic provenant de partout est sélectionnée.
Le site Web ne s’ouvre pas, vous voyez « expiration du flux » ou rien n’est renvoyé.
- Consultez les journaux.
- Dans le portail Azure, accédez à la ressource de gestion des révisions de l’application conteneur et vérifiez l’état du provisionnement du conteneur.
- Si vous voyez « Provisionnement », attendez que le provisionnement soit terminé.
- Si vous voyez « Échec », sélectionnez la révision et affichez les journaux de la console. Choisissez l’ordre des colonnes pour afficher « Heure générée », « Stream_s » et « Log_s ». Triez les journaux par ordre d’ancienneté et recherchez les messages Python stderr et stdout dans la colonne « Stream_s ». La sortie Python « print » sera des messages stdout.
- Avec Azure CLI, utilisez la commande az containerapp logs show.
- Dans le portail Azure, accédez à la ressource de gestion des révisions de l’application conteneur et vérifiez l’état du provisionnement du conteneur.
- Si vous utilisez l’infrastructure Django, vérifiez si les tables restaurants_reviews existent dans la base de données. Dans le cas contraire, utilisez une console pour accéder au conteneur et exécuter
python manage.py migrate
.
- Consultez les journaux.