Cloudzip - Montez un zip distant et accédez à ses fichiers sans tout télécharger

par Korben -

Imaginons que vous ayez une énooorme archive zip stockée quelque part dans le cloud, disons sur un bucket S3, et vous avez besoin d’accéder à quelques fichiers précis à l’intérieur. Qu’est-ce que vous faites ? Et bien comme tout le monde, vous téléchargez les 32 Go en entier, vous dézippez le bazar et tout ça pour récupérer 3 malheureux fichiers…

Et ben figurez-vous que j’ai déniché un p’tit outil bien sympa qui va vous faciliter la vie : Cloudzip ! Ca permet de monter votre archive zip distante directement sur votre machine, comme un disque dur externe, comme ça, vous pouvez accéder aux fichiers dont vous avez besoin, les copier, les utiliser, tout ça sans avoir à télécharger l’intégralité de l’archive.

Exemple :

cz ls s3://example-bucket/path/to/archive.zip

Plutôt cool, non ?

Le fonctionnement de Cloudzip est assez ingénieux. Il se base sur deux principes simples mais diablement efficaces :

  1. Les fichiers zip permettent un accès aléatoire en lecture. Ils ont un “répertoire central” stocké à la fin de l’archive qui décrit tous les fichiers contenus, avec leurs offsets. Pas besoin de lire l’archive en entier pour trouver un fichier.
  2. La plupart des serveurs HTTP et des services de stockage dans le cloud (S3, Google Cloud Storage, Azure Blob Storage, etc.) supportent les requêtes HTTP avec des “range” headers. En gros, ça permet de ne récupérer qu’une partie d’un fichier distant.

En combinant ces deux principes, Cloudzip est capable de récupérer juste le répertoire central de votre archive zip (qui ne pèse que quelques Ko) pour avoir la liste des fichiers, et ensuite de télécharger uniquement les bouts de fichiers dont vous avez besoin au moment où vous y accédez !

Pour l’installer :

git clone https://github.com/ozkatz/cloudzip.git
cd cloudzip
go build -o cz main.go

Puis copiez le binaire cz dans un endroit accessible via votre $PATH :

cp cz /usr/local/bin/

Et là ou ça devient encore plus dingue (oups pardon, je voulais dire “intéressant”) c’est qu’avec le paramètre mount, Cloudzip peut carrément monter votre archive zip distante comme un répertoire local. En fait, il va démarrer un petit serveur NFS en local, et monter ce répertoire NFS dans le dossier de votre choix.

Encore un exemple :

cz mount s3://example-bucket/path/to/archive.zip some_dir/

Comme ça, vous avez accès à tous tes fichiers comme s’ils étaient en local, vous pouvez les ouvrir direct dans vos applications, les traiter, et tout ça sans jamais avoir eu à télécharger l’archive en entier.

Et le plus beau dans tout ça, c’est que Cloudzip fonctionne avec à peu près tous les stockages distants qu’on peut imaginer. Bien sûr, il y a S3, mais aussi HTTP, HTTPS, GCS, Azure, et même… roulement de tambour… Kaggle !

Ah Kaggle, ce repaire de Data Scientists où les datasets sont plus gros que le compteur électrique d’un mineur de Bitcoin… Cloudzip est capable d’utiliser l’API de Kaggle pour récupérer directement le zip d’un dataset sans avoir à le télécharger. Vous pouvez donc littéralement monter un dataset Kaggle en local et commencer à bosser dessus dans la seconde. Et si jamais vous avez besoin d’un fichier particulier pour tester un truc, pas de souci, il sera téléchargé à la demande.

Alors bien sûr, ce n’est pas parfait. Le montage NFS, par exemple, n’est disponible que sous Linux et macOS pour l’instant. Et faut pas s’attendre à des performances dingues non plus, on parle quand même de télécharger des bouts de fichiers à travers le réseau. Mais pour tous ces cas où vous avez besoin d’accéder à quelques fichiers dans une archive zip énorme, c’est parfait !

Et en plus, c’est est open-source (vous pensiez quand même pas que j’allais vous recommander un truc propriétaire, hein !). Vous pouvez retrouver le projet sur GitHub.