MinIO Client : gérez du stockage compatible S3 en ligne de commandes (ou dans des scripts)

MinIO Client : gérez du stockage compatible S3 en ligne de commandes (ou dans des scripts)

Pour des backups aux petits oignons

Avatar de l'auteur
David Legrand

Publié dans

Logiciel

18/05/2020 10 minutes
8

MinIO Client : gérez du stockage compatible S3 en ligne de commandes (ou dans des scripts)

Les services de stockage objet compatibles avec l'API S3 d'Amazon Web Services (AWS) sont de plus en plus courants. Il existe de nombreux outils pour les gérer. Nous vous proposons de découvrir MinIO Client qui est multiplateforme, open source et plutôt complet.

Lorsque l'on parle de « S3 » pour du stockage en ligne, on pense le plus souvent à la solution d'Amazon Web Services (AWS), contraction de Simple Storage Service. Mais il s'agit également d'une API permettant aux développeurs d'intégrer son support dans leurs scripts et des applications tierces.

Peu à peu, la solution est devenue une sorte de standard de fait. Ainsi, nombreux sont les outils présentés comme « compatibles S3 ». Cela peut être des clients, permettant d'interagir avec le service d'AWS, mais aussi d'autres, pouvant être utilisés de la même manière, répondant aux mêmes commandes, avec une interface technique similaire. 

C'est par exemple le cas des solutions de stockage objet d'OVH (construite sur OpenStack Swift) ou de Scaleway en France. Mais aussi de solutions open source que chacun peut installer à sa guise comme le français OpenIO ou MinIO

Multiplateformes, ce dernier mise d'ailleurs sur une grande simplicité d'accès et d'installation. Il suffit de deux lignes de commandes pour le mettre en place via Docker ou de manière plus directe via Homebrew ou un simple exécutable. Mais c'est un outil (open source, sous licence Apache 2.0) dérivé du projet qui nous intéresse aujourd'hui : MinIO Client.

Configuration d'un espace de stockage compatible S3

Pour notre test du jour, nous utiliserons le service Object Storage de Scaleway. Nous ne reviendrons pas ici en détail sur la notion de stockage objet ou la création d'un bucket, détaillés dans de précédents articles.

L'accès se faisant depuis l'extérieur, il faut générer des jetons d'accès (API Tokens). Scaleway n'offre aucune granularité à ce niveau. En effet, chaque jeton donne accès à l'ensemble du compte, des fonctionnalités, des instances, buckets, etc. On apprécierait que dans le travail de refonte et d'évolution de l'offre actuellement en cours, l'hébergeur propose enfin de limiter les accès à certains éléments seulement. Surtout pour un usage en production.

Pour générer un jeton, il faut se rendre dans la section Credentials des paramètres utilisateurs de la Console. Ils sont constitués d'un ensemble de deux clés : d'accès (en général affichée, comme un identifiant) et secrète (en général cachée, comme un mot de passe). Les deux sont nécessaires pour accéder à vos données.

Elles peuvent être associées à un but (purpose), même si comme nous l'avons évoqué cela ne limite pas leur accès au compte. Mais cela permet d'en utiliser des différentes selon les applications et les besoins, plutôt que de se reposer toujours sur la même. Ainsi, en cas de fuite, une clé pourra être révoquée sans impacter l'ensemble de vos services.

Gardez ces informations de manière sécurisée, en utilisant un gestionnaire de mots de passe par exemple.

Scaleway Tokens
Ne faites pas comme nous : ne publiez jamais votre clé d'accès et secrète (celles-ci ont été désactivées)

Configuration de MinIO Client

Ces bases posées, retournons à MinIO Client. Simplicité d'usage oblige, il s'agit d'un simple exécutable. Il est disponible sous Linux, macOS et Windows. Nous avons opté pour ce dernier cas, avec une installation via Chocolatey puisqu'un package est disponible. Cela permet de rester facilement à jour.

Enregistrons notre compte Scaleway dans ses paramètres. Cela passe par une simple commande déclarant l'URL du serveur, les clés et un alias qui sera utilisé pour manipuler les données. Il est donc préférable de choisir un nom court : 

mc config host add scfr https://s3.fr-par.scw.cloud

Vous devrez modifier l'URL si vous utilisez les serveurs d'Amsterdam (nl-ams plutôt que fr-par) ou un autre service compatible S3 comme Backblaze, OVH, etc. Vous pouvez également choisir d'indiquer directement la clé d'accès et la clé privée dans la commande. Sinon, elles vous seront demandées par MinIO Client afin de finaliser la procédure.

