Skip to content

Utilisation de la commande s3cmd

Attention

Cet outil est déprécié. Rendez-vous sur la documentation de s5cmd.

S3cmd est une interface en ligne de commande pour piloter son Amazon S3, ou dans le cadre du Mésocentre, piloter son stockage Ceph via l'API S3. Pour l'installer, selon votre distribution, faites

$ sudo apt-get install s3cmd
$ sudo yum install s3cmd
$ sudo pacman -S s3cmd
etc.
Sinon, les binaires sont disponibles ici : http://s3tools.org/download

Il est déployé par défaut sur toutes les ressources de calcul du mésocentre et accessible via le module s3cmd :

$ module load python/2.7.9 s3cmd

Configuration de s3cmd pour le serveur de stockage du Mésocentre

Tout d'abord, contactez le support pour demander la création d'un compte. On vous fournira alors vos clés d'accès (MYACCESSKEY et MYSECRETKEY).

Créez un fichier ~/.s3cfg avec pour contenu :

[default]
access_key = MYACCESSKEY
secret_key = MYSECRETKEY
check_ssl_certificate = True
host_base = s3.mesocentre.uca.fr
host_bucket = s3.mesocentre.uca.fr
bucket_location = fr-clermont-mesocentre
server_side_encryption = False
use_https = True

Commandes usuelles de s3cmd

On vérifie dans un premier temps que l'accès fonctionne :

$ s3cmd ls

Et on va créer un nouveau bucket (mb) :

$ s3cmd mb s3://monbucket42
Bucket 's3://monbucket42/' created

Nom du bucket

Il est important de réfléchir au nom de son bucket :

  • un bucket ne peut pas être renommé ;
  • il est impossible de créer un bucket dont le nom a déjà été pris par un autre utilisateur ;
  • le nom du bucket doit respecter certaines règles.

Règles de nommage d'un bucket

Il convient de nommer un bucket en respectant les règles énoncées ici, en particulier pour pouvoir monter un bucket dans le système de fichiers en utilisant s3fs, le nom doit être compatible avec les règles DNS :

  • entre 3 et 63 caractères, et ne peut contenir que des lettres minuscules, des chiffres, des points (.) et des tirets (-) ;
  • les noms ne doivent pas contenir de tiret bas (underscore _) ; le nom Mon_Bucket_De_Donnees n'est pas correct, ni mon_bucket_de_donnees ;
  • les noms ne doivent pas ressembler à une adresse IP (ie 192.168.5.4) ;
  • les noms ne doivent pas commencer par un point ni un tiret (.monbucket) ;
  • les noms ne doivent pas se terminer par un point ni un tiret (monbucket.) ;
  • deux points ne doivent pas être adjacents (mon..bucket) ;
  • les tirets et les points ne doivent pas être adjacents (mon-.bucket).

Que l'on peut lister en faisant (ls) :

$ s3cmd ls
2016-12-01 13:35  s3://monbucket42

Je peux ajouter des fichiers à monbucket42 (put) :

$ s3cmd put mkdocs.yml s3://monbucket42
upload: 'mkdocs.yml' -> 's3://monbucket42/mkdocs.yml'  [1 of 1]
 1085 of 1085   100% in    0s    25.37 kB/s  done

Que je vois appraître :

$ s3cmd ls s3://monbucket42
2016-12-01 13:37      1085   s3://monbucket42/mkdocs.yml

Ou je peux aussi ajouter des répertoires (put -r) :

$ s3cmd put -r docs s3://monbucket42
upload: 'docs/applis/hpc2-liste.md' -> 's3://monbucket42/docs/applis/hpc2-liste.md'  [1 of 17]
 116 of 116   100% in    0s     3.98 kB/s  done
[...]
upload: 'docs/slurm/overview.md' -> 's3://monbucket42/docs/slurm/overview.md'  [16 of 17]
 3067 of 3067   100% in    0s   248.58 kB/s  done
