Générer et déployer une application web Python avec Azure Container Apps et PostgreSQL

Cet article fait partie d’un tutoriel sur la façon de conteneuriser et de déployer une application web Python sur Azure Container Apps. Container Apps vous permet de déployer des applications conteneurisées sans gérer une infrastructure complexe.

Dans cette partie du tutoriel, vous allez apprendre à 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 déployez-la dans Azure Container Apps. Vous définissez des variables d’environnement qui permettent à l’application conteneur de se connecter à une instance de serveur flexible Azure Database pour PostgreSQL, où l’exemple d’application stocke les données.

Ce diagramme de service met en évidence les composants abordés dans cet article : création et déploiement d’une image conteneur.

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Section highlighted is what is covered in this article.

Obtenir l’exemple d’application

Fork et clonez 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 Fork.

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 entrée manuscrite ni compte GitHub. Toutefois, vous ne pourrez pas configurer CI/CD abordé plus loin dans le tutoriel.

Étape 2. Utilisez la commande git clone pour cloner le référentiel 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. Modifiez le répertoire.

cd python-container

Créer une image conteneur à partir du code de l’application web

Après avoir suivi ces étapes, vous disposez d’azure Container Registry 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>

<l’emplacement> est l’une des valeurs Nom de l’emplacement Azure à partir de la sortie 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

<le nom> du registre doit être unique dans Azure et contenir 5 à 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 à l’aide de la commande az acr login .

az acr login --name <registry-name>

La commande ajoute « azurecr.io » au nom pour créer le nom de Registre complet. Si elle 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 --suffix commutateur.

Étape 4. Générez 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 l’exemple de répertoire racine de l’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 en premier et modifier le répertoire à 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 création sans envoi (push) peut être utile pour case activée que l’image génère.

É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 de révision des restaurants dans une base de données PostgreSQL. Dans 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 le serveur PostgreSQL dans Azure. Il n’est pas rare que cette commande s’exécute pendant 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, modifiez cette valeur.

  • <postgres-server-name> → le nom du serveur de base de données PostgreSQL. Ce nom doit être unique sur l’ensemble 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. <l’emplacement> est l’une des valeurs Nom de l’emplacement Azure à partir de la sortie de la commande az account list-locations -o table.

  • <nom d’utilisateur> administrateur → nom d’utilisateur pour le compte d’administrateur. Il ne peut pas s’agir de « azure_superuser », « admin », « administrator », « root », « guest » ou « public ». Utilisez « demoadmin » pour ce didacticiel.

  • <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 « $ ». Plus tard, vous créez des variables d’environnement avec ces valeurs où le caractère « $ » a une signification particulière dans le conteneur Linux utilisé pour exécuter des applications Python.

  • <sku-name> → Le 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. Pour répertorier les références SKU disponibles, utilisez az postgres flexible-server list-skus --location <location>.

  • <public-access> → Utiliser « 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 envisagez de travailler le serveur PostgreSQL à partir de votre station de travail locale avec des outils autres qu’Azure CLI, vous devez ajouter une règle de pare-feu avec 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ées 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 utilisez 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. 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

<postgres-server-name> est le nom du serveur PostgreSQL. La commande vous invite à entrer 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, votre adresse IP doit être ajoutée à 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.

À l’invite postgres=> , tapez :

CREATE DATABASE restaurants_reviews;

Le point-virgule (« ; ») à la fin de la commande est nécessaire. Pour vérifier que la base de données a été créée avec succès, 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 à l’aide d’Azure Data Studio ou d’un autre IDE prenant en charge PostgreSQL.

Déployer l’application web sur Container Apps

Les applications conteneur sont déployées dans des environnements Container Apps, qui agissent comme une limite sécurisée. Dans les étapes suivantes, vous créez l’environnement, un conteneur à l’intérieur de l’environnement et configurez 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>

<l’emplacement> est l’une des valeurs Nom de l’emplacement Azure à partir de la sortie 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 retourné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 AZURE_SECRET_KEY valeur à 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, elle est effectuée automatiquement et vous pouvez ignorer cette étape.)

Connecter avec la commande az containerapp exec :

az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg

Ensuite, à l’invite de commandes shell, tapez python manage.py migrate.

Vous n’avez pas besoin de migrer pour les révisions du conteneur.

Étape 8 : Testez le site web.

La az containerapp create commande que vous avez entrée 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. Vous pouvez également utiliser la commande az containerapp browse .

Voici un exemple de site web d’exemple après avoir ajouté un restaurant et deux avis.

Screenshot showing an example of the sample website built in this tutorial.

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 l’URL de l’application.
    • Dans VS Code, accédez à l’extension Azure et sélectionnez la section Container Apps . Développez l’abonnement, développez l’environnement de conteneur et, lorsque vous trouvez l’application conteneur, cliquez avec le bouton droit sur python-container-app , puis sélectionnez Parcourir.
    • Avec Azure CLI, utilisez la commande az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn.
  • Dans VS Code, l’image de build dans la tâche Azure retourne une erreur.

    • Si le message « Erreur : échec du téléchargement du contexte s’affiche. Veuillez case activée si l’URL est incorrecte. » dans la fenêtre Sortie de VS Code, 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 réexécutez l’image de build dans la tâche Azure, case activée pour voir si votre registre d’une exécution précédente existe et, le cas échéant, 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 case activée’état administrateur dans le portail, accédez à votre instance Azure Container Registry, sélectionnez la ressource clés d’accès et vérifiez que Administration’utilisateur 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 la réussite.
    • Vérifiez que le nom du Registre a été spécifié correctement dans votre commande de build avec Azure CLI ou dans les invites de tâche VS Code.
    • Vérifiez 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 retourne « 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 didacticiel case activée pour l’existence de la variable RUNNING_IN_PRODUCTIONd’environnement de conteneur, qui peut être définie sur n’importe quelle valeur telle que « 1 ».
  • Le site web retourne « Introuvable (404) ».

    • Vérifiez l’URL de l’application dans 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.
    • Vérifiez l’entrée du conteneur. Par exemple, dans Portail Azure, accédez à la ressource d’entrée du conteneur et vérifiez que l’entrée HTTP est activée et que l’acceptation du trafic n’importe où est sélectionnée.
  • Le site web ne démarre pas, vous voyez « délai d’expiration du flux » ou rien n’est retourné.

    • Consultez les journaux.
      • Dans le Portail Azure, accédez à la ressource de gestion de révision de l’application conteneur et case activée l’état d’approvisionnement du conteneur.
        • Si « Provisionnement », attendez que l’approvisionnement soit terminé.
        • Si « É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 en premier et recherchez les messages stderr et stdout Python dans la colonne « Stream_s ». La sortie Python « print » sera des messages stdout .
      • Avec Azure CLI, utilisez la commande az containerapp logs show .
    • Si vous utilisez l’infrastructure Django, case activée pour voir si les tables restaurants_reviews existent dans la base de données. Si ce n’est pas le cas, utilisez une console pour accéder au conteneur et exécuter python manage.py migrate.

Étape suivante