Lire des données depuis s3

Download nbviewer Onyxia
Binder Open In Colab githubdev

Qu’est-ce que le système de stockage S3 ?

Dans les entreprises et administrations, un nombre croissant de données sont disponibles depuis un système de stockage nommé S3. Le système S3 (Simple Storage System) est un système de stockage développé par Amazon et qui est maintenant devenu une référence pour le stockage en ligne. Il s’agit d’une architecture à la fois sécurisée (données cryptées, accès restreints) et performante.

Le concept central du système S3 est le bucket. Un bucket est un espace (privé ou partagé) où on peut stocker une arborescence de fichiers. Pour accéder aux fichiers figurant dans un bucket privé, il fournit des jetons d’accès (l’équivalent d’un mot de passe) reconnus par le serveur de stockage. On peut alors lire et écrire dans le bucket.

Le SSP cloud

Onyxia
repose par exemple sur cette infrastructure technique.

Comment faire avec Python ?

Les librairies principales

L’interaction entre ce système distant de fichiers et une session locale de Python est possible grâce à des API. Les deux principales librairies sont les suivantes:

  • boto3, une librairie créée et maintenue par Amazon ;
  • s3fs, une librairie qui permet d’interagir avec les fichiers stockés à l’instar d’un filesystem classique.

Ces deux librairies offrent toutes deux la possibilité de se connecter depuis Python, à un dépôt de fichiers distant, de lister les fichiers disponibles dans un bucket, d’en télécharger un ou plusieurs ou de faire de l’upload

Note

Les exemples suivants seront réplicables pour les utilisateurs de la plateforme SSP-cloud

Personnellement, j’ai une petite préférence pour boto3 que je trouve plus intuitif.

Quelques cas spéciaux

La librairie ultra-performante arrow propose également un accès à des fichiers sur S3 comme s’ils étaient disponibles sur un filesystem local. Un exemple, assez court, est disponible dans la documentation officielle

Les utilisateurs de Snakemake peuvent également lire ou écrire des tables intermédiaires sur S3 comme s’ils utilisaient un système de fichier local. En arrière-plan, snakemake va utiliser boto3 pour communiquer avec le système de stockage

Un outil très performant utilisant la ligne de commande est également disponible. Son nom est mc pour Minio Client. Il propose les mêmes opérations que la ligne de commande linux mais avec un système distant.

Connexion à un bucket

Par la suite, on va utiliser des alias pour les trois valeurs suivantes, qui servent à s’authentifier.

key_id = 'MY_KEY_ID'
access_key = 'MY_ACCESS_KEY'
token = "MY_TOKEN"

Ces valeurs peuvent être également disponibles dans les variables d’environnement de Python. Comme il s’agit d’une information d’authentification personnelle, il ne faut pas stocker les vraies valeurs de ces variables dans un projet, sous peine de partager des traits d’identité sans le vouloir lors d’un partage de code.

Il se peut que la connexion à ce stade soit refusée (HTTP error 403). Cela peut provenir d’une erreur dans l’URL utilisé. Cependant, cela reflète plus généralement des paramètres d’authentification erronés.

Notes

Dans le SSP-cloud, lorsque l’initialisation du service Jupyter du SSP-cloud est récente (moins de 12 heures), il est possible d’utiliser automatiquement les jetons stockés automatiquement à la création du dépôt.

Si on désire accéder aux données du SSP-cloud depuis une session python du datalab (service VSCode, Jupyter…), il faut remplacer l’url par http://minio.lab.sspcloud.fr

Lister les fichiers

S’il n’y a pas d’erreur à ce stade, c’est que la connexion est bien effective. Pour le vérifier, on peut essayer de faire la liste des fichiers disponibles dans un bucket auquel on désire accéder.

Par exemple, on peut vouloir tester l’accès aux bases FILOSOFI (données de revenu localisées disponibles sur https://www.insee.fr) au sein du bucket donnees-insee.

Télécharger un fichier depuis s3 pour l’enregistrer en local

Cette méthode n’est en général pas recommandée car, comme on va le voir par la suite, il est possible de lire à la volée des fichiers. Cependant, télécharger un fichier depuis le cloud pour l’écrire sur le disque local peut parfois être utile (par exemple, lorsqu’il est nécessaire de dézipper un fichier).

Lire un fichier directement

La méthode précédente n’est pas optimale. En effet, l’un des intérêts des API est qu’on peut traiter un fichier sur S3 comme s’il s’agissait d’un fichier sur son PC. Cela est d’ailleurs une manière plus sécurisée de procéder puisqu’on lit les données à la volée, sans les écrire dans un filesystem local.

Uploader un fichier

Pour aller plus loin

Previous
Next