upload: 'docs/slurm/resources.md' -> 's3://monbucket42/docs/slurm/resources.md'  [17 of 17]
 5746 of 5746   100% in    0s   380.51 kB/s  done

Qui apparaît :

$ s3cmd ls s3://monbucket42
                       DIR   s3://monbucket42/docs/
2016-12-01 13:37      1085   s3://monbucket42/mkdocs.yml

$ s3cmd ls s3://monbucket42/docs/
                       DIR   s3://monbucket42/docs/applis/
                       DIR   s3://monbucket42/docs/ceph/
                       DIR   s3://monbucket42/docs/css/
                       DIR   s3://monbucket42/docs/files/
                       DIR   s3://monbucket42/docs/img/
                       DIR   s3://monbucket42/docs/infras/
                       DIR   s3://monbucket42/docs/slurm/
2016-12-01 13:40      1778   s3://monbucket42/docs/index.md

Attention, petite subtilité, si vous voulez envoyer uniquement le contenu d'un répertoire (et pas le répertoire lui-même), pensez à mettre un / après le nom :

$ s3cmd put -r monrepertoire/ s3://monbucket42

Pour connaître la taille de votre bucket (du) :

$ s3cmd du s3://monbucket42
1234641  18 objects s3://monbucket42/

Pour récupérer l'un des fichiers (get) :

$ s3cmd get s3://monbucket42/docs/files/20161007-tutoriel-mesocentre.pdf
download: 's3://monbucket42/docs/files/20161007-tutoriel-mesocentre.pdf' -> './20161007-tutoriel-mesocentre.pdf'  [1 of 1]
 1156910 of 1156910   100% in    0s     9.33 MB/s  done

Pour copier un fichier d'un endroit à un autre du bucket, ou de 2 buckets différents (cp) :

$ s3cmd cp s3://monbucket42/docs/files/20161007-tutoriel-mesocentre.pdf s3://monbucket42/autre_dossier/fichier.pdf
remote copy: 's3://monbucket42/docs/files/20161007-tutoriel-mesocentre.pdf' -> 's3://monbucket42/autre_dossier/fichier.pdf'

Ou pour déplacer un fichier (mv) :

$ s3cmd mv s3://monbucket42/autre_dossier/fichier.pdf s3://monbucket42/formation.pdf
move: 's3://monbucket42/autre_dossier/fichier.pdf' -> 's3://monbucket42/formation.pdf'

Pour supprimer un fichier (del ou rm) :

$ s3cmd del s3://monbucket42/formation.pdf
delete: 's3://monbucket42/formation.pdf'

Pour supprimer un bucket, il faut d'abord vider son contenu :

$ s3cmd la
                       DIR   s3://monbucket42/autre_dossier/
                       DIR   s3://monbucket42/docs/
2016-12-01 13:37      1085   s3://monbucket42/mkdocs.yml

$ s3cmd rm -r s3://monbucket42/autre_dossier/
delete: 's3://monbucket42/autre_dossier/fichier.pdf'

$ s3cmd rm -r s3://monbucket42/docs
delete: 's3://monbucket42/docs/applis/hpc2-liste.md'
[...]
delete: 's3://monbucket42/docs/slurm/overview.md'
delete: 's3://monbucket42/docs/slurm/resources.md'

$ s3cmd rm s3://monbucket42/mkdocs.yml
delete: 's3://monbucket42/mkdocs.yml'

$ s3cmd la

Puis on peut supprimer le bucket :

$ s3cmd rb s3://monbucket42
Bucket 's3://monbucket42/' removed

Si vous avez besoin de synchroniser un répertoire local avec un répertoire S3, utilisez la commande sync. Elle utilisera les MD5 des fichiers pour savoir quoi envoyer et quoi mettre à jour sur votre S3 ou en local sur votre disque dur :

$ s3cmd sync docs s3://monbucket42/docs/