Deploiement sur Heroku
POO - Python Orienté Objet”
IV. Déploiement d’une API sur Heroku
1. Configuration de l’environnement Heroku
Avant de déployer une API sur Heroku, il est essentiel de configurer correctement l’environnement Heroku. Cela implique la création d’un compte Heroku, l’installation de l’interface en ligne de commande Heroku (CLI), et la préparation de votre application avec les fichiers de configuration nécessaires.
a. Création d’un compte Heroku
Pour commencer avec Heroku, vous devez d’abord créer un compte. Rendez-vous sur le site de Heroku et inscrivez-vous en fournissant une adresse e-mail et un mot de passe. En tant qu’étudiant, vous pouvez bénéficier d’avantages supplémentaires grâce au GitHub Student Developer Pack, qui inclut des crédits gratuits sur Heroku.
b. Installation de Heroku CLI
Heroku CLI, ou Heroku Command Line Interface, est un outil en ligne de commande qui permet de gérer vos applications Heroku directement depuis le terminal. CLI signifie “Interface de Ligne de Commande”, et c’est un moyen puissant pour exécuter des commandes spécifiques à Heroku, telles que la création d’applications, la gestion des processus, la consultation des logs, et le déploiement de votre code.
Pour installer Heroku CLI, suivez les instructions sur le site officiel de Heroku. En général, l’installation se fait via un gestionnaire de paquets pour votre système d’exploitation ou en téléchargeant et en exécutant un programme d’installation.
c. Avantages pour les étudiants
En tant qu’étudiant, vous avez accès à des ressources supplémentaires grâce au GitHub Student Developer Pack. Ce pack offre des crédits mensuels de 13 $ sur Heroku, ce qui vous permet de tester et de déployer vos applications sans frais supplémentaires. Pour en bénéficier, inscrivez-vous sur Heroku for GitHub Students avec votre compte GitHub éligible au Student Developer Pack.
2. Préparation de l’application pour Heroku
a. Adaptation de l’application aux exigences Heroku
Pour que votre application soit prête pour un déploiement sur Heroku, elle doit répondre à certains critères structurels et de configuration. Voici les éléments essentiels à vérifier et à mettre en place :
- requirements.txt : Ce fichier doit être présent à la racine de votre projet. Il contient la liste des dépendances Python nécessaires à votre application, permettant à Heroku de les installer automatiquement lors du déploiement.
- Procfile : Ce fichier, également à la racine de votre projet, indique à Heroku comment démarrer votre application. Il définit les différents types de processus et les commandes associées à votre application.
- runtime.txt : Si vous avez besoin d’une version spécifique de Python, ce fichier permet de l’indiquer à Heroku.
- Dépôt Git : Heroku utilise Git pour le déploiement. Assurez-vous que votre code source est bien versionné dans un dépôt Git.
b. Le Procfile: Spécificité et Fonctionnalités
Est-ce propre à Heroku?
Le Procfile est une convention utilisée par Heroku, mais le concept n’est pas exclusif à cette plateforme. D’autres systèmes de déploiement et PaaS (Platform as a Service) peuvent utiliser des mécanismes similaires, bien que le terme “Procfile” soit spécifiquement associé à Heroku.
Fonctionnalités du Procfile
Le Procfile permet de déclarer différents types de processus et de commandes qui sont nécessaires pour exécuter une application. Voici une liste des fonctionnalités et des types de processus que vous pouvez définir dans un Procfile:
- Types de processus:
- web: Un processus pour exécuter le serveur web. Heroku rend ce processus accessible via HTTP et lui attribue un nom de domaine.
- worker: Un type de processus pour les tâches en arrière-plan. Ces processus peuvent être des tâches de file d’attente, des tâches planifiées, etc.
- release: Utilisé pour exécuter des tâches avant un nouveau déploiement, comme des migrations de base de données.
- clock: Un processus qui s’exécute à intervalles réguliers, souvent utilisé pour la planification de tâches (similaire à cron).
- Exécution de scripts:
- Vous pouvez exécuter des scripts personnalisés ou des commandes shell directement dans le Procfile.
- Gestion des ressources:
- Vous pouvez spécifier la quantité de ressources (comme la mémoire) que chaque processus doit utiliser, bien que cela se fasse généralement via la CLI ou le tableau de bord Heroku plutôt que dans le Procfile lui-même.
- Déclaration de ports:
- Pour les processus web, Heroku assigne automatiquement un port que votre application doit écouter. Vous n’avez pas besoin de le déclarer dans le Procfile, mais votre application doit être configurée pour écouter sur le port spécifié par la variable d’environnement PORT.
- Processus multiples:
- Vous pouvez déclarer plusieurs processus du même type avec des commandes différentes si nécessaire.
- Scaling:
- Bien que le Procfile ne gère pas directement le scaling horizontal (l’ajout de plus de dynos), il définit les types de processus que vous pouvez ensuite scaler via la CLI ou le tableau de bord.
Exemples de Procfile
Voici un exemple plus avancé de Procfile qui illustre certaines de ces fonctionnalités:
web: gunicorn app:app –workers 3 worker: celery -A app.celery worker release: python manage.py migrate clock: python clock.py
Dans cet exemple:
- Le processus web démarre l’application avec 3 workers de gunicorn.
- Le processus worker démarre un worker Celery pour les tâches en arrière-plan.
- Le processus release exécute les migrations de base de données avant chaque déploiement.
- Le processus clock exécute un script Python qui pourrait être utilisé pour la planification de tâches.
Le Procfile est donc un outil puissant pour déclarer comment votre application doit être exécutée sur Heroku, et il offre une flexibilité pour définir une variété de processus nécessaires à l’exécution de votre application.
c. requirements.txt
Le fichier requirements.txt liste toutes les bibliothèques Python dont votre application a besoin. Lorsque vous déployez votre application, Heroku utilise ce fichier pour installer automatiquement ces dépendances. Voici un exemple de ce à quoi pourrait ressembler un requirements.txt :
flask==1.1.2
gunicorn==20.0.4 requests==2.24.0
Chaque ligne spécifie une bibliothèque et sa version. Vous pouvez générer ce fichier en exécutant pip freeze > requirements.txt dans votre environnement de développement local.
d. runtime.txt
Le fichier runtime.txt spécifie la version de Python que votre application utilise. Heroku supporte plusieurs versions de Python, et il est important de spécifier la version pour éviter tout problème de compatibilité. Voici un exemple de contenu pour un runtime.txt :
python-3.8.5
Cela indique à Heroku d’utiliser Python 3.8.5 pour exécuter votre application.
e. Autres fichiers et configurations
Selon la complexité de votre application, d’autres fichiers de configuration peuvent être nécessaires. Par exemple, si vous utilisez une base de données, vous devrez peut-être ajouter un fichier de configuration pour celle-ci. De plus, si votre application dépend de variables d’environnement, vous devrez les configurer dans Heroku via le tableau de bord ou la CLI.
f. Structure du code de l’application
Votre application doit être structurée de manière à ce que Heroku puisse la construire et l’exécuter sans erreurs. Cela implique :
- Une application web doit écouter sur le port défini par la variable d’environnement PORT.
- Les fichiers statiques doivent être correctement configurés pour être servis par le serveur web.
- Les variables d’environnement doivent être utilisées pour les configurations sensibles, telles que les clés API ou les chaînes de connexion à la base de données.
g. Utilisation de bases de données
Si votre application utilise une base de données, vous devrez configurer celle-ci pour fonctionner avec Heroku :
- Migrations : Les migrations de base de données sont des modifications ou des mises à jour de la structure de votre base de données. Sur Heroku, ces migrations peuvent être exécutées automatiquement via le processus release dans le Procfile.
- Add-ons : Heroku propose des add-ons pour les bases de données, comme Heroku Postgres, qui peuvent être ajoutés à votre application. Ces services sont gérés et maintenus par Heroku, simplifiant la configuration et la maintenance.
- Variables d’environnement : Les chaînes de connexion et autres configurations de base de données doivent être stockées dans des variables d’environnement pour sécuriser les informations sensibles et permettre la portabilité de l’application.
Dans la prochaine section, nous allons créer une API simple avec FastAPI et préparer sa structure pour le déploiement sur Heroku, en mettant en pratique les éléments abordés ci-dessus.
h. Celery ?
Avant de plonger dans l’exemple avec FastAPI, clarifions d’abord ce qu’est Celery et son rôle dans le contexte d’une application déployée sur Heroku.
Celery est un système de file d’attente de tâches asynchrones, basé sur la distribution de messages. Il est utilisé pour exécuter des tâches en arrière-plan de manière asynchrone. Lorsque vous avez des opérations ou des tâches qui sont longues ou qui n’ont pas besoin d’être exécutées dans le flux de traitement principal de votre application web (comme l’envoi d’emails, le traitement d’images, ou les opérations batch), Celery vous permet de les gérer en dehors de la requête HTTP principale.
Dans le Procfile, le processus worker qui utilise Celery serait responsable de gérer ces tâches en arrière-plan. Cela permet à l’application web de répondre rapidement aux requêtes des utilisateurs sans être ralentie par ces opérations longues.
3. Exemple Basique avec FastAPI
Maintenant, créons une API simple avec FastAPI et préparons-la pour le déploiement sur Heroku. FastAPI est un framework moderne et rapide (haute performance) pour la construction d’APIs avec Python 3.7+, basé sur des standards Python type hints.
a. Structure de base d’une application FastAPI
Voici une structure de base pour une application FastAPI :
# main.py
from fastapi import FastAPI
= FastAPI()
app
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
Pour exécuter cette application localement, vous utiliseriez une commande comme celle-ci :
uvicorn main:app --reload
b. Préparation pour Heroku
Pour déployer cette application sur Heroku, vous devez effectuer les étapes suivantes :
- Créer un fichier Procfile :
web: uvicorn main:app --host=0.0.0.0 --port=${PORT:-5000}
- Ici, web est le processus qui sera accessible via HTTP et Heroku fournira la variable d’environnement PORT que votre application doit écouter.
- Créer un fichier requirements.txt :
Vous pouvez générer ce fichier en exécutant pip freeze > requirements.txt dans votre environnement de développement local. Assurez-vous d’inclure fastapi et uvicorn dans ce fichier. - Optionnel : Créer un fichier runtime.txt :
Si vous avez besoin d’une version spécifique de Python, spécifiez-la ici. - Initialiser un dépôt Git et pousser votre code :
Heroku utilise Git pour le déploiement, donc votre code doit être dans un dépôt Git.
c. Connexion à Heroku via le CLI
Après avoir installé le Heroku CLI, vous devez vous connecter à votre compte Heroku. Voici comment procéder :
- Ouvrez votre terminal ou invite de commande.
- Tapez la commande suivante :
heroku login
- Appuyez sur la touche Enter. Le Heroku CLI ouvrira votre navigateur web par défaut pour se connecter.
- Dans le navigateur qui s’ouvre, connectez-vous avec vos identifiants Heroku. Si vous n’êtes pas déjà inscrit sur Heroku, vous devrez créer un compte.
- Une fois connecté dans le navigateur, vous pouvez retourner à votre terminal et vous serez connecté.
Cette étape est nécessaire pour associer les actions que vous effectuez via le CLI avec votre compte Heroku, ce qui permet de gérer vos applications et autres services Heroku.
d. Création d’une nouvelle application Heroku
Vous pouvez créer une nouvelle application Heroku soit via le CLI, soit via le tableau de bord Heroku sur le web. Voici comment faire avec le CLI :
- Dans votre terminal, naviguez vers le répertoire de votre projet.
- Tapez la commande suivante :
heroku create your-app-name
Remplacez your-app-name par le nom que vous souhaitez donner à votre application. Ce nom doit être unique sur Heroku.- Si le nom est disponible, Heroku créera l’application et vous donnera l’URL de celle-ci ainsi qu’un remote Git.
Si vous ne spécifiez pas de nom, Heroku en générera un aléatoirement pour vous. Vous pouvez également créer une application via le tableau de bord Heroku en cliquant sur “New” puis “Create new app”.
e. Lier votre dépôt Git à Heroku
Après avoir créé votre application sur Heroku, vous devez lier votre dépôt Git local à Heroku. Cela permettra de pousser votre code vers Heroku pour le déploiement. Voici comment faire :
- Dans le terminal, assurez-vous que vous êtes dans le répertoire de votre projet qui est également un dépôt Git.
- Tapez la commande suivante :
heroku git:remote -a your-app-name
Cela ajoutera un nouveau remote appelé heroku à votre dépôt Git local.
f. Déployez votre application avec git push heroku master
Pour déployer votre application, vous devez pousser votre code depuis votre dépôt Git local vers le remote Heroku. Voici les étapes :
- Assurez-vous que toutes vos modifications sont commitées dans Git.
- Tapez la commande suivante dans votre terminal :
git push heroku master
- Cette commande envoie votre code sur la branche master de votre dépôt local vers Heroku. Si vous utilisez une branche différente, remplacez master par le nom de votre branche.
- Heroku recevra le code, exécutera le build en installant les dépendances spécifiées dans requirements.txt, et exécutera les commandes dans votre Procfile.
- Si le déploiement est réussi, Heroku vous donnera l’URL de votre application déployée que vous pourrez visiter avec un navigateur web.
Ces étapes finalisent le processus de déploiement de votre application FastAPI sur Heroku. Vous pouvez maintenant accéder à votre application via l’URL fournie par Heroku et commencer à utiliser votre API.
g. Tester votre application
Une fois déployée, votre application est accessible depuis n’importe quel ordinateur. Pour la tester, voici plusieurs outils que vous pouvez utiliser :
cURL
cURL est un outil en ligne de commande disponible sur la plupart des systèmes d’exploitation, utilisé pour envoyer des requêtes HTTP. Voici un exemple de commande cURL pour tester un point de terminaison de votre API :
curl -X GET https://your-app-name.herokuapp.com/endpoint
Remplacez https://your-app-name.herokuapp.com/endpoint par l’URL de votre API et le point de terminaison spécifique que vous souhaitez tester.
Postman
Comme abordé lors du TP 1, Postman est un outil GUI robuste pour tester les API. Vous pouvez configurer et envoyer des requêtes, et examiner les réponses de manière interactive.
Insomnia
Insomnia est une application GUI, alternative à Postman, qui se distingue par son interface épurée. Vous pouvez la télécharger sur leur site officiel et l’utiliser pour construire, envoyer et analyser les requêtes HTTP à votre API.
HTTPie
HTTPie est un client HTTP en ligne de commande qui offre une syntaxe intuitive, se présentant comme une alternative moderne à cURL. Installez-le avec pip :
pip install httpie
Puis envoyez des requêtes comme suit :
http GET https://your-app-name.herokuapp.com/endpoint
Requests en Python
Enfin, le package requests en Python, que nous avons utilisé tout au long de ce cours, reste une option fiable pour interagir avec votre API déployée. Vous pouvez écrire des scripts pour automatiser les tests et manipuler les réponses de l’API.