Trouver les journaux d’octobre parmi un million
Une boutique range ses journaux web dans un bucket S3, un fichier par jour depuis des années. Vous voulez seulement ceux d’octobre. Ouvrir un million de fichiers n’est pas possible.
S3 sait lister les fichiers dont le nom commence d’une certaine façon. Cette leçon montre comment lister un bucket S3 par préfixe.
À la fin de cette leçon
Remarque
Je peux retrouver des fichiers d’un bucket grâce à un préfixe.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Objet | un fichier rangé, avec ses informations | |
| Clé | le nom complet d’un objet dans un bucket | journaux/2026-10-01/web.log |
| Préfixe | le début d’une clé | |
| Délimiteur | un caractère qui coupe une clé en niveaux | / |
| Préfixe commun | un début en forme de dossier que plusieurs clés partagent |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un bucket contient des objets à clé
Un bucket contient des objets. Un objet, ce sont les octets d’un fichier plus des informations comme sa taille. Chaque objet a une clé, son nom complet, et c’est par elle qu’on le retrouve.
Il n’y a pas d’arbre de dossiers à l’intérieur. Le bucket est une seule liste plate de clés. Une clé comme journaux/2026-10-01/web.log est juste un long nom qui contient des barres obliques.
Lire un listing
reponse = {
"Name": "boutique-journaux",
"Prefix": "",
"KeyCount": 4,
"IsTruncated": False,
"Contents": [
{"Key": "images/chat.png", "Size": 4, "StorageClass": "STANDARD"},
{"Key": "journaux/2026-10-01/web.log", "Size": 17, "StorageClass": "STANDARD"},
{"Key": "journaux/2026-10-02/web.log", "Size": 6, "StorageClass": "STANDARD"},
{"Key": "lisezmoi.txt", "Size": 5, "StorageClass": "STANDARD"},
],
}
for objet in reponse["Contents"]:
print(objet["Key"], objet["Size"])
# Additionnez les Size de tous les objets et affichez le total.
Erreur fréquente
Attention
Beaucoup croient qu’un bucket S3 contient de vrais dossiers. Ce n’est pas le cas. La barre oblique est seulement un caractère de la clé. Un dossier apparaît dans un listing parce que plusieurs clés commencent pareil, et il disparaît avec son dernier objet.
Un préfixe liste les clés qui commencent pareil
En listant un bucket, vous pouvez donner un préfixe. S3 ne renvoie alors que les clés qui commencent par lui. Le préfixe journaux/2026-10-01/ trouve un jour de journaux et rien d’autre.
C’est S3 qui filtre, donc votre code n’a jamais à lire tout le bucket. La réponse rappelle le préfixe envoyé et compte les clés trouvées dans KeyCount.
Filtrer les clés par préfixe
cles = [
"images/chat.png",
"journaux/2026-10-01/base.log",
"journaux/2026-10-01/web.log",
"journaux/2026-10-02/web.log",
"lisezmoi.txt",
]
prefixe = "journaux/2026-10-01/"
trouvees = []
for cle in cles:
if cle.startswith(prefixe):
trouvees.append(cle)
print("KeyCount :", len(trouvees))
print(trouvees)
# Mettez "journaux/" comme préfixe et relancez. Combien de clés maintenant ?
Un délimiteur regroupe les clés en dossiers
Imaginons que vous vouliez les dossiers placés juste sous journaux/, pas tous les fichiers. Donnez le délimiteur / en plus du préfixe. S3 coupe chaque clé à la première barre oblique après le préfixe.
Les clés qui partagent la même coupure reviennent une seule fois, comme préfixe commun, dans CommonPrefixes. Les clés sans barre oblique après le préfixe restent dans Contents, comme avant.
Trouver les dossiers sous journaux/
cles = [
"journaux/2026-10-01/base.log",
"journaux/2026-10-01/web.log",
"journaux/2026-10-02/web.log",
]
prefixe = "journaux/"
communs = []
for cle in cles:
reste = cle[len(prefixe):]
barre = reste.find("/")
if barre != -1:
dossier = prefixe + reste[:barre + 1]
if dossier not in communs:
communs.append(dossier)
prefixes = []
for un in communs:
prefixes.append({"Prefix": un})
reponse = {"Prefix": prefixe, "Delimiter": "/", "CommonPrefixes": prefixes}
print(reponse)
# Ajoutez la clé "journaux/2026-10-03/web.log" à cles. Relancez.
Une clé absente répond de deux façons
Demander un objet qui n’existe pas est une erreur. Les deux appels diffèrent. get_object répond avec le Code NoSuchKey. head_object, qui ne demande que les informations, n’a pas de corps pour porter un nom : son Code est "404".
Les deux ont le statut 404. Testez le statut quand vous voulez couvrir les deux cas.
Essayez-le dans le lab cloud
Le lab cloud est une copie d'entraînement de S3, SQS et DynamoDB. Appuyez sur Démarrer le lab dans la barre, puis sur Exécuter pour chaque commande ci-dessous. Elles utilisent la vraie ligne de commande AWS, les mêmes mots marchent donc sur un vrai compte. Les deux dernières commandes affichent une liste avec le dossier logs/2026-10-01/ dans CommonPrefixes, puis l'erreur NoSuchKey. Cette étape sert à s'exercer. Le travail ci-dessous reste du Python simple : vous pouvez le faire sans le lab.
Donnez une clé inventée et l'adresse du lab
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1 AWS_ENDPOINT_URL=http://cloud:4566Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Créez un bucket
aws s3 mb s3://prefix-labAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Rangez un objet sous une clé à barres
aws s3 cp /etc/hostname s3://prefix-lab/logs/2026-10-01/web.logAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Listez avec un préfixe et un délimiteur
aws s3api list-objects-v2 --bucket prefix-lab --prefix logs/ --delimiter /Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Demandez une clé qui n'existe pas
aws s3api get-object --bucket prefix-lab --key nothing.txt /dev/nullAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.