Vous pouvez voir la liste des hôtes enregistrés sur votre machine avec la commande suivante :

mc config host list

Vérifier que la connexion fonctionne en listant les éléments contenus dans votre compte :

mc ls scfr

Si vous voulez des informations sur une commande, utilisez le paramètre « -h »

mc config -h
mc config host -h

Création d'un premier bucket et upload d'un fichier

Pour vérifier que tout fonctionne, on peut créer un premier bucket : 

mc mb scfr/artnxi-bucktest --region fr-par

Attention, comme nous l'avons vu précédemment, chaque bucket doit avoir un nom unique (artnxi-bucktest dans notre exemple), pensez donc à l'adapter pour vos propres tests. Ici, préciser la région utilisée est nécessaire.

Une fois le bucket créé on peut y envoyer des données :

echo "Hello, world !" > fichier.txt
mc cp fichier.txt scfr/artnxi-bucktest/

Ici, notez un détail d'importance : le chemin indiqué pour le bucket se termine par « / » dans la commande de copie. Et pour cause, sans ce caractère l'application peut confondre un nom de fichier avec un « dossier ». Faites-y attention sous peine d'avoir de mauvaises surprises lors de vos transferts de données.

Avec la commande ci-dessus, le fichier sera simplement copié sur les serveurs de Scaleway. Vous pouvez opter pour un déplacement (mv plutôt que cp). D'autres options sont exploitables : 

  • -r : traitement récursif des données
  • -a : préservation des attributs
  • --md5 : calcul des hashs md5
  • --older-than --newer-than : filtrer selon l'âge du fichier
  • -sc : classe de stockage

Il existe de nombreuses possibilités, la documentation complète est disponible par ici

Quelques commandes de base à connaître

Une fois un bucket et des objets créés, vous pouvez utiliser MinIO Client pour des opérations assez classiques, comme si votre le contenu de votre compte Object Storage était un espace de stockage comme un autre :

mc ls scfr/artnxi-bucktest/ // Liste les objets d'un bucket
mc ls scfr/artnxi-bucktest/backups/ // Liste les objets du « dossier » backups

mc tree scfr/ // Afficher l'arborescence d'un bucket
mc tree scfr/artnxi-bucktest/ // Affiche l'arborescence à partir d'un certain niveau

mc cat scfr/artnxi-bucktest/fichier.txt // Affiche le contenu d'un fichier
mc head scfr/artnxi-bucktest/fichier.txt // Affiche les 10 premières lignes
mc head -n 20 scfr/artnxi-bucktest/fichier.txt // Affiche les 20 premières lignes

mc find fichier // trouve les objets dont la clé contient « fichier »
mc diff . scfr/artnxi-bucktest/ // Affiche les différence entre le dossier actuel (.) et un bucket

N'oubliez pas qu'en stockage objet, les dossiers n'existent pas. Il y a seulement des objets avec des préfixes similaires.

L'archivage plutôt que le stockage

Chez Scaleway, la classe de stockage peut être utilisée pour placer un objet non pas dans le service Object Storage (STANDARD) mais C14 Cold Storage (GLACIER). Ce dernier est moins cher, en contrepartie il sera plus difficile d'accéder aux données. En effet, elles devront tout d'abord être restaurées, une procédure pouvant demander jusqu'à six heures.

Ensuite, elles ne seront présentes dans Object Storage que pendant un nombre limité de jours, après quoi elles retourneront à leur statut d'archive. Notez que la Console de Scaleway gère les cycles de vie des objets et permet pour chaque bucket de définir des règles d'archivage selon l'âge du fichier, son préfixe, etc. 

Scaleway Object Storage Cycle de vieScaleway Object Storage Cycle de vie

Mais il est également possible de copier ou de déplacer des données via MinIO Client en précisant un attribut afin de les transférer dès le départ dans C14 Cold Storage afin qu'elles soient archivées :

echo "Ce fichier est archivé" > fichier_a_archiver.txt
mc mv --attr "X-Amz-Storage-Class=GLACIER" fichier_a_archiver.txt scfr/artnxi-bucktest/

Obtenir un lien de téléchargement 

