Aller au contenu

Platform as a Service

Les Plateform As A Service , où vous choisissez le service ou le composant dont vous avez besoin (une base de données, un service de cache, un service applicatif, …), vous lui envoyer les paramètres nécessaires et le tout démarre gentiment sans que vous ne deviez superviser l’hôte. En pratique, ce mode démarrage se conforme aux 12 facteurs dont nous avons déjà parlé plus tôt - modifier un paramètre reviendra à couper l’instance actuelle pour en déployer une nouvelle.

Heroku

Le fonctionnement est relativement simple : pour chaque application, Heroku crée un dépôt Git qui lui est associé. Il suffit donc d’envoyer les sources de votre application vers ce dépôt pour qu’Heroku les interprête comme étant une nouvelle version, déploie les nouvelles fonctionnalités - sous réserve que tous les tests passent correctement - et les mettent à disposition après avoir exécuté un ou plusieurs scripts de migration. Dans un fonctionnement plutôt manuel, chaque déploiement est initié par le développeur ou par un membre de l’équipe. Dans une version plus automatisée, chacun de ces déploiements peut être placé en fin de pipeline, lorsque tous les tests unitaires et d’intégration auront été réalisés.

Au travers de la commande heroku create, vous associez donc une nouvelle référence à votre code source, comme le montre le contenu du fichier .git/config ci-dessous :

Fenêtre de terminal
$ heroku create
Creating app... done, -> young-temple-86098
https://young-temple-86098.herokuapp.com/ | https://git.heroku.com/young-
temple-86098.git
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "heroku"]
url = https://git.heroku.com/still-thicket-66406.git
fetch = +refs/heads/*:refs/remotes/heroku/*

Pour définir de quel type d’application il s’agit, Heroku nécessite un minimum de configuration. Celle-ci se limite aux deux fichiers suivants :

  • Déclarer un fichier Procfile qui va simplement décrire le fichier à exécuter au travers du protocole WSGI (((WSGI))),
  • Déclarer un fichier requirements.txt, qui ira éventuellement chercher ses propres dépendances dans un sous-répertoire, avec l’option -r.

Après ce paramétrage, il suffit de pousser les changements vers ce nouveau dépôt grâce à la commande git push heroku main.

Puisqu’Heroku exige un fichier requirements.txt placé à la racine du projet, et puisque nous avons précédemment proposer d’utiliser Poetry, il sera nécessaire d’inclure la commande export afin de le fichier requirements.txt, comme exigé par Heroku.

Prêt à vous lancer ? Commencez par créer un compte : https://signup.heroku.com/python.

Configuration du compte

  • Récupération des valeurs d’environnement pour les réutiliser ci-dessous.

Vous aurez peut-être besoin d’un coup de pouce pour démarrer votre première application; heureusement, la documentation est super bien faite :

.Heroku: Commencer à travailler avec un langage

Installez ensuite la CLI (Command Line Interface) en suivant https://devcenter.heroku.com/articles/heroku-cli[la documentation suivante].

Au besoin, cette CLI existe pour :

. macOS, via ‘brew ‘ . Windows, grâce à un https://cli-assets.heroku.com/heroku-x64.exe[binaire x64], . GNU/Linux, via un script Shell curl https://cli-assets.heroku.com/install.sh  sh+ ou sur https://snapcraft.io/heroku[SnapCraft].

Une fois installée, connectez-vous :

Fenêtre de terminal
$ heroku login

Et créer votre application :

Fenêtre de terminal
$ heroku create
Creating app... done, -> young-temple-86098
https://young-temple-86098.herokuapp.com/ | https://git.heroku.com/young-temple-86098.git

.Notre application est à présent configurée! image::deployment/heroku/app-created.png[align=“center”]

Ajoutons lui une base de données, que nous sauvegarderons à intervalle régulier :

Fenêtre de terminal
$ heroku addons:create heroku-postgresql:hobby-dev
Creating heroku-postgresql:hobby-dev on -> still-thicket-66406... free
Database has been created and is available
! This database is empty. If upgrading, you can transfer
! data from another database with pg:copy
Created postgresql-clear-39693 as DATABASE_URL
Use heroku addons:docs heroku-postgresql to view documentation
$ heroku pg:backups schedule --at '14:00 Europe/Brussels' DATABASE_URL
Scheduling automatic daily backups of postgresql-clear-39693 at 14:00
Europe/Brussels... done
Fenêtre de terminal
# Copié/collé de https://cookiecutter- django.readthedocs.io/en/latest/deployment-on-heroku.html
heroku create --buildpack https://github.com/heroku/heroku-buildpack-python
heroku addons:create heroku-redis:hobby-dev
heroku addons:create mailgun:starter
heroku config:set PYTHONHASHSEED=random
heroku config:set WEB_CONCURRENCY=4
heroku config:set DJANGO_DEBUG=False
heroku config:set DJANGO_SETTINGS_MODULE=config.settings.production
heroku config:set DJANGO_SECRET_KEY="$(openssl rand -base64 64)"
# Generating a 32 character-long random string without any of the visually
similar characters "IOl01":
heroku config:set DJANGO_ADMIN_URL="$(openssl rand -base64 4096 | tr -dc 'A-
HJ-NP-Za-km-z2-9' | head -c 32)/"
# Set this to your Heroku app url, e.g. 'bionic-beaver-28392.herokuapp.com'
heroku config:set DJANGO_ALLOWED_HOSTS=
# Assign with AWS_ACCESS_KEY_ID
heroku config:set DJANGO_AWS_ACCESS_KEY_ID=
# Assign with AWS_SECRET_ACCESS_KEY
heroku config:set DJANGO_AWS_SECRET_ACCESS_KEY=
# Assign with AWS_STORAGE_BUCKET_NAME
heroku config:set DJANGO_AWS_STORAGE_BUCKET_NAME=
git push heroku main
heroku run python manage.py createsuperuser
heroku run python manage.py check --deploy
heroku open

Types d’application

Pour qu’Heroku comprenne le type d’application à démarrer, ainsi que les commandes à exécuter pour que tout fonctionne correctement. Pour un projet Django, cela comprend, à placer à la racine de votre projet :

  • Un fichier +requirements.txt+ (qui peut éventuellement faire appel à un autre fichier, via l’argument +-r+) . Un fichier +Procfile+ (sans extension!), qui expliquera la commande pour le protocole WSGI.
Fenêtre de terminal
# Procfile
release: python3 manage.py migrate
web: gunicorn gwift.wsg

Hébergement S3

Au chapitre précédent, nous avons défini un ensemble de plusieurs variables pouvant être configurées. Leur attribuer une valeur peut être réalisé depuis la console d’administration d’Heroku :

Lors de la publication, vous devriez à présent avoir la sortie suivante, qui sera confirmée par le bucket:

Fenêtre de terminal
remote: -----> $ python manage.py collectstatic --noinput
remote: 128 static files copied, 156 post-processed

Sources complémentaires:

Conclusions

TBC