• 20 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 17/10/2023

Stockez des données sur S3

AWS propose plusieurs solutions différentes pour stocker des données, adaptées à différents usages : nous pouvons stocker des données directement sur des serveurs EC2, sur des volumes attachés EFS, dans du stockage objet distant avec S3 ou dans des archives avec Glacier.

Nous cherchons à stocker des données pour les utiliser à partir d'un cluster de calcul. Or, les clusters de calcul peuvent être éphémères, c'est-à-dire qu'ils peuvent être détruits dès la fin d'un calcul, pour des raisons de coût. Nous ne pouvons donc pas stocker directement les données sur les serveurs EC2. Le stockage sur des volumes externes avec EFS est trop onéreux pour notre usage. A l'autre extrême, l'archivage sur Glacier est très peu coûteux mais le temps de récupération des données varie entre quelques minutes et quelques heures. S3 est une solution assez équilibrée pour notre usage : elle est peu coûteuse et propose des temps de transfert avec les serveurs de calculs intéressants. Son seul inconvénient est que S3 ne supporte pas la lecture aléatoire de données (commencer la lecture au milieu d'un fichier) mais ce n'est pas rédhibitoire car nous cherchons à réaliser des analyses en batch sur des fichiers : pour chaque fichier, nous aurons besoin de lire toutes les données. Nous n'aurons donc pas besoin de réaliser des lectures en accès aléatoire sur ces données.

Solution

Proximité des serveurs

Persistance

Faible coût

Lecture aléatoire

EC2

✔️

✔️

EFS

✔️

✔️

✔️

S3

✔️

✔️

✔️

Glacier

✔️

✔️

Il existe une interface graphique à S3 que l'on peut retrouver dans la console AWS.

S3 par la ligne de commande

S3 est une solution de stockage d'objets, ce qui signifie que les données y sont stockées sous forme d'objets (si si). À chaque objet sont associés des données, des métadonnées et un identifiant. Dans le cas de S3, les métadonnées qui nous intéressent sont ses permissions et son chemin (un peu comme dans un système de fichiers). Pour information, il est également possible d'associer des versions aux objets, mais nous n'allons pas nous servir de cette fonctionnalité.

Les objets sont stockés dans des buckets (des "seaux", aussi appelés compartiments dans AWS en français) et chaque bucket est nommé. Pour stocker des données nous allons donc devoir créer un bucket. Avec la commandemb("make bucket") je crée un bucket nomméoc-calculsdistribues:

$ aws s3 mb s3://oc-calculsdistribues
make_bucket: oc-calculsdistribues

On peut confirmer que ce bucket a bien été créé :

$ aws s3 ls
2017-03-02 16:36:45 oc-calculsdistribues

Par contre, si vous essayez d'exécuter les mêmes commandes, je peux vous garantir que vous aurez un message d'erreur... Parce que les buckets doivent avoir des noms uniques : pas uniques pour un utilisateur donné, mais uniques au monde. La raison en est que chaque bucket est accessible via une url définie par son nom, comme nous allons le voir un peu plus loin. Il est donc conseillé de créer des buckets préfixés par vos initiales ou celle de votre société. Dans les commandes suivantes, remplacezoc-calculsdistribuespar le nom de bucket que vous aurez choisi.

Nous pouvons créer un fichier et l'envoyer sur S3 :

$ echo "bonjour openclassrooms !" > hello.txt
$ aws s3 cp hello.txt s3://oc-calculsdistribues
upload: ./hello.txt to s3://oc-calculsdistribues/hello.txt       
$ aws s3 ls s3://oc-calculsdistribues
2017-03-02 16:48:36         25 hello.txt

Le récupérer :

$ rm hello.txt
$ aws s3 cp s3://oc-calculsdistribues/hello.txt hello2.txt
$ cat hello2.txt 
bonjour openclassrooms !

Supprimer l'objet ainsi créé :

$ aws s3 rm s3://oc-calculsdistribues/hello.txt
delete: s3://oc-calculsdistribues/hello.txt

Chaque chemin vers un objet peut être préfixé par un nom comportant des/, ce qui revient à stocker cet objet dans des répertoires :

$ aws s3 cp hello.txt s3://oc-calculsdistribues/je/mets/mes/objets/ou/je/veux/et/cest/souvent/ici.txt
upload: ./hello.txt to s3://oc-calculsdistribues/je/mets/mes/objets/ou/je/veux/et/cest/souvent/ici.txt
$ aws s3 ls s3://oc-calculsdistribues/
                       PRE je/
$ aws s3 ls s3://oc-calculsdistribues/je/
                       PRE mets/
$ aws s3 ls s3://oc-calculsdistribues/je/mets/
                       PRE mes/
...
$ aws s3 rm --recursive s3://oc-calculsdistribues/je/
delete: s3://oc-calculsdistribues/je/mets/mes/fichiers/ou/je/veux/et/cest/souvent/ici.txt

De la même manière, le contenu d'un répertoire peut être envoyé sur S3 avec l'option--recursive. Et pour synchroniser deux répertoires, la commandesyncest très utile.

On peut accéder à un objet public via une url qui est de la formehttps://s3-REGION.amazonaws.com/BUCKET/PATH. Pour cela, il faut déclarer l'objet comme public. On peut rendre un objet public au moment de l'upload :

$ aws s3 cp --acl public-read hello.txt s3://oc-calculsdistribues/hello.txt 
upload: ./hello.txt to s3://oc-calculsdistribues/hello.txt
$ curl https://s3-eu-west-1.amazonaws.com/oc-calculsdistribues/hello.txt
bonjour openclassrooms !

Ou bien après l'upload, à l'aide de la commandes3api:

$ aws s3api put-object-acl --acl public-read --bucket oc-calculsdistribues --key hello.txt

Pour supprimer un bucket sur S3, il faut d'abord le vider de son contenu, puis utiliser la commanderb("remove bucket") :

$ aws s3 rb s3://oc-calculsdistribues
remove_bucket failed: s3://oc-calculsdistribues An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty
$ aws s3 ls s3://oc-calculsdistribues                                                                                                                                                             
2017-03-02 17:10:11         25 hello.txt
$ aws s3 rm s3://oc-calculsdistribues/hello.txt                                                                                                                                                   
delete: s3://oc-calculsdistribues/hello.txt
$ aws s3 rb help
$ aws s3 rb s3://oc-calculsdistribues
remove_bucket: oc-calculsdistribues

Il est possible de réaliser toutes les opérations sur AWS à partir des différentes API existantes. Vous pouvez consulter les commandes existantes et leur documentation à l'aide de l'argumenthelp. Par exemple :

$ aws help
$ aws s3 help
$ aws s3 ls help

Et bien sûr, vous êtes libres de consulter la documentation officielle de S3 pour en savoir plus. Mais avec ces quelques commandes très simples vous pouvez déjà aller très loin !

Exemple de certificat de réussite
Exemple de certificat de réussite