Dans ce tutoriel je vous propose de découvrir le principe du Object Storage d'un point de vu développeur. On ne s'intérèssera pas ici sur l'aspect technique mais plutôt sur les bénéfices que peu nous apporter ce système stockage dans le cadre d'une application web.
La problématique
Par défaut, lorsque l'on souhaite stocker des fichiers, la solution la plus évidente est d'utiliser le disque dur de notre serveur. Cela peut fonctionner au début du projet mais peut rapidement poser plusieurs problèmes :
- Si l'application monte en charge et que plusieurs serveurs sont nécessaires à son fonctionnement il faudra trouver un moyen de partager le disque.
- L'espace disque n'est pas illimité et si l'application grandit on peut être amener à devoir acheter plus de stockages. Il faut ensuite mettre en place les politiques nécessaires pour distribuer les fichiers sur les espaces de stockage libres.
- La tolérance aux pannes nécessite de dupliquer les informations afin d'être capable de basculer rapidement d'un stockage à l'autre (ce qui peut être fait "simplement" avec un système RAID1 par exemple, mais qui pose plus de problème si vous voulez des copies sur plusieurs régions du monde).
Ces problématiques ne sont pas simples et demandent beaucoup de temps; temps que l'on préfère consacrer au développement de la logique de notre application (plutôt que sur les aspects techniques).
L'object storage, la solution "cloud"
Ces problèmes, les géants du web les ont déjà rencontrés, et ont créés des solutions pour simplifier leur gestion.
L'Object storage est une solution qui permet de simplifier la gestion d'une grande quantité de données en agissant comme un intermédiaire avec lequel on pourra communiquer avec une API dédiée. On ajoute ainsi une couche d'abstraction et on n'a plus à s'occuper de comment est géré le stockage en interne.
Dans ce système les fichiers sont représentés par des objets qui ont les propriétés suivantes :
- un identifiant unique
- des métadonnées (qui peuvent être utilisées pour rechercher des fichiers ou stocker des informations specifiques)
- les données correspondantes au fichier
Ces objets sont sauvegardés dans un index qui permet ensuite de retrouver rapidement les informations associées (sans forcément avoir à trouver ni lire le fichier).
Les webservices
Même si il est possible de mettre en place un système d'object storage chez soi, on aura plutôt tendance à utiliser un service tiers car cela offre plusieurs avantages :
- Le prix du stockage est fonction de votre consommation.
- La mise en place est simplifiée gràce à l'utilisation d'interfaces répandues.
- On peut choisir le type de stockage / réplication en fonction des besoins (stockage "froid" pour de la sauvegarde par exemple).
Il existe une multitude de services qui propose du Object Storage et je ne m'essaierais pas ici à faire un comparatif (il existe de nombreux facteurs différentiant et le choix dépendra de vos besoins)
- Amazon AWS S3
- Azure Blob Storage
- Scaleway Object Storage (basé sur S3)
- Digital OCean Spaces (basé sur S3)
En revanche, tous les services n'utilisent pas les mêmes API et il faudra adapter son code suivant le service utilisé (ou utiliser une librairie qui fait abstraction du système de fichier).
Certains services se reposent sur la structure d'API d'amazon S3 afin de permettre une meilleur interopabilité (en revanche il faudra faire attention car parfois toutes les fonctionnalités d'S3 ne sont pas reproduites).
Object Storage en PHP
La communication avec les service d'object storage en PHP se fait très simplement gràce à des couches d'abstraction comme FlySystem ou Gaufrette. Ces librairies offrent des méthodes génériques (get
, write
) et s'interface avec différents systèmes de fichiers ce qui permet de passer d'un système à l'autre en changeant simplement l'Adapter utilisé.
Dans un premier temps on peut utiliser le système de fichier du serveur.
use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Local;
$adapter = new Local(__DIR__.'/uploads/');
$filesystem = new Filesystem($adapter);
// L'objet $filesystem sera maintenant utilisé pour interagir avec les fichiers
Et plus tard le remplacer par une api S3 compatible ou autre, sans changer le code de notre application.
use Aws\S3\S3Client;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\Filesystem;
$client = new S3Client([
'credentials' => [
'key' => '*************',
'secret' => '*************',
],
'region' => 'fr-par',
'version' => 'latest',
]);
$adapter = new AwsS3Adapter($client, 'grafikart', 'uploads/path');
$filesystem = new Filesystem($adapter);
Et pour les autres languages ?
- Python: PyFilesystem