Le support de l'API S3 par Scaleway est encore partiel. On ne peut par exemple pas obtenir un lien de téléchargement BitTorrent pour un objet, ou effectuer des opérations en masse. De son côté, MinIO Client ne gère pas certaines fonctionnalités, comme la modification des droits d'accès (ACL) pour passer de privé à public. 

Mais on peut profiter d'autres possibilités, comme obtenir un lien de partage pour un objet qui ne serait pas public :

mc share download scfr/artnxi-bucktest/fichier.txt
mc share download --expire=24h scfr/artnxi-bucktest/fichier.txt
mc share download --expire=30m20s scfr/artnxi-bucktest/fichier.txt

Par défaut (dans le 1er cas), l'expiration du lien intervient au bout de sept jours. On peut également la limiter en nombre d'heures, minutes et/ou secondes. On peut aussi récupérer la liste des liens de partage :

mc share list download

Upload en masse de fichiers et dossiers depuis Windows

Si vous voulez déplacer un dossier entier sur votre espace S3, vous pouvez utiliser la copie ou le déplacement récursif de MinIO Client, mais ce ne sera pas toujours la méthode la plus efficace. En effet, si vous effectuer la commande suivante :

mc mv -r répertoire_à_déplacer/ scfr/artnxi-bucktest/

Cela enverra répertoire_à_déplacer sans préfixe dans votre bucket. C'est efficace, mais si vous ne voulez déplacer que les fichiers et répertoires qu'il contient, comment faire ? Ici un script peut être utile. Sous Windows, cela se fait en deux commandes grâce à la fonction forfiles présente dans les versions récentes de l'OS :

forfiles /C "cmd /c if @isdir==FALSE mc mv @file scfr/artnxi-bucktest/Photos_vrac/"
forfiles /C "cmd /c if @isdir==TRUE mc mv -r @file scfr/artnxi-bucktest/Photos_vrac/"

Ici on envoie les fichiers puis les dossiers avec le préfixe Photos_vrac (comme si on créait un répertoire). Une solution parfaite pour des scripts de sauvegarde de vos données, surtout que de nombreux filtres peuvent être utilisés.

Synchronisation d'un dossier

Autre possibilité : utiliser la commande mirror de MinIO Client pour synchroniser un dossier local et un bucket distant. La procédure n'est pas bi-directionnelle, il y a simplement une source et une cible :

mc mirror . scfr/artnxi-bucktest/Photos_vrac/

Ici, on synchronise le dossier en cours (.) avec le bucket distant. Vous pouvez également indiquer que les objets déjà présents sur la cible doivent être écrasés (--overwrite), ceux absents de la source pouvant être retirés de la cible (--remove). Là aussi des filtres peuvent être utilisés pour se concentrer sur certains fichiers. 

Il est également possible que MinIO Client fasse office de client de synchronisation en temps réel. Il peut ainsi surveiller les modifications opérées sur la source afin de les reproduires sur la cible :

mc mirror --watch . scfr/artnxi-bucktest/Photos_vrac/

Écrit par David Legrand

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

Configuration d'un espace de stockage compatible S3

Configuration de MinIO Client

Création d'un premier bucket et upload d'un fichier

Quelques commandes de base à connaître

L'archivage plutôt que le stockage

Obtenir un lien de téléchargement 

Upload en masse de fichiers et dossiers depuis Windows

Synchronisation d'un dossier

Fermer

Commentaires (8)


Le serveur minio est aussi assez sympa je l’utilise dans des déploiements de kubernetes sur site, pour stocker les images OCI , et je l’utilise aussi pour sensibiliser les développeurs à l’emploi de stockage objet en lieu et place de stockage fichiers.



Sinon, dans le même genre, il y a Noobaa, qui est promu par RedHat.


Oui, on en parlera aussi ;)


aws cli, s3cmd sont aussi des clients s3 intéressants


On avait aussi miniIO dans la shortlist pour du déploiement “on-premise” (mais ca c’est juste avant qu’on dépriorise l’onprem )


Je l’aime bien minio c’est simple et efficace pour les scripts de sauvegarde par exemple. Merci @David_L pour avoir fait le tuto sous W$ ça aideras sans doute beaucoup de personnes pas habitués des Lin*x mais qui n’ont pas peur des lignes de commandes.


Disons que les commandes ne changent pas sous Linux ou Windows (modulo le nom des dossiers/fichiers), puis au pire on peut le faire dans WSL <img data-src=" />


<img data-src=" />


J’utilise le serveur minio pour gitlab-ci, simple et efficace.