Aujourd'hui, je vous propose de découvrir comment tester vos API S3 en local à l'aide de Minio. Minio est un outil qui permet d'héberger un serveur d'object storage compatible avec S3.
Le problème
Lorsque l'on travaille sur une application qui gère des fichiers on a tendance à utiliser des systèmes de stockage externes pour se simplifier et ces outils utilisent souvent une API compatible avec S3. Le problème est alors de pouvoir tester le bon fonctionnement de notre système en local.
MinIO va nous permettre de lancer simplement un serveur de stockage compatible avec S3 sur notre machine pendant la phase de développement.
Mise en place
Il est possible de télécharger l'exécutable directement sur le site de MinIO mais la solution la plus simple reste l'utilisation de docker.
services:
minio:
image: 'minio/minio:latest'
ports:
- '9000:9000'
- '8900:8900'
environment:
MINIO_ROOT_USER: minio
MINIO_ROOT_PASSWORD: password
volumes:
- 'minio:/data/minio'
command: 'minio server /data/minio --console-address ":8900"'
healthcheck:
test:
- CMD
- curl
- '-f'
- 'http://localhost:9000/minio/health/live'
retries: 3
timeout: 5s
volumes:
minio:
driver: local
Il est ensuite possible de démarrer le serveur à l'aide de la commande docker-compose up
ce qui aura pour effet de démarrer le serveur S3 sur le port 9000
et la console d'administration sur le port 8900
Configuration de MinIO
Une fois que Minio est en cours d'exécution, vous pouvez accéder à son interface web en ouvrant votre navigateur et en visitant localhost:8900. Les identifiants par défaut pour la connexion sont ceux définit via les variables d'environnement (minio
et password
dans notre cas).
Ensuite, vous pourrez vous rendre dans la section "Access token" pour définir les identifiants d'API qui vous permettront de communiquer avec le système de stockage. Vous pouvez aussi créer des buckets en fonction de vos besoins.
Côté code
Vu que MinIO est compatible avec S3 on va pouvoir utiliser le client S3 d'Amazon pour s'y connecter, il faudra cependant faire attention à plusieurs détails :
- La région doit être spécifié même si elle ne sert à rien dans le cas de MinIO
- L'option use_path_style_endpoint doit être vrai car on n'utilise un sous chemin et pas un sous domaine pour pointer vers un bucket.
Pour le reste la configuration est plutôt classique :
// Pour PHP
$client = new \Aws\S3\S3Client([
'version' => 'latest',
'region' => 'eu-east-1',
'endpoint' => 'http://localhost:9000',
'use_path_style_endpoint' => true,
'credentials' => [
'key' => 'YwWCbTffy2PeuA9Qy3NS',
'secret' => 'spuKyprRSBAThcgesUrgirSTNywm9R2MXxwRwUSC'
]
]);
// Pour Laravel (dans le .env)
AWS_ACCESS_KEY_ID=YwWCbTffy2PeuA9Qy3NS
AWS_SECRET_ACCESS_KEY=spuKyprRSBAThcgesUrgirSTNywm9R2MXxwRwUSC
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=grafibucket
AWS_ENDPOINT=http://localhost:9000
AWS_USE_PATH_STYLE_ENDPOINT=true
Et voila ! Vous pouvez utiliser ce client pour communiquer avec S3 comme vous le feriez sur l'application en production sans risquer de faire de bêtises.