Split S3 files storage from PaaS deployment

This commit is contained in:
Fred Pauchet 2024-03-18 22:03:22 +01:00
parent 33bd4a578a
commit 873c8e610c
7 changed files with 47 additions and 40 deletions

View File

@ -0,0 +1,14 @@
== Stockage de fichiers
Nous avons pris comme parti dans le chapitre précédent d'héberger nos fichiers sur le serveur où est déployée notre application.
En cas de nécessité de déplacer ou redéployer le serveur, nous créons _de facto_ une dépendance supplémentaire.
La solution consiste à externaliser l'hébergement des fichiers statiques et utilisateurs vers un espace de stockage décentralisé (de notre application).
Il existe plusieurs manières de réaliser ceci ; le tout est de s'accorder sur une solution :
* Pour une architecture déployée sur site - sur un réseau privé ou autre -, un point de montage en CIFS ou NFS peut être largement suffisant,
* Dès que votre application dépassera les murs de votre réseau privé, les _buckets compatibles S3_ constituent une très bonne solution - et sont disponibles chez pratiquement tous les hébergeurs connus (Amazon, Scaleway ou OVH, pour ne citer qu'eux).
Heroku (((Heroku))) - que nous verrons au prochain chapitre - propose des espaces de déploiements, mais pas despace de stockage.
Il est possible dy envoyer des fichiers utilisateurs (typiquement, des media personnalisés), mais ceux-ci seront perdus lors du redémarrage du container.
Il est donc primordial de configurer correctement lhébergement des fichiers média, de préférences sur un stockage compatible S3 (((S3))).

View File

@ -1,7 +1,6 @@
== _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 lhôte.
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 lhô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.
[NOTE]
@ -10,22 +9,23 @@ Dans la suite, nous prendrons Heroku, mais il existe dautres plateformes simi
Le fonctionnement de ces différentes plateformes est généralement similaire (si pas identique...), et consiste généralement à respecter certaines conventions de configuration et à suivre certaines étapes spécifiques pour la mise à disposition.
====
=== Heroku
Pour un projet de type "hobby" et pour lexemple de déploiement ci-dessous, il est tout à fait possible de sen sortir sans dépenser un kopek, afin de tester nos quelques idées ou mettre rapidement un _Most Valuable Product_ en place.
La seule contrainte consistera à pouvoir héberger des fichiers envoyés par vos utilisateurs - ceci pourra être
fait en configurant un _bucket compatible S3_, par exemple chez Amazon, Scaleway ou OVH.
[DANGER]
====
Par la suite, il conviendra dinvestir un minimum : sur le _tiers_ par défaut, des bases de données sont disponibles, mais montrent rapidement leurs limites.
Les 10 000 enregistrements "_offerts_" sont une limite *très* rapidement atteinte, tandis quaucun mécanisme de migration nest prévu.
Ceci signifie quaprès avoir démarré un projet en mode "hobby", il vous sera nécessaire de gérer vous-même la migration de vos données, dans la mesure où aucun processus automatique nexiste entre instances de deux niveaux différents.
Anciemmenent, Heroku proposait des projets de type "hobby", gratuits, à condition de respecter quelques contraintes.
Ces contraintes étaient faciles à respecter, sous réserve de ne vouloir mettre qu'une simple application à disposition de quelques utilisateurs seulement, ou pour rapidement mettre un _Most Valuable Product_ (((MVP, Most Valuable Product))) en place.
Par la suite, il convenait dinvestir un minimum : sur le _tiers_ par défaut, des bases de données étaient disponibles, mais montraient rapidement leurs limites.
Les 10 000 enregistrements "_offerts_" étaient une limite *très* rapidement atteinte, tandis quaucun mécanisme de migration nétait prévu.
Ceci signifiait quaprès avoir démarré un projet en mode "hobby", il vous était nécessaire de gérer vous-même la migration de vos données, dans la mesure où aucun processus automatique nexistait entre instances de deux niveaux différents.
A présent, ces instances ont disparu et il est nécessaire de passer au minimum sur le premier tiers payant.
====
Le fonctionnement est relativement simple : pour chaque application, Heroku crée un dépôt Git qui lui est associé.
Il suffit donc denvoyer les sources de votre application vers ce dépôt pour quHeroku 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.
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 dintégration auront été réalisés.
Il suffit donc denvoyer les sources de votre application vers ce dépôt pour quHeroku 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 dinté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 :
@ -53,25 +53,18 @@ $ cat .git/config
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 à passer au protocole WSGI
* Déclarer un fichier `requirements.txt` (qui va éventuellement chercher ses propres dépendances dans un sous-répertoire, avec l'option `-r`)
* 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+`.
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`.
[WARNING]
====
Puisque nous avons précedemment proposé dutiliser Poetry, la commande `+export+` pourra être utilisée pour générer le fichier `+requirements.txt+`, comme exigé par Heroku.
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.
====
Heroku propose des espaces de déploiements, mais pas despace de
stockage. Il est possible dy envoyer des fichiers utilisateurs
(typiquement, des media personnalisés), mais ceux-ci seront perdus lors
du redémarrage du container. Il est donc primordial de configurer
correctement lhébergement des fichiers média, de préférences sur un
stockage compatible S3. s3
Prêt à vous lancer ? Commencez par créer un compte :
https://signup.heroku.com/python.
Prêt à vous lancer ?
Commencez par créer un compte : https://signup.heroku.com/python.
=== Configuration du compte
@ -83,7 +76,7 @@ première application; heureusement, la documentation est super bien
faite:
.Heroku: Commencer à travailler avec un langage
image::images/deployment/heroku-new-app.png[images/deployment/heroku-new-app]
image::deployment/heroku/new-app.png[align="center"]
Installez ensuite la CLI (_Command Line Interface_) en suivant
https://devcenter.heroku.com/articles/heroku-cli[la documentation
@ -93,29 +86,27 @@ Au besoin, cette CLI existe pour :
. macOS, _via_ brew
. Windows, grâce à un
https://cli-assets.heroku.com/heroku-x64.exe[binaire x64] (la version 32
bits existe aussi, mais il est peu probable que vous en ayez besoin)
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
`curl https://cli-assets.heroku.com/install.sh  sh+` ou sur
https://snapcraft.io/heroku[SnapCraft].
Une fois installée, connectez-vous :
....
$ heroku login
....
```bash
$ heroku login
```
Et créer votre application :
....
$ heroku create
Creating app... done, -> young-temple-86098
https://young-temple-86098.herokuapp.com/ | https://git.heroku.com/young-
temple-86098.git
....
```bash
$ 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::images/deployment/heroku-app-created.png[images/deployment/heroku-app-created]
image::deployment/heroku/app-created.png[align="center"]
Ajoutons lui une base de données, que nous sauvegarderons à intervalle
régulier :

View File

@ -114,6 +114,8 @@ include::book/deployment/logs.adoc[]
include::book/deployment/native.adoc[]
include::book/deployment/files-storage.adoc[]
include::book/deployment/paas.adoc[]
include::book/deployment/cloud-native.adoc[]

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB