đȘŁ AWS S3 (Simple Storage Service)
Guide complet IDEO-Lab : Stockage Objet, Classes, Policies (IAM/Bucket), Lifecycle, Versioning & Encryption.
Concept : Objet (Clé/Valeur)
S3 n'est pas un File System. C'est un "Key-Value Store" plat (stockage objet).
Key-Value Flat NamespaceConcept : Bucket & Namespace
Le "contenant" (dossier racine). Nom globalement unique (DNS).
Bucket Global NamespaceConcept : Strong Consistency
(Important) Cohérence forte (Read-after-Write) pour tous les PUT/DELETE.
Strong Consistency AtomicClasse : S3 Standard
Défaut. AccÚs fréquent, latence ms. Multi-AZ (99.99% dispo).
Standard Hot DataClasse : Intelligent-Tiering
(RecommandĂ©) Tiering automatique (Frequent â Infrequent) sans frais.
Intelligent-Tiering Auto-TieringClasse : Standard-IA / OneZone-IA
AccĂšs > 30 jours. Moins cher au stockage, payant Ă la lecture (Retrieval).
Infrequent Access Retrieval FeeClasse : Glacier (Archive)
Instant (ms), Flexible (min/heures), Deep Archive (12h). Archivage long terme.
Glacier Deep ArchiveSécu : Block Public Access (BPA)
(Crucial) Le "bouton ON" de la sécurité. Bloque tout accÚs public (compte/bucket).
BPA Security Best PracticeSécu : Bucket Policies (JSON)
Le "Pare-feu" du bucket (Resource-based). Autoriser/Refuser par IP, VPC...
Bucket Policy JSONSécu : IAM vs Bucket Policy
IAM (User-based) vs Bucket Policy (Resource-based). Un "Deny" gagne toujours.
IAM Evaluation LogicSécu : ACLs & Object Ownership
(Legacy) à désactiver. Utiliser "Bucket Owner Enforced" (Moderne).
ACL (Legacy) Object OwnershipChiffrement : Par Défaut (SSE-S3)
(Automatique) Tous les objets sont chiffrés (AES-256) par défaut.
SSE-S3 Default EncryptionChiffrement : SSE-KMS
Utilise vos propres clés (CMK) KMS. Permet audit (CloudTrail) & rotation.
SSE-KMS CMK AuditChiffrement : S3 Bucket Key
(FinOps) Réduit les coûts KMS de 99% en partageant une clé temporaire.
Bucket Key KMS CostGestion : Versioning
Garde un historique (v1, v2, v3). ProtÚge contre suppression/écrasement.
Versioning Delete MarkerGestion : Lifecycle Rules
RĂšgles (XML/JSON). (Ex: Standard -> Glacier (90j) -> Delete (365j)).
Lifecycle TieringGestion : Object Lock (WORM)
(Compliance) Bloque la suppression (Mode Governance ou Compliance).
Object Lock WORMPerf : Multipart Upload
(Vitesse) Upload en parallĂšle (chunks). Obligatoire > 5GB.
Multipart ParallelAccĂšs : Presigned URLs (SigV4)
URL (temporaire) pour donner accÚs (Read/Write) à un objet privé.
Presigned URL SigV4AccĂšs : CloudFront (OAC)
(Best Practice) Servir S3 (privé) via CloudFront (CDN) avec OAC.
CloudFront OAC OAI (Legacy)Perf : S3 Select
Filtrer (SQL) un CSV/JSON/Parquet cÎté S3 (Server-side).
S3 Select Data Filtering9.1. Prix du Stockage (par Classe)
Le coût principal (pilier n°1) est le Stockage ($/GB/Mois). Le prix ($) diminue à mesure que la classe devient "froide" (moins accessible).
Disclaimer : Les prix (USD) sont des estimations (relatives) (pour us-east-1) et changent. Vérifiez toujours le calculateur officiel.
| Classe de Stockage | Coût ($/GB/Mois) (Estimé) | Latence AccÚs | Frais de Récupération ($/GB) |
|---|---|---|---|
| S3 Standard | ~ $0.023 (Base) | Millisecondes | Aucun |
| S3 Intelligent-Tiering | ~ $0.023 (Tiers Fréquent) | Millisecondes | Aucun (mais frais $/objet de monitoring) |
| S3 Standard-IA | ~ $0.0125 (Moins cher) | Millisecondes | Oui (~ $0.01 / GB) |
| S3 One Zone-IA | ~ $0.01 (Encore moins cher) | Millisecondes | Oui (~ $0.01 / GB) |
| S3 Glacier Instant | ~ $0.004 | Millisecondes | TrĂšs ĂlevĂ© (~ $0.03 / GB) |
| S3 Glacier Flexible | ~ $0.0036 | Minutes / Heures | Bas (Standard) / Gratuit (Bulk) |
| S3 Glacier Deep Archive | ~ $0.00099 (Le moins cher) | Heures (12h+) | ĂlevĂ© (~ $0.02 / GB) |
9.2. Prix des RequĂȘtes (API)
C'est le pilier n°2 (souvent oubliĂ©). Vous payez (un petit montant) par appel API, facturĂ© (gĂ©nĂ©ralement) par 1 000 requĂȘtes.
Coûts (Estimés) (us-east-1, Classe Standard)
PUT, COPY, POST, LIST: ~ $0.005 / 1 000 requĂȘtes. (Les requĂȘtes "d'Ă©criture" ou "de liste" (intensives) sont plus chĂšres).GET, SELECT, HEAD: ~ $0.0004 / 1 000 requĂȘtes. (Les requĂȘtes "de lecture" (simples) sont moins chĂšres).DELETE: Gratuit (gĂ©nĂ©ralement).Lifecycle Transitions: ~ $0.01 / 1 000 requĂȘtes. (CoĂ»t pour chaque transition (ex: Standard -> IA)).
Le PiĂšge des Petits Objets (FinOps)
(Scénario) : Vous stockez 1 Milliard (1 000 000 000) de petits fichiers (logs) (de 1 KB chacun).
Analyse de Coût (Mensuel) :
- (Coût Stockage) : 1 Milliard * 1 KB = 1 TB. (
1 TB * $0.023/GB) â $23.55 / mois (NĂ©gligeable). - (CoĂ»t RequĂȘtes - Upload) : 1 Milliard
PUT. (1M * 1000 * $0.005) = $5 000.00 / mois. - (CoĂ»t RequĂȘtes - Lifecycle) : (Si vous archivez) 1 Milliard Transitions. (
1M * 1000 * $0.01) = $10 000.00 / mois.
(Conclusion) : Le coĂ»t des RequĂȘtes (API) ($15 000) est massivement supĂ©rieur au coĂ»t du Stockage ($23).
(Solution) : Compresser / "Batcher" (regrouper) les petits fichiers (logs) en un seul gros fichier (ex: 1 fichier de 100MB) (via Kinesis Firehose, ou batch local) avant l'upload. (1 PUT (100MB) coûte $0.000005).
9.3. Frais de Transfert (Data Transfer)
C'est le pilier n°3. (Le "coût réseau").
| Type de Transfert | Destination | Coût (Estimé) |
|---|---|---|
| Data Transfer IN (Ingress) | (Internet) -> S3 | Gratuit |
| S3 -> EC2 (MĂȘme RĂ©gion) | S3 (Paris) -> EC2 (Paris) | Gratuit |
| S3 -> CloudFront (Origine) | S3 (Paris) -> CloudFront (Edge) | Gratuit (Data Transfer Out to CloudFront) |
| Data Transfer OUT (Egress) | S3 -> Internet (Client) | TrĂšs Cher (ex: ~ $0.09 / GB) |
| Cross-Region Replication (CRR) | S3 (Paris) -> S3 (Francfort) | Payant (ex: ~ $0.02 / GB) |
| Inter-AZ (EC2) | S3 (Paris) -> EC2 (Paris, Autre AZ) | Payant (ex: ~ $0.01 / GB) |
Optimisation (Ăviter Egress $0.09/GB)
- 1. CloudFront (CDN) : (Si données publiques/statiques). Mettez CloudFront (devant S3). (Le
S3 -> CloudFrontest gratuit. LeCloudFront -> Internetest (généralement) moins cher (ex:$0.085/GB) et offre un "Free Tier" (1TB/mois)). - 2. VPC Endpoint (Gateway) : (Si données privées/EC2). Si vos EC2 (dans un Subnet Privé) accÚdent à S3 via un NAT Gateway (payant), le trafic (S3 -> NAT -> EC2) est facturé (Data Processed + Data Transfer).
(Solution) : Utilisez un VPC Endpoint (Gateway) (pour S3). Le trafic (S3 -> EC2) devient privé (reste sur le réseau AWS) et GRATUIT.
9.4. Politiques de Réduction des Coûts (Checklist FinOps)
1. Utiliser le Bon "Tiers" (Stockage)
- (Auto) S3 Intelligent-Tiering : (Le choix "facile") Pour les workloads (charges) inconnus ou variables. Laisse AWS optimiser (Standard <-> IA).
- (Manuel) Lifecycle Policies : Pour les workloads prévisibles (ex:
/logs/). (Action :TransitionversGlacier Deep Archive(9.1) aprĂšs X jours).
2. Nettoyer (Expiration)
- (Action) : Utiliser les Lifecycle Policies (Expiration) (4.2).
Expire current versions: (ex: Supprimer/logs/aprÚs 7 ans).Expire noncurrent versions: (ex: Supprimer les anciennes versions (Versioning) aprÚs 30 jours (Coût caché n°1)).Abort incomplete multipart uploads: (ex: Nettoyer les "parts" (morceaux) échoués aprÚs 7 jours (Coût caché n°2)).
3. Réduire la Taille (Objet)
- (Action) : Compresser (
gzip,zstd) les fichiers (texte, JSON, CSV) cÎté client (avant l'upload). - (Gain) : Réduit (Stockage $/GB) + (Transfert $/GB) + (Améliore Vitesse Upload/Download).
4. RĂ©duire les RequĂȘtes (API)
- (Action) : Agréger (Batcher) les millions de petits fichiers (logs 1KB) en un seul gros fichier (100MB) (via Kinesis Firehose, ou script local) avant l'upload (9.2).
5. Réduire le Transfert (Réseau)
- (Action) : Utiliser CloudFront (CDN) (pour Internet) et VPC Endpoints (Gateway) (pour Interne/EC2) (9.3).
9.5. Cas Pratique (Calcul de Facture Mensuelle)
Disclaimer : Les prix (USD) sont fictifs (estimations) (basés us-east-1) à des fins illustratives.
Scénario 1 : "Standard" (Data Lake "Chaud")
- Stockage : 1 TB (1024 GB) (en
S3 Standard) - Objets : 10 000 000 (10M) (assez gros, 100KB/objet)
- RequĂȘtes (Ăcriture) : 1 Million
PUT/ mois - RequĂȘtes (Lecture) : 50 Millions
GET/ mois - Transfert (Sortie) : 100 GB (vers Internet)
1. Stockage: 1024 GB * $0.023/GB = $ 23.55
2. RequĂȘtes (PUT): (1M / 1000) * $0.005 = $ 5.00
3. RequĂȘtes (GET): (50M / 1000) * $0.0004 = $ 20.00
4. Transfert (OUT): 100 GB * $0.09/GB = $ 9.00
---------------------------------------------------
TOTAL (Estimé) : = $ 57.55 / Mois
Scénario 2 : "Archive" (Backup Froid)
- Stockage : 1 TB (1024 GB) (en
S3 Glacier Deep Archive) - RequĂȘtes (Ăcriture) : 1 Million
PUT/ mois (via LifecycleStandard -> Glacier) - RequĂȘtes (Lecture) : 0 (Rien n'est lu, c'est une archive)
1. Stockage: 1024 GB * $0.00099/GB (Deep) = $ 1.01
2. RequĂȘtes (PUT/Transition):
(1M / 1000) * $0.005 (PUT Standard) = $ 5.00
(1M / 1000) * $0.05 (Transition Deep) = $ 50.00 (Coût "one-shot" de l'archivage !)
---------------------------------------------------
TOTAL (Mois 1) : = $ 56.01
TOTAL (Mois 2+) (Idle) : = $ 1.01 / Mois
8.1. Architecture Serverless Simple (S3 + Lambda + DynamoDB)
C'est l'architecture "classique" (EDA - Event-Driven Architecture) pour le traitement de données ou les microservices.
Scénario : Une application (Frontend) permet aux utilisateurs d'uploader une photo de profil (.jpg) et un "nom d'utilisateur" (metadata).
(Client/App)
|
(1. PUT 'photo.jpg' + Metadata 'x-amz-meta-user: user123')
|
v
[ đȘŁ S3 Bucket ]
|
(2. Event Notification (s3:ObjectCreated))
|
v
[ đ„ AWS Lambda (Fonction) ]
(
3. Code Python (Boto3):
- Lit l'Event JSON (bucket/key)
- Appelle s3:HeadObject (Lit 'x-amz-meta-user: user123')
- Appelle dynamodb:PutItem
)
|
v
[ đŠ DynamoDB (Table 'Metadata') ]
(4. Stocke : { PK: "photo.jpg", user: "user123" })
RĂŽles des Services
- S3 : Stockage illimité (PaaS) (la "donnée" brute) + Déclencheur (Trigger) asynchrone (l'"événement").
- Lambda : Le "Cerveau" (FaaS) (la "colle"). (Exécute la logique métier : "Lire les métadonnées de S3").
- DynamoDB : La Base de Données (PaaS) (l'"index"). (Stocke les métadonnées (rapides, indexées, serverless) pour permettre à l'App de "chercher" (
Query) les photos par utilisateur).
8.2. Architecture Data Lake (S3 â Glue â Athena â QuickSight)
S3 est la fondation du "Data Lake" moderne. C'est le réceptacle (pas cher, durable, illimité) pour toutes les données de l'entreprise (brutes et transformées).
(Sources: IoT, Logs, BDD...)
|
v
[ đȘŁ S3 (Zone "Raw" / "Bronze") ] (Stocke les .CSV, .JSON bruts)
|
v
[ đ€ AWS Glue (Job ETL) ] (Script Spark/Python)
( (1) Lit 'Raw', (2) Nettoie, (3) Joint, (4) Convertit en Parquet, (5) Partitionne )
|
v
[ đȘŁ S3 (Zone "Processed" / "Gold") ] (Stocke les .parquet (partitionnĂ©s))
|
v
[ đ AWS Athena (Service SQL) ] (Scan S3/Parquet via 'Glue Data Catalog')
|
v
[ đ Amazon QuickSight (BI) ] (Dashboard / Visualisation)
Partitionnement (Data Lake)
(Le PiÚge du Coût) : Athena (et Glue/EMR) est facturé au $/TB scanné (lu).
(Mauvais Design) : /logs/log-01.parquet, /logs/log-02.parquet... (1 Pétaoctet).
(RequĂȘte) : SELECT * ... WHERE date = '2025-11-17' -> (Athena scanne 1 PĂ©taoctet = $5,000 USD).
(Bon Design - Partitionnement "Hive") : L'ETL (Glue) doit écrire (partitionner) les données dans S3 en utilisant des "préfixes" (pseudo-dossiers) Clé=Valeur.
/logs/year=2025/month=11/day=17/fichier1.parquet
/logs/year=2025/month=11/day=18/fichier2.parquet
(RequĂȘte) : SELECT * ... WHERE year=2025 AND month=11 AND day=17 -> (Athena (via "Partition Pruning") ne scanne que le prĂ©fixe day=17/ (ex: 500 GB) = $2.50 USD).
8.3. Architecture CDN (S3 + CloudFront)
C'est l'architecture standard pour la distribution (rapide, globale) et sécurisée d'assets (fichiers) statiques (Images, Vidéos, CSS, JS, Builds React/Vue).
Flux (Performant & Sécurisé)
(Utilisateur - Paris)
|
(1. GET 'logo.png' (Latence 10ms))
|
v
[ đ CloudFront (Edge Location: Paris) ]
|
(2. Cache "MISS" (PremiĂšre fois))
|
v
[ (Interne) OAC (Origin Access Control) ]
|
(3. Autorisé (via Bucket Policy))
|
v
[ đȘŁ S3 Bucket (Origine: Francfort) ] (Reste 100% PRIVĂ)
Composants Clés
- S3 (Bucket Privé) : L'origine (source de vérité). Il doit rester 100% PRIVà (Block Public Access = ON).
- CloudFront (Distribution) : Le CDN (Réseau de Diffusion de Contenu). Il "met en cache" (copie) les objets (
logo.png) dans 450+ Edge Locations (Points de Présence) (ex: Paris, Lyon, Marseille) (proche des utilisateurs). - OAC (Origin Access Control) : (Remplace OAI (Legacy)). C'est la "permission" (basée Service) que vous mettez dans la Bucket Policy de S3, qui dit : "
Allow s3:GetObjectuniquement (Principal) au Service CloudFront (et (Condition) Ă ma Distribution (SourceArn))".
Signed URLs (Contenu Privé)
Pour distribuer du contenu privé (ex: facture-client-123.pdf) via le CDN :
- (S3) L'objet
facture.pdfest privé (OAC). - (App) Votre App (EC2/Lambda) génÚre (signe) une URL CloudFront Signée (pas une URL S3 Signée) (valide 5 min).
- (Client) Le client utilise cette URL (
.../facture.pdf?Expires=...&Signature=...). - (CloudFront) Valide la signature -> Si OK -> (Fetch) RécupÚre l'objet (via OAC) -> Sert au client.
8.4. Architecture Big Data (S3 comme Datastore EMR)
C'est le concept de Découplage (Désolidarisation) du Stockage (Storage) et du Calcul (Compute) pour les workloads Big Data (Hadoop, Spark).
Architecture Traditionnelle (Hadoop / HDFS)
(Serveur 1) [ CPU | RAM | Disque 1 (Data) ]
(Serveur 2) [ CPU | RAM | Disque 2 (Data) ]
(ProblĂšme) : Le Stockage (HDFS) et le Calcul (MapReduce/Spark) sont couplĂ©s (liĂ©s). Si vous voulez plus de stockage (Disque 3), vous ĂȘtes obligĂ© d'acheter (et payer) plus de CPU/RAM (Serveur 3) (et vice-versa).
Architecture Moderne (EMR + EMRFS/S3)
(Stockage "Infini", Pas cher)
[ đȘŁ S3 (Data Lake / HDFS "virtuel") ]
|
(EMRFS)
|
v
[ âïž EMR Cluster (Calcul) ]
|
+-- [ EC2 Master Node ]
+-- [ EC2 Core Nodes (ASG) ] <-- (Compute)
+-- [ EC2 Task Nodes (Spot) ] <-- (Compute)
(Découplage) : EMRFS (E M R File System) est un "driver" qui permet à EMR (Spark/Hadoop) d'utiliser S3 comme s'il s'agissait d'HDFS.
(Avantages) :
- Scalabilité Indépendante : Vous pouvez scaler le Stockage (S3) (infini) ou le Calcul (EC2) (ASG) séparément.
- FiabilitĂ© (11 9s) : Les donnĂ©es (sur S3) sont protĂ©gĂ©es (Multi-AZ), mĂȘme si un NĆud EC2 (Compute) meurt.
- Coût (FinOps) : Vous pouvez terminer (éteindre) le Cluster EMR (Calcul) (ex: la nuit, coût EC2 = $0) et les données (Stockage) (sur S3) persistent (à faible coût).
- CoĂ»t (Spot) : Vous pouvez utiliser des NĆuds "Task" (Calcul pur) 100% Spot Instances (non-persistants, -90% coĂ»t).
8.5. Archivage Entreprise & DR (Disaster Recovery)
Utilisation de S3 (et de ses classes) pour la rétention (archivage) long-terme et la reprise aprÚs sinistre (Disaster Recovery Plan - DRP).
Flux 1 : Archivage (Lifecycle)
Remplacement des "bandes (Tapes) LTO". Les données (ex: Backups RDS, Snapshots EC2) sont envoyées sur S3 (Standard) puis "descendues" (automatiquement) via une Lifecycle Policy (RÚgle de Cycle de Vie).
(Data) -> [S3 Standard] -> (AprĂšs 30j) -> [S3 Standard-IA] -> (AprĂšs 90j) -> [S3 Glacier Deep Archive]
(Objectif) : Rétention long-terme (ex: 7-10 ans) au coût (GB/mois) le plus bas possible (Glacier Deep Archive).
Flux 2 : Disaster Recovery (DR) (Multi-Région)
Archiver c'est bien, mais si la Région (ex: Paris) tombe en panne ? Il faut une copie (DR) dans une autre Région (ex: Francfort).
On utilise CRR (Cross-Region Replication) (Réplication Inter-Région).
(Serveur Backup On-Premise)
|
(Upload)
|
v
[ đȘŁ S3 Bucket (Source) (RĂ©gion: Paris (eu-west-3)) ]
| (Lifecycle: "Expire aprĂšs 30 jours")
|
(CRR (Replication) Activée)
|
v
[ đȘŁ S3 Bucket (Destination-DR) (RĂ©gion: Francfort (eu-central-1)) ]
(Lifecycle: "Transition vers Glacier Deep Archive aprĂšs 30 jours")
(S3 Object Lock: "Compliance Mode 7 ans")
(Flux Hybride) :
- Le backup (On-Prem) est uploadé à Paris (Source) (pour restauration "chaude" rapide, si besoin).
- CRR copie (immédiatement) le backup à Francfort (Destination-DR).
- (Paris) La Lifecycle (Source) supprime le backup (chaud) aprÚs 30 jours (pour économiser).
- (Francfort) La Lifecycle (Destination) archive le backup (froid) vers Glacier Deep Archive (pour rétention 7 ans (Compliance)).
7.1. Static Website Hosting
S3 peut ĂȘtre configurĂ© pour agir comme un serveur web (HTTP) (similaire Ă Apache/Nginx) pour hĂ©berger du contenu statique (HTML, CSS, JS, React build, images...).
Configuration (Legacy)
- (Bucket) Activer "Static website hosting".
- (Bucket) Spécifier le
index.html(document racine) eterror.html(document d'erreur 404). - (Sécurité) Désactiver (OFF) le "Block Public Access (BPA)" (au niveau du Bucket).
- (Sécurité) Ajouter une Bucket Policy (JSON) publique :
{ "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::mon-site-web-statique/*" }
(Inconvénients) : 1. Le bucket est public. 2. L'endpoint (...s3-website...) ne supporte pas HTTPS (SSL).
Bonne Pratique (Moderne) : CloudFront + OAC
Ne jamais utiliser l'endpoint "Static Website" (public) directement. La bonne pratique est :
- (S3) Garder le bucket 100% PRIVà (BPA Activé (ON)).
- (CloudFront) Créer une Distribution (CDN).
- (CloudFront) Utiliser OAC (Origin Access Control) (plutĂŽt que OAI (Legacy)) comme "Origine".
- (CloudFront) Copier la Bucket Policy (générée par OAC) dans S3 (qui
Allowuniquementcloudfront.amazonaws.com).
(Résultat) : Le site est servi (globalement) en HTTPS (via CloudFront), et le bucket (source) reste 100% privé.
7.2. S3 Object Lambda (Transformation "à la volée")
C'est une fonctionnalité (PaaS) qui permet d'exécuter une fonction Lambda (compute) pour modifier (transformer) le contenu d'un objet S3 pendant (à la volée) qu'il est téléchargé (GetObject).
(Important) : L'objet (original) sur S3 n'est jamais modifié. La transformation est (uniquement) appliquée à la réponse (GET).
Flux (Exemple : Redimensionnement d'Image)
(Client/App) <-- (RequĂȘte HTTP 'GET image.jpg?width=200')
|
v
[ âïž S3 Object Lambda (Access Point) ]
|
(Appel API 'GetObject' (interne))
|
v
[ đȘŁ S3 Bucket ] (Lit 'image.jpg' (Original, 10MB))
|
(S3 envoie l'objet (10MB) Ă la Lambda)
|
v
[ đ„ Fonction Lambda ]
(Code Python (Pillow) :
1. Lit '?width=200' (Request Params)
2. Redimensionne l'image (10MB -> 150KB)
3. Retourne (Stream) l'image (150KB) )
|
v
(Client/App) <-- (Réponse HTTP 200) (Reçoit l'image (150KB))
Cas d'Usage
- Redimensionner / Watermarker des images (à la volée).
- Filtrer / Anonymiser (PII) des données (ex: "Masquer (
***) la colonne 'Nom' d'un CSV (5GB) avant de le renvoyer à l'utilisateur 'Analyste-Junior'"). - Décompresser (
.gz) un fichier (à la volée) pour un client (léger) qui ne gÚre pas Gzip.
7.3. S3 Event Notifications (Triggers)
C'est le "systÚme nerveux" de S3. Il permet au Bucket de publier (pousser) un événement (notification JSON) (de maniÚre asynchrone) lorsque quelque chose se passe.
ĂvĂ©nements (Triggers) Configurables
s3:ObjectCreated:*(Le plus courant) (Déclenché parPUT,POST,COPY,CompleteMultipartUpload).s3:ObjectRemoved:*(Déclenché parDELETE,DeleteMarkerCreated).s3:ObjectRestore:*(Déclenché quand une restauration (Glacier) estInitiatedouCompleted).
(Vous pouvez (aussi) filtrer par Préfixe (ex: images/) ou Suffixe (ex: .jpg)).
Destinations (OĂč va l'Ă©vĂ©nement ?)
- đ„ AWS Lambda (Fonction) : (Le plus courant) "S3 -> Lambda".
- đš SQS (File d'attente) : (Bonne Pratique) (Pour le dĂ©couplage/buffering) "S3 -> SQS -> Lambda". (Permet de gĂ©rer les "retries" et les pics de charge).
- đŁ SNS (Topic) : (Bonne Pratique) (Pour "Fan-out") "S3 -> SNS -> (Lambda + SQS + Email...)".
Architecture Serverless Typique (S3 â Lambda)
(Utilisateur)
|
(1. PUT 'photo.jpg' (Upload))
|
v
[ đȘŁ S3 Bucket ]
|
(2. Event (s3:ObjectCreated) (JSON))
|
v
[ đ„ AWS Lambda (Fonction) ]
(
3. Code Python (Boto3):
- Lit l'Event JSON (bucket/key)
- s3:GetObject('photo.jpg')
- Crée thumbnail (Pillow)
- s3:PutObject('thumb/photo.jpg')
)
7.4. S3 Inventory (Inventaire Complet)
ProblÚme : J'ai 10 Milliards d'objets (10 Pétaoctets) dans un bucket. Comment puis-je les lister (tous) (pour audit/analyse) ?
(Anti-Pattern) : Utiliser l'API ListObjectsV2 (paginĂ©e). (Prendrait des semaines et coĂ»terait trĂšs cher (en requĂȘtes LIST)).
Solution : S3 Inventory
C'est un service (configuré sur le Bucket Source) qui génÚre (automatiquement) un "rapport" (inventaire) complet (de tous les objets) (quotidiennement ou hebdomadairement).
Fonctionnement
- (Config) Vous activez "S3 Inventory" (sur
Bucket-A). - (Config) Vous choisissez Quoi lister (Champs :
Size,StorageClass,EncryptionStatus,ObjectLockInfo,LastModifiedDate...). - (Config) Vous choisissez le Format (Sortie) :
CSV,ORC, ou (Recommandé)Apache Parquet. - (Config) Vous choisissez la Destination (ex:
Bucket-B(Logs)). - (Run) (Tous les jours/semaines) S3 (service) scanne
Bucket-Aet écrit le "Manifest" (inventaire) (ex:.../inventory.parquet) dansBucket-B.
Intégration Athena (Analyse SQL)
La vraie puissance est que cet inventaire (.parquet) est automatiquement intégrable (query-able) avec AWS Athena.
(Usage Audit/FinOps) : Vous pouvez (via Athena) "requĂȘter" (SQL) l'Ă©tat de vos 10 Milliards d'objets :
-- (Ex: Trouver tous les objets NON chiffrés)
SELECT * FROM s3_inventory_table
WHERE encryption_status = 'NOT_SSE';
-- (Ex: Trouver le coût (estimé) des anciennes versions)
SELECT sum(size) FROM s3_inventory_table
WHERE is_latest = false;
7.5. Glacier Vault (Service "Legacy")
(Attention) : Ceci n'est PAS la "Classe de Stockage S3 Glacier" (2.4). C'est l'ancien service (Legacy) "Amazon S3 Glacier" (qui a sa propre API, glacier.amazonaws.com).
Concepts (Legacy)
- Vault (Coffre-fort) : C'est le "contenant" (l'équivalent d'un "Bucket" S3).
- Archive : C'est la "donnée" (l'équivalent d'un "Objet" S3).
- API (Séparée) : (Complexe) Nécessitait 2 étapes (
InitiateJob(Demande) -> (Attendre 4h) ->GetJobOutput(Télécharger)).
Politiques de "Vault Locks" (WORM)
C'est la fonctionnalitĂ© (Compliance) "WORM" (Write Once, Read Many) du service Glacier (Legacy). C'est (l'ancĂȘtre) de "S3 Object Lock (4.4)".
Une "Vault Lock Policy" (JSON) est une politique (que vous attachez au Vault) que vous pouvez verrouiller (Lock) (la rendant immutable (impossible Ă modifier/supprimer, mĂȘme par le Root)).
-- (Ex: RÚgle "WORM" : Rétention 7 ans)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BlockDeleteBefore7Years",
"Effect": "Deny",
"Principal": "*",
"Action": "glacier:DeleteArchive",
"Resource": "arn:aws:glacier:eu-west-3:111:vaults/MonVault",
"Condition": {
"NumericLessThan": { "glacier:ArchiveAgeInDays": "2555" }
}
}
]
}
(Bonne Pratique Moderne) : Ne plus utiliser le service "S3 Glacier (Vault)" (Legacy). Toujours utiliser le service "S3" (API unifiée) avec les Classes de Stockage S3 Glacier Deep Archive (2.4) et (si WORM) S3 Object Lock (4.4).
6.1. CloudWatch Metrics (Métriques Agrégées)
Fournit des métriques (agrégées) sur les tendances (trends) du bucket. Idéal pour les Graphes (Dashboards) et les Alarmes.
Types de Métriques
- Storage Metrics (Métriques de Stockage) : (Gratuit, 1x/jour, par Bucket)
BucketSizeBytes: Volume total (Taille) des données (Toutes classes).NumberOfObjects: Nombre total d'objets (Toutes versions).
- Request Metrics (MĂ©triques de RequĂȘtes) : (Payant, Opt-in (Ă activer), granularitĂ© 1 min, par Bucket ou PrĂ©fixe)
AllRequests,GetRequests,PutRequests: Nombre de requĂȘtes (total, GET, PUT...).4xxErrors: (Erreurs Client) Ă ALARMER. (Indique des404 Not Foundou403 Forbidden).5xxErrors: (Erreurs Serveur) Ă ALARMER. (Indique un problĂšme (rare) du service S3).FirstByteLatency/TotalRequestLatency: Performance (ms) (Latence) des requĂȘtes.
(Usage) : Créer une Alarme CloudWatch (ex: ALARM IF 4xxErrors > 1000 (in 5 min)) -> Action (Notifier (SNS) l'équipe Dev).
6.2. AWS CloudTrail (Audit API : "Qui a fait Quoi ?")
CloudTrail est le service d'Audit (Journal d'audit) de tout le compte AWS. Il rĂ©pond Ă la question : "Qui (IAM User/Role) a fait Quoi (API Call) Quand (Timestamp) OĂč (Source IP) ?".
Management Events (Control Plane)
- (Activé par Défaut) (Rétention 90 jours (Event History)).
- Loggue les actions "sur" le bucket (le "ContrĂŽle").
- Exemples :
CreateBucket,DeleteBucket,PutBucketPolicy(!!),DeleteBucketLifecycle. - Usage (Sécurité) : "Qui a modifié la Bucket Policy (pour la rendre publique) hier soir ?"
Data Events (Data Plane)
- (Désactivé par Défaut) (Payant, Volumineux, Opt-in).
- Loggue les actions "dans" le bucket (les "Données").
- Exemples :
GetObject(Lecture),PutObject(Ăcriture),DeleteObject(Suppression).
(Bonne Pratique / Compliance) : Activer (via un "Trail" (audit)) les "Data Events" (au minimum "Write") sur les buckets sensibles (ex: bucket-prod-secrets) (malgré le coût).
Usage (Audit) : "Qui (IAM:UserA) a DeleteObject (supprimé) le fichier rapport-secret.pdf ?".
6.3. S3 Server Access Logging (Logs HTTP Bruts)
C'est l'Ă©quivalent du access.log (Apache/Nginx) pour S3. C'est un fichier texte (brut) (livrĂ© "best-effort" dans un autre bucket S3) qui loggue chaque requĂȘte HTTP reçue par le bucket.
CloudTrail (6.2) vs Server Access Logs (6.3)
Ils se ressemblent mais répondent à des questions différentes :
- CloudTrail (Audit) : "Qui (IAM) a fait l'appel API (
GetObject) ?" (Focus : Sécurité AWS). - Access Logs (HTTP) : "Qui (IP) a fait l'appel (
GET) ? Quel était le User-Agent ? Quel était le Referer (Site d'origine) ? Quelle était la Raison du 403 (ex:SignatureDoesNotMatch) ?" (Focus : Analyse de trafic, Debug HTTP).
Exemple de Log (Format Brut)
[ID_BUCKET] 1.2.3.4 [Time] "GET /images/logo.png HTTP/1.1" 403 AccessDenied 102 10
"https://mon-site.com/" "Mozilla/5.0... (Chrome)" - (HostId...)
(Raison de l'échec: SignatureDoesNotMatch)
(InconvĂ©nient) : ExtrĂȘmement verbeux (gĂ©nĂšre des millions de mini-fichiers logs). (Difficile Ă analyser sans Athena (6.5)).
6.4. S3 Storage Lens (Dashboard FinOps & Sécurité)
C'est le Dashboard (Tableau de Bord) d'Observabilité de S3. Il fournit une vue (agrégée) (au niveau Organisation AWS, Compte, Bucket, ou Préfixe) de l'utilisation (Usage) du stockage.
Il est essentiel pour l'Optimisation des Coûts (FinOps).
Questions auxquelles Storage Lens Répond
- (Global) "OĂč sont mes 50 PĂ©taoctets ? (RĂ©partition par RĂ©gion, par Compte)".
- (FinOps) "Quel est le % de mes données en
StandardvsGlacier?" - (FinOps) "Combien de GB de mes données sont des Anciennes Versions (NonCurrent) ?" (Coût caché du Versioning (4.3)).
- (FinOps) "Combien de GB sont des Uploads Multipart Incomplets ?" (Coût caché (4.2)).
- (FinOps) "Quel est mon Taux de Retrieval (Lecture) sur mes buckets
Standard-IA?" (Si 50%, c'est un mauvais choix de classe, il faut repasser enStandard). - (Sécurité) "Quel % de mes buckets n'est pas chiffré (Encryption) ?"
- (Sécurité) "Quel % de mes buckets autorise l'accÚs public ?"
Tiers (Gratuit vs Payant)
- Free (Défaut) : (Gratuit) 15 métriques (niveau Bucket), rétention 14 jours. (Suffisant pour débuter).
- Advanced (Payant) : (Coût
$/objet/mois) +35 métriques (descend au niveau Préfixe), rétention 15 mois, recommandations FinOps (IA).
6.5. Amazon Athena (Interroger les Logs S3 en SQL)
ProblĂšme (Logs Bruts)
Vos Logs d'AccÚs S3 (6.3) ou vos Logs CloudTrail (6.2) sont stockés dans un bucket S3 sous forme de millions de fichiers .log.gz (Texte/JSON).
(Question) : "Trouver toutes les IP (srcIP) qui ont eu une erreur 403 sur l'objet secret.pdf le 10 Novembre."
(Réponse Manuelle) : Impossible (grep sur des Pétaoctets ?).
Solution (Athena - Serverless SQL)
AWS Athena est un service Serverless (PaaS) qui permet d'exĂ©cuter des requĂȘtes SQL (ANSI) directement sur les fichiers (donnĂ©es) stockĂ©s dans S3.
Flux (Mise en Place)
- (Logs) (Automatique) Les Logs (CloudTrail/S3) arrivent dans
s3://mon-bucket-logs/. - (Glue) (Semi-Auto) Utiliser un AWS Glue Crawler (Robot) pour scanner
s3://mon-bucket-logs/et inférer (deviner) le "schéma" (les colonnes:ip, timestamp, action...). - (Glue) Le Crawler crée (automatiquement) une "Table" (Métadonnées) (ex:
cloudtrail_logs) dans le Glue Data Catalog. - (Athena) (Manuel) Ouvrir la console Athena, sélectionner la table
cloudtrail_logs.
ExĂ©cution (RequĂȘte SQL)
-- (Syntaxe SQL Presto/Trino)
SELECT
useridentity.username,
sourceipaddress,
eventtime
FROM
cloudtrail_logs
WHERE
eventname = 'DeleteObject'
AND requestparameters LIKE '%secret.pdf%'
AND eventtime BETWEEN '2025-11-10T14:00:00Z' AND '2025-11-10T15:00:00Z';
(Coût FinOps) : Athena est facturé au $/TB (Téraoctet) scanné (ex: $5.00 / TB). (Bonne Pratique : Toujours stocker les logs en format Parquet (Colonnes) et Partitionné (par Date) (ex: /year=2025/month=11/) pour réduire (drastiquement) la quantité (TB) scannée (et le coût).
5.1. Performance Upload/Download (Débit)
Multipart Upload (Pour 1 Fichier Volumineux)
C'est la méthode (API) pour uploader un fichier volumineux (unique) (ex: 50 GB) en morceaux ("parts") parallÚles.
- Recommandé : Pour tout objet de > 100 MB.
- Obligatoire : Pour tout objet de > 5 GB (un
PUTsimple (non-multipart) est limité à 5 GB). - Avantage (Vitesse) : (Parallélisation) Vous pouvez uploader 10 "parts" de 100MB (via 10 threads) en parallÚle, saturant ainsi votre bande passante (vs 1 seul thread linéaire).
- Avantage (Résilience) : Si la Part 5 (sur 10) échoue (timeout), vous n'avez qu'à re-tenter (retry) la Part 5 (pas les 4.5 GB précédents).
- (Note) : Les outils (AWS CLI (
aws s3 cp), SDKs (Boto3)) gĂšrent (automatiquement) le Multipart pour vous.
Parallélisation (Pour Plusieurs Fichiers)
Pour uploader plusieurs (ex: 10 000) petits fichiers, la performance vient (aussi) de la parallélisation (multi-threading).
- (Upload) : L'AWS CLI (
aws s3 sync) utilise (par dĂ©faut) 10 "threads" (travailleurs) pour uploader 10 fichiers en parallĂšle. (Peut ĂȘtre augmentĂ© (--max-concurrent-requests 100)). - (Download) : (Byte-Range Fetches) Pour tĂ©lĂ©charger 1 fichier (unique) de 10GB (trĂšs vite), les clients (comme S3 Browser) peuvent initier 10
GETparallĂšles (chacun demandant 1GB via un Header HTTPRange: bytes=...).
S3 Transfer Acceleration (S3TA)
C'est une option (niveau Bucket) qui accélÚre les uploads (PUT) / downloads (GET) longue distance (cross-continent).
(ProblÚme) : Un utilisateur (à Sydney, Australie) uploade 1GB vers un bucket (à Paris, France) (via Internet public = lent, latence élevée, perte de paquets).
(Solution S3TA) :
- (Admin) Active S3TA (sur le bucket).
- (Admin) L'utilisateur (Sydney) uploade (via un DNS spécial :
)..s3-accelerate.amazonaws.com - (Flux) S3TA route (via DNS) l'utilisateur vers la Edge Location (CDN) AWS la plus proche (ex:
Sydney-Edge). - (Flux) L'upload (Sydney -> Sydney-Edge) est rapide (latence faible).
- (Flux) AWS (interne) transfÚre le fichier (Sydney-Edge -> S3 Paris) via le Backbone (réseau privé) optimisé d'AWS (pas l'Internet public).
(Coût) : Facturé ($/GB) (plus cher que le Data Transfer standard). (Utile si > 500km).
5.2. Optimisation du Stockage (FinOps)
1. Choix des Classes (Tiering)
C'est la stratégie n°1. Ne pas tout laisser en S3 Standard (le plus cher).
- Stratégie 1 (Automatique) :
S3 Intelligent-Tiering. (Recommandé). Laissez AWS (IA) analyser l'accÚs (objet par objet) et le déplacer (automatiquement) vers le Tiers (IA/Archive) approprié (sans frais de "Retrieval"). - Stratégie 2 (Manuelle) :
S3 Lifecycle Policies. (Pour les patterns prévisibles). (Ex:/logs/-> (30j) ->Standard-IA-> (90j) ->Glacier Deep Archive-> (3650j) ->Expire (Delete)).
2. Analyse (Storage Lens)
S3 Storage Lens est le "dashboard" (gratuit ou payant (avancé)) d'observabilité FinOps. Il vous donne une vue (globale, par compte, par bucket, par préfixe) de votre stockage pour trouver les gaspillages.
Il répond à :
- "OĂč sont mes 10 PĂ©taoctets ?" (Total GB, Nb Objets).
- "Combien (
%) de mes données sont dansStandardvsGlacier?" - (Action FinOps) "Combien (
GB) de mes données sont des Anciennes Versions (NonCurrent) ?" (Coût caché du Versioning -> Activer Lifecycle (4.2)). - (Action FinOps) "Combien (
GB) de mes données sont des Uploads Multipart Incomplets ?" (Coût caché -> Activer Lifecycle (4.2)). - "Combien (
%) de mes objets ne sont pas chiffrés ?" (Audit Sécurité).
3. Compression (Client-Side)
C'est une optimisation (cÎté client) avant l'upload. (S3 ne compresse pas les données pour vous).
(Exemple) : Fichier logs.json (100 MB, Texte) -> gzip logs.json.gz (10 MB, Compressé).
(Tradeoff) : CPU (Client) vs (Ăconomies x3) :
- Coût Stockage (S3) : Vous payez (stockage) 10 MB (au lieu de 100 MB).
- Coût Data Transfer (Out) : (Si lu par EC2/Athena) Vous payez (transfert) 10 MB (au lieu de 100 MB).
- Performance (Upload/Download) : Le transfert (
PUT/GET) est 10x plus rapide (10 MB vs 100 MB).
(Recommandé) : Toujours compresser (gzip, zstd (moderne), snappy (Big Data)) les fichiers "texte" (Logs, JSON, CSV). (Ne pas compresser .jpg, .mp4 (déjà compressés)).
5.3. Optimisation des RequĂȘtes (Performance)
Préfixes Optimisés (Contre le "Throttling")
Le Goulot d'Ătranglement (Hot Prefix) : S3 garantit une performance (massive) de 3 500 PUT/s ou 5 500 GET/s... par PrĂ©fixe (pseudo-dossier).
(ProblĂšme) : 10 000 (IoT Devices) tentent d'uploader (simultanĂ©ment) vers le mĂȘme prĂ©fixe :
(Device 1) -> PUT /logs/2025/11/17/device1.log
(Device 2) -> PUT /logs/2025/11/17/device2.log
...
(Device 10000) -> PUT /logs/2025/11/17/device10000.log
(RĂ©sultat) : Les 3500 premiĂšres requĂȘtes/sec (sur le prĂ©fixe /logs/2025/11/17/) passent. Les 6500 suivantes reçoivent une erreur 503 Slow Down (Throttling).
(Solution) : Ajouter de l'Entropie (Randomness) au début (ou juste aprÚs) le préfixe (pour "Sharder" (éclater) le trafic sur plusieurs préfixes logiques) :
(Device 1 - Hash 'a1') -> PUT /logs/a1/2025/11/17/device1.log (Prefix 1)
(Device 2 - Hash 'b2') -> PUT /logs/b2/2025/11/17/device2.log (Prefix 2)
...
(Device 10000 - Hash 'f9') -> PUT /logs/f9/2025/11/17/device10000.log (Prefix N)
Partitionnement Logique (Data Lake)
C'est une optimisation (similaire) mais pour le Coût (Scan) (ex: avec AWS Athena).
(Mauvais Design) : /logs/device1.log, /logs/device2.log ... (1 Pétaoctet dans 1 Préfixe).
(RequĂȘte Athena) : SELECT * FROM logs WHERE date = '2025-11-17' -> (Athena doit scanner 1 PĂ©taoctet = $5,000 USD).
(Bon Design - Hive Style Partitioning) :
/logs/year=2025/month=11/day=17/file1.parquet
(RequĂȘte Athena) : SELECT * FROM logs WHERE year=2025 AND month=11 AND day=17 -> (Athena (via "Partition Pruning") ne scanne que le prĂ©fixe day=17/ (ex: 500 GB) = $2.50 USD).
S3 Select (Filtrage CÎté Serveur)
Permet d'exĂ©cuter une requĂȘte (SQL-like) directement sur 1 objet S3 (CSV, JSON, Parquet) et de ne rĂ©cupĂ©rer que le rĂ©sultat (pas le fichier entier).
(ProblÚme) : Télécharger (GetObject) un fichier CSV (Gzip) de 5 GB (pour trouver 10 lignes) -> (Lent, coûteux (Data Transfer 5GB), intensif (CPU Lambda/EC2 pour dézipper/parser)).
(Solution) : SelectObjectContent (API) :
SELECT s._1, s._5
FROM S3Object s
WHERE s._2 = 'Paris' AND s._3 = 'Completed'
(Résultat) : S3 (cÎté serveur) dézippe, parse le CSV (5GB), filtre les 10 lignes, et ne vous renvoie (réseau) que 1 KB. (Jusqu'à 400% plus rapide, 80% moins cher).
4.1. Lifecycle Policies (Auto-archivage / Transitions)
Les RÚgles de Cycle de Vie (Lifecycle Policies) sont le principal outil FinOps (Optimisation des Coûts) de S3. Ce sont des rÚgles (JSON/XML) (définies au niveau du Bucket) qui automatisent le déplacement (Transition) des objets vers des classes de stockage moins chÚres.
Les rÚgles s'appliquent sur un Filtre (ex: Préfixe logs/ OU Tag status:archive).
Flux de Transition (Exemple "Logs")
(Action: "Transition current version")
Jour 0: Upload -> [ S3 Standard ] (AccÚs fréquent)
|
(AprĂšs 30 Jours)
|
v
(Transition) -> [ S3 Standard-IA ] (AccÚs rare, -40% coût)
|
(AprĂšs 90 Jours (total))
|
v
(Transition) -> [ S3 Glacier Flexible ] (Archive, -68% coût)
|
(AprĂšs 365 Jours (total))
|
v
(Transition) -> [ S3 Glacier Deep Archive ] (Archive légale, -95% coût)
PiÚges de Coût (FinOps)
- 1. Frais de Transition (Petits Objets) : AWS facture des frais par objet (ex:
$0.01 / 1000 objets) pour chaque transition (Standard -> IA, IA -> Glacier).
(PiÚge) : Si vous transitionnez 1 million de petits fichiers logs (de 1KB), le coût de la transition ($10) sera supérieur à l'économie de stockage ($0.50). (Ne pas transitionner les objets < 128KB). - 2. Durée Minimale (Early Delete) :
Standard-IA= 30 jours min.Glacier Instant= 90 jours min.Glacier Deep Archive= 180 jours min.
(PiÚge) : Si vous transitionnez un objet versGlacier Deep Archive(180j) et le supprimez aprÚs 100 jours, AWS vous facturera (pénalité "Early Delete") les 80 jours restants.
4.2. Expiration Rules (Suppression Automatique)
L'Expiration est la deuxiÚme action (aprÚs "Transition") d'une RÚgle de Cycle de Vie (4.1). Elle supprime (DELETE) définitivement les objets aprÚs X jours, pour éviter les coûts inutiles (FinOps).
Actions d'Expiration (Cas d'Usage)
| Action (Lifecycle) | Description | Cas d'Usage (Exemple) |
|---|---|---|
| Expire current object versions | Supprime l'objet (version actuelle) aprÚs X jours (depuis sa création). | (Logs) "Supprimer (Expire) /logs/ aprÚs 3650 jours (10 ans)" (Rétention légale). |
| Expire noncurrent object versions | (Si Versioning (4.3) activé) Supprime les anciennes versions (v1, v2...) X jours aprÚs qu'elles soient devenues "non-current". | (Crucial FinOps) "Supprimer (Expire) les anciennes versions (NonCurrent) aprÚs 60 jours" (pour économiser du stockage). |
| Delete expired object delete markers | (Si Versioning (4.3) activé) Supprime (nettoie) les "Delete Markers" (Marqueurs de suppression) orphelins. | (Nettoyage) Activer (true) si vous expirez les "NonCurrent versions". |
| Abort incomplete multipart uploads | (Nettoyage) Supprime (Expire) les "Parts" (morceaux) d'uploads (PUT) qui ont échoué (et qui sont facturés pour rien). | (Bonne Pratique n°1) TOUJOURS créer cette rÚgle : "Abort... aprÚs 7 jours" (sur tous les buckets). |
4.3. Versioning (Historique des Fichiers)
Le Versioning (Gestion des versions) est un paramÚtre (Niveau Bucket) qui agit comme un "filet de sécurité" (protection contre la suppression accidentelle ou l'écrasement).
Une fois ActivĂ© (Enabled), il ne peut ĂȘtre que Suspendu (Suspended) (jamais "DĂ©sactivĂ©" (Disabled)).
Flux (Avec Versioning Activé)
- (Upload v1)
PUT rapport.pdf(v1) -> CréeID: AAAA(VersionCurrent(Actuelle)). - (Upload v2)
PUT rapport.pdf(v2) -> CréeID: BBBB(VersionCurrent). (ID: AAAA(v1) devientNonCurrent(Ancienne)). - (Lecture)
GET rapport.pdf-> Lit toujours la versionCurrent(ID: BBBB(v2)). - (Lecture v1)
GET rapport.pdf?versionId=AAAA-> (Permet de lire l'ancienne versionv1).
Le PiĂšge du "Delete Marker" (Suppression)
- (Suppression)
DELETE rapport.pdf(sur un bucket "versioned") : - Ne supprime RIEN (ni v1, ni v2).
- Crée (au-dessus) un "Delete Marker" (Marqueur de suppression) (
ID: CCCC) qui devientCurrent. - (Lecture)
GET rapport.pdf-> (LitID: CCCC(Current)) -> S3 renvoie404 Not Found(l'objet "semble" supprimé).
(Restauration) : Pour "restaurer" le fichier (v2), il suffit de supprimer (DELETE) le "Delete Marker" (ID: CCCC). (ID: BBBB (v2) redevient Current).
Impact sur le Coût (FinOps)
Vous ĂȘtes facturĂ© pour le stockage de TOUTES les versions (Current + NonCurrent (v1, v2...)).
(Bonne Pratique) : Toujours combiner le Versioning avec une RĂšgle Lifecycle (4.2) (ex: "Expire noncurrent object versions aprĂšs 60 jours") pour nettoyer les anciennes versions.
4.4. Object Lock (WORM - Rétention Légale)
C'est une fonctionnalitĂ© (type WORM : Write Once, Read Many) qui verrouille un objet (une version spĂ©cifique) pour empĂȘcher sa suppression ou sa modification, (gĂ©nĂ©ralement pour des raisons lĂ©gales ou de conformitĂ©).
(PrĂ©-requis) : 1. Le Versioning (4.3) doit ĂȘtre activĂ©. 2. L'Object Lock doit ĂȘtre activĂ© Ă la CRĂATION du bucket (vous ne pouvez pas l'activer sur un bucket existant).
Les 2 Modes de Rétention (Retention)
Vous uploadez un objet (PUT) en spécifiant une "Date de Rétention" (ex: 1 an) et un "Mode" :
| Mode | Niveau de Protection | Qui peut le supprimer (avant expiration) ? |
|---|---|---|
| Governance Mode (Gouvernance) | ProtÚge contre les suppressions accidentelles (ex: scripts fous). | (Utilisateurs privilégiés) Le Root (ou un User/Role avec la permission IAM spéciale : s3:BypassGovernanceRetention). |
| Compliance Mode (ConformitĂ©) | Protection Absolue (RĂ©tention lĂ©gale/SEC). (Le fichier NE PEUT PAS ĂȘtre supprimĂ©). | PERSONNE. (Ni vous, ni le Root, ni AWS). L'objet est verrouillĂ© (immutable) jusqu'Ă la date d'expiration. |
Legal Hold (Mise en attente légale)
C'est un verrou (booléen ON/OFF) indépendant de la Rétention. Il n'a pas de date de fin.
Usage : (Audit/Litige) Un Auditeur (avec permission s3:PutObjectLegalHold) active le Legal Hold (ON). L'objet ne peut plus ĂȘtre supprimĂ© (mĂȘme si la RĂ©tention (ex: 1 an) expire). L'Auditeur doit (manuellement) le remettre (OFF) Ă la fin de l'enquĂȘte.
4.5. Replication (Cross-Region & Same-Region)
La Réplication est une rÚgle (au niveau Bucket) qui copie (automatiquement et de maniÚre asynchrone) les nouveaux objets (PUT, DELETE...) d'un Bucket (Source) vers un Bucket (Destination).
(PrĂ©-requis) : Le Versioning (4.3) doit ĂȘtre activĂ© sur le bucket Source ET le bucket Destination.
1. CRR (Cross-Region Replication) - (Inter-Région)
La Destination (Bucket B) est dans une autre Région AWS.
Exemple : Bucket-A (Paris, eu-west-3) -> (CRR) -> Bucket-B (Francfort, eu-central-1)
- Cas d'Usage 1 (DR/PRA) : Disaster Recovery. Si toute la Région
eu-west-3(Paris) tombe (panne majeure), les données (backups) sont saines et sauves à Francfort. - Cas d'Usage 2 (Latence) : (Optimisation Lecture) Vous avez des clients (Lecteurs) en Asie. Vous répliquez (CRR) les objets (statiques) vers
ap-southeast-1(Singapour) (pour qu'ils (via CloudFront) lisent depuis Singapour (rapide) plutĂŽt que Paris (lent)).
(RTC) : Vous pouvez (option payante) activer Replication Time Control (RTC), qui garantit (SLA) que 99.99% des objets sont répliqués en moins de 15 minutes.
2. SRR (Same-Region Replication) - (MĂȘme RĂ©gion)
La Destination (Bucket B) est dans la mĂȘme RĂ©gion (ex: Paris -> Paris).
- Cas d'Usage 1 (Log Aggregation) : (Agrégation de Logs) 10 Buckets (ALB-Logs, App-Logs...) (Sources) répliquent (SRR) tous leurs nouveaux objets (
.log) vers 1 seul Bucket central (central-log-bucket) (Destination) (pour analyse (Athena)). - Cas d'Usage 2 (Sécurité / Multi-Compte) : (Isolation)
Bucket-Prod (Compte A)-> (SRR) ->Bucket-Backup (Compte B). (Le Compte B (Backup) est 100% verrouillé (Deny All), protégeant les copies contre un piratage (ex: vol de clés) du Compte A).
3.1. IAM Policies (Identity-based)
Les Policies IAM sont "Identity-based" (basées sur l'Identité). Elles sont attachées à un User, un Group, ou un Role (EC2, Lambda).
Elles répondent à la question : "Qu'est-ce que cet Utilisateur/RÎle (Identité) a le droit de faire (Actions) sur quelles ressources ?".
Actions (Verbes S3)
s3:GetObject: (Lecture) Droit de tĂ©lĂ©charger le contenu d'un objet.s3:PutObject: (Ăcriture) Droit d'uploader (crĂ©er/Ă©craser) un objet.s3:DeleteObject: (Suppression) Droit de supprimer un objet.s3:ListBucket: (Listage) Droit de voir (lister) le contenu (les clĂ©s) d'un bucket.s3:GetBucketLocation: (Info) Droit de "trouver" (ping) un bucket.
Le PiĂšge : ListBucket (Bucket) vs GetObject (Objets)
(PiÚge n°1) : Pour fonctionner, ListBucket s'applique à l'ARN du Bucket, mais GetObject s'applique à l'ARN des Objets (/*).
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListBucket",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::mon-bucket"
]
},
{
"Sid": "AllowReadObjects",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::mon-bucket/*"
]
}
]
}
3.2. Bucket Policies (Resource-based)
Les Bucket Policies (Politiques de Bucket) sont "Resource-based" (basĂ©es sur la Ressource). Elles sont attachĂ©es au Bucket S3 lui-mĂȘme.
Elles répondent à la question : "Qui (Principal) a le droit d'accéder à moi (ce Bucket) ?".
C'est l'outil principal pour : 1) Donner un accĂšs Cross-Compte (Compte B -> Compte A). 2) Restreindre l'accĂšs (ex: IP, VPC). 3) Donner l'accĂšs Ă un Service AWS (ex: CloudFront).
Exemple 1 : Forcer SSL (HTTPS)
(Refuse (Deny) toute action (*) si la connexion n'est pas aws:SecureTransport = true).
{
"Sid": "ForceSSL",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::mon-bucket/*",
"Condition": {
"Bool": { "aws:SecureTransport": "false" }
}
}
Exemple 2 : Restreindre Ă CloudFront (OAC) (Best Practice)
(Autorise (Allow) GetObject uniquement au Principal: Service: cloudfront.amazonaws.com ET si l'appel vient de votre Distribution (aws:SourceArn)).
{
"Sid": "AllowCloudFrontOAC",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mon-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/E123ABCDEF456"
}
}
}
3.3. ACL (Access Control List) - (Héritage/Legacy)
Les ACLs sont le systĂšme de sĂ©curitĂ© "originel" (historique) de S3 (avant IAM/Bucket Policies). Elles sont (gĂ©nĂ©ralement) dĂ©finies en XML et peuvent ĂȘtre attachĂ©es au Bucket ou (pire) Objet par Objet.
Pourquoi Ăviter les ACLs (Le PiĂšge de "l'Object Ownership")
(ProblÚme Historique) : Par défaut (avec ACLs activées), si un Compte B (ex: un partenaire) uploade (PUT) un objet (fichier.log) dans un Bucket (appartenant au Compte A) :
- Le Compte B devient Propriétaire (Owner) de l'Objet (
fichier.log). - Le Compte A est propriétaire du Bucket.
- Résultat (Fou) : Le Compte A (Propriétaire du Bucket) ne peut pas lire/supprimer
fichier.log(car il n'en est pas propriétaire).
La Bonne Pratique (Désactiver les ACLs)
Aujourd'hui, la meilleure pratique est de DĂSACTIVER les ACLs.
- (Console S3 -> Bucket -> Permissions)
- ParamÚtre "Object Ownership" (Propriété de l'objet)
- Choisir :
Bucket owner enforced(Propriétaire du bucket appliqué).
(RĂ©sultat) : Les ACLs sont dĂ©sactivĂ©es. Le PropriĂ©taire du Bucket (Compte A) devient (automatiquement) propriĂ©taire de tous les objets (mĂȘme ceux uploadĂ©s par le Compte B). (La sĂ©curitĂ© est uniquement gĂ©rĂ©e via IAM (3.1) et Bucket Policies (3.2)).
3.4. Encryption (Chiffrement "At-Rest")
(Défaut 2023) : Aujourd'hui, S3 chiffre (crypte) automatiquement 100% des nouveaux objets uploadés (en utilisant SSE-S3 par défaut).
| Méthode | Nom (Header API) | Gestion de la Clé (Qui ?) | Avantage (Cas d'usage) |
|---|---|---|---|
| SSE-S3 (Server-Side) | AES256 | AWS S3 (Clé maßtresse S3) | Défaut (Transparent). Gratuit. Zéro configuration. (Pas d'audit sur la clé). |
| SSE-KMS (Server-Side) | aws:kms | AWS KMS (Votre Clé CMK) | ContrÎle & Audit (CloudTrail). Vous (via IAM) contrÎlez qui (kms:Decrypt) peut lire. (Coût KMS). |
| SSE-C (Server-Side) | (N/A - Headers custom) | Vous (Client) | Vous (Client) fournissez la clé de chiffrement (AES-256) (via Header HTTPS) à chaque PUT et chaque GET. (AWS ne stocke jamais la clé). |
| Client-Side (CÎté Client) | (N/A) | Vous (Client) (SDK) | Vous (via S3 Encryption SDK) chiffrez l'objet avant le PUT. S3 ne stocke que du binaire (chiffré). (ContrÎle total "Zéro Trust"). |
3.5. Block Public Access (BPA)
(Le Verrou de Sécurité n°1) C'est un "interrupteur" (garde-fou) qui écrase (override) toute autre configuration (Bucket Policy (3.2), ACL (3.3)) qui tenterait (accidentellement) de rendre un bucket public.
(Bonne Pratique) : Toujours ACTIVER (ON) (les 4 paramĂštres) au niveau du Compte (Account).
Les 4 ParamĂštres (Niveau Compte ou Bucket)
Block new public ACLs(Bloquer les nouvelles ACLs publiques) :- (Refuse les
PUT Objectqui ont une ACLpublic-read).
- (Refuse les
Ignore public ACLs(Ignorer les ACLs publiques existantes) :- (Ignore toutes les ACLs
public-readsur le bucket).
- (Ignore toutes les ACLs
Block new public bucket policies(Bloquer les nouvelles policies publiques) :- (Refuse les
PutBucketPolicyqui contiennent"Effect": "Allow"pour"Principal": "*").
- (Refuse les
Restrict public buckets(Restreindre les policies publiques existantes) :- (Ignore toutes les policies publiques (sauf services (ex: CloudFront OAC (3.2)) ou Cross-Compte)).
(Seule Exception) : Le seul cas oĂč l'on dĂ©sactive (partiellement) BPA (Block... policies) est pour l'HĂ©bergement de Site Web Statique (Legacy). (La bonne pratique (moderne) est d'utiliser CloudFront + OAC (3.2), qui permet de garder BPA ActivĂ© (ON)).
3.6. S3 Access Points (Points d'AccĂšs)
C'est une fonctionnalité (avancée) pour gérer l'accÚs (granulaire) à un bucket partagé (Shared Bucket).
ProblĂšme (1 Bucket, 50 Ăquipes)
Vous avez 1 "Data Lake" (bucket-datalake). 50 équipes (Ventes, Marketing, BI...) y écrivent/lisent (dans leurs "préfixes" (/ventes/, /marketing/)).
(Le PiÚge) : Vous devez gérer 1 seule Bucket Policy (3.2) (JSON) monstrueuse (de 20 000 lignes) pour gérer les permissions (Allow Ventes -> /ventes/, Allow Marketing -> /marketing/...). (Ingérable, risque d'erreur élevé).
Solution (Access Points)
Vous (Admin) créez un Point d'AccÚs (Access Point) (un "alias" DNS) pour chaque équipe. Chaque Access Point a sa propre Policy IAM (simple).
(Bucket "bucket-datalake") <-- (Policy : Vide)
|
+--- [ AccessPoint "AP-Ventes" ] (ARN: ...:accesspoint/ap-ventes)
| (Policy AP: "Allow (Principal: Role-Ventes) -> (Action: *) -> (Resource: .../ap-ventes/object/ventes/*)")
|
+--- [ AccessPoint "AP-Marketing" ] (ARN: ...:accesspoint/ap-marketing)
(Policy AP: "Allow (Principal: Role-Marketing) -> (Action: Get) -> (Resource: .../ap-marketing/object/marketing/*)")
(Résultat) : L'équipe "Ventes" (via son RÎle IAM) ne parle jamais au "bucket-datalake", elle parle (uniquement) à l'Alias (ARN) ap-ventes. (La sécurité est déléguée et segmentée).
Multi-VPC Access Points
Permet (via PrivateLink) de crĂ©er un Access Point (privĂ©) qui est accessible (via VPC Endpoints (3.7)) depuis plusieurs VPCs (mĂȘme Cross-Compte), sans nĂ©cessiter de Peering/TGW.
3.7. VPC Endpoints (AccÚs Privé)
ProblÚme : Une EC2 (ou Lambda) est dans un Subnet Privé (sans accÚs Internet / NAT GW). Elle doit (via Boto3) appeler s3:GetObject. L'API S3 (s3.eu-west-3.amazonaws.com) est (par défaut) publique (sur Internet).
(Résultat) : Connection Timeout (L'EC2 Privée ne peut pas joindre l'API S3).
Solution : VPC Endpoint (Gateway Type)
C'est une "passerelle" (virtuelle) qui connecte (magiquement) votre VPC (privé) au service S3 (public), en utilisant le réseau privé (backbone) d'AWS (le trafic ne va jamais sur Internet).
Fonctionnement (Routage)
- (Admin) "Create Endpoint" -> Type: Gateway -> Service:
s3(oudynamodb). - (Admin) Cochez la Route Table (
rt-private) de votre Subnet PrivĂ©. - (AWS) AWS ajoute (automatiquement) une nouvelle RĂšgle (Route) Ă
rt-private:
# (Dans la Route Table Privée)
Destination: pl-12345... (C'est la "Prefix List" (IPs publiques) de S3 eu-west-3)
Target: vpce-67890... (L'ID de l'Endpoint Gateway)
(Flux) : (EC2 Privée) boto3.client('s3') -> (Route Table) -> (Match pl-12345) -> (Envoie le trafic (privé) au vpce-67890) -> (AWS Backbone) -> (Service S3).
(Avantages) : 1. Sécurité (le trafic ne quitte pas AWS). 2. FinOps (Coût) (C'est GRATUIT, et cela vous évite de payer les frais $/GB (Data Processed) d'un NAT Gateway).
2.1. Buckets (Contenants Logiques)
Le Bucket (Seau) est l'unité de stockage (le "contenant") de plus haut niveau dans S3. C'est l'équivalent conceptuel d'un "disque dur" ou d'une "partition" racine.
Nom Global (Namespace Unique)
(PiĂšge n°1) : Le nom d'un bucket (ex: mon-bucket) doit ĂȘtre globalement unique (unique au monde, sur tous les comptes AWS, toutes rĂ©gions confondues).
Raison : Historiquement, S3 utilise les noms de bucket comme sous-domaines DNS (ex: mon-bucket.s3.amazonaws.com).
(Bonne Pratique) : Toujours nommer vos buckets avec un préfixe unique (ex: ideo-lab-facturation-prod-euwest3).
Concepts Clés (Configuration au niveau Bucket)
Le Bucket est le niveau (ressource) sur lequel vous configurez :
- Région : Le bucket "vit" dans une Région (ex:
eu-west-3Paris). Les données ne quittent jamais cette Région (sauf si vous activez la "Replication"). - Versioning : (ON/OFF) Active ou non l'historique des versions (protection anti-delete).
- Encryption (par défaut) : (ON/OFF) Force (ou non) le chiffrement (ex: SSE-S3 ou SSE-KMS) pour tous les nouveaux objets uploadés.
- Policies (Bucket Policy) : Le "pare-feu" (JSON) du bucket (qui a le droit (IAM) d'y accéder ?).
- Lifecycle : Les "rÚgles d'archivage" (ex: "Déplacer vers Glacier aprÚs 90 jours").
- Logging : (Optionnel) Logguer (dans un *autre* bucket) tous les appels (
GET,PUT,403) faits Ă ce bucket (Server Access Logs).
2.2. Objets (Données)
L'Objet (Object) est l'entité fondamentale (le "fichier") que vous stockez dans S3. S3 est un service "Key-Value" (Clé-Valeur).
Structure d'un Objet
| Composant | Description | Exemple |
|---|---|---|
| Clé (Key) | (Requis) Le "Nom" (identifiant unique) de l'objet dans le bucket. | images/profil/user-123.jpg |
| Valeur (Value) | (Requis) Les donnĂ©es elles-mĂȘmes (le "contenu"). C'est juste une sĂ©quence de bytes (octets). | (Le binaire 0110... de l'image JPG) (Taille: 0 B Ă 5 TB). |
| Métadonnées (Metadata) | (Optionnel) Informations (dictionnaire Clé-Valeur) "sur" l'objet. | (Voir ci-dessous). |
| Version ID | (Si Versioning (2.1) activé) L'ID unique de cette "version" de l'objet. | a1b2c3d4... |
Types d'Objets & Métadonnées
(Important) : S3 est "agnostique". Il ne "sait" pas ce qu'est un .jpg ou un .csv. Il ne stocke que des bytes.
C'est la métadonnée Content-Type (que vous (client/SDK) fournissez à l'upload) qui "dit" au navigateur (client) comment interpréter ces bytes.
- (Métadonnée SystÚme) : Gérées par S3/HTTP (ex:
Content-Type: image/jpeg,Content-Length: 1024,ETag: "checksum..."). - (Métadonnée Utilisateur) : (Optionnel) Ajoutées par vous (à l'upload). Doivent commencer par
x-amz-meta-(ex:x-amz-meta-user-id: 12345).
2.3. Clés (Object Keys) & Préfixes (Pseudo-Dossiers)
Convention de Nommage (La Clé)
La "Clé" est le chemin (nom) complet de l'objet (max 1024 bytes, UTF-8). C'est l'identifiant unique (PK) dans un bucket.
Le Mythe des "Dossiers" (Préfixes)
(PiÚge n°2) : Il n'y a PAS de "dossiers" (répertoires) dans S3. S3 est un "Flat Namespace" (espace de nom plat).
Le caractÚre / (slash) n'est pas un séparateur de dossier. C'est juste un caractÚre (valide) dans le nom de la clé.
Exemple (Contenu d'un Bucket) :
(Clé 1) = "rapports/ventes/2024/janvier.pdf"
(Clé 2) = "rapports/ventes/2024/fevrier.pdf"
(Clé 3) = "index.html"
(Clé 4) = "images/logo.png"
(La Réalité) : Ce bucket contient 4 objets (clés). Il ne contient pas de "dossier" rapports/.
Simulation (Prefix & Delimiter)
La Console AWS (et les API) simulent des dossiers en utilisant le / comme Délimiteur (Delimiter).
Quand vous "Listez" (ListObjects) le bucket avec :
- Préfixe :
rapports/ventes/2024/ - Délimiteur :
/
S3 (l'API) vous renvoie :
- (Objets) :
janvier.pdf,fevrier.pdf - (CommonPrefixes) : (Aucun)
(Bonne Pratique) : Toujours utiliser des préfixes (/) logiques (app/user/id/) pour organiser les données (facilite le listage, le sharding (performance) et les rÚgles (Lifecycle, IAM)).
2.4. Classes de Stockage (Tiering)
S3 offre différentes "Classes" (Tiers) de stockage, qui équilibrent Coût (Stockage GB/mois), Coût (AccÚs/Retrieval), et Latence (Temps d'accÚs).
(Note : Toutes les classes (sauf One Zone-IA) ont la mĂȘme FiabilitĂ© (DurabilitĂ©) de 11 9s (2.1)).
| Classe | Latence AccÚs | Usage (AccÚs) | Coût (Stockage) | Coût (Retrieval) |
|---|---|---|---|---|
| Standard | Millisecondes | FrĂ©quent (DonnĂ©es "chaudes") | ĂlevĂ© | Aucun |
| Standard-IA (Infrequent) | Millisecondes | Rare (ex: < 1x/mois) | Moyen | Oui ($/GB) |
| One Zone-IA | Millisecondes | Rare (Données re-créables) | Bas | Oui ($/GB) |
| Glacier Instant Retrieval | Millisecondes | Archive (ex: < 1x/an) | TrĂšs Bas | TrĂšs ĂlevĂ© ($/GB) |
| Glacier Flexible Retrieval | Minutes / Heures | Archive (Backups) | TrĂšs Bas | Bas (ou Gratuit) |
| Glacier Deep Archive | Heures (12h+) | Archive Longue (Compliance) | Le Moins Cher | Moyen |
Archivage Automatique (Lifecycle & INT)
- 1. S3 Lifecycle Policy : (Manuel) Vous créez une RÚgle (ex: "
IFpréfixe=/logs/,THEN(AprÚs 30j) -> Transition (versStandard-IA),THEN(AprÚs 90j) -> Transition (versGlacier Deep Archive),THEN(AprÚs 3650j) -> Expire (Delete)"). - 2. S3 Intelligent-Tiering (Classe) : (Automatique) (Recommandé) Vous stockez l'objet dans la classe "INT". S3 (IA) monitore l'accÚs (sans frais de retrieval) et le déplace (automatiquement) entre les tiers (Standard, IA, Glacier Instant) pour vous.
2.5. Consistency Model (ModÚle de Cohérence)
(Mise Ă jour majeure de 2020) C'est un changement fondamental d'AWS S3. (L'ancienne "Eventual Consistency" est (presque) morte).
"Strong Read-after-Write Consistency" (Cohérence Forte)
S3 garantit désormais une cohérence forte (Strong Read-after-Write) pour toutes les opérations (PUT, GET, DELETE, LIST) dans toutes les Régions.
"Ce que vous écrivez (Write) est ce que vous lirez (Read) immédiatement aprÚs."
Impacts sur les Workloads
| Scénario | Comportement (Garanti) |
|---|---|
1. PUT (Nouveau) | (App) PUT objet-A (SuccÚs).(App) GET objet-A (Immédiat) -> SuccÚs (Lit objet-A). (Ne renvoie jamais 404 Not Found). |
2. PUT (Overwrite / Ăcrasement) | (App) PUT objet-A (v1) -> (App) PUT objet-A (v2) (SuccĂšs).(App) GET objet-A (ImmĂ©diat) -> SuccĂšs (Lit v2). (Ne renvoie jamais l'ancienne version v1). |
3. DELETE (Suppression) | (App) DELETE objet-A (SuccÚs).(App) GET objet-A (Immédiat) -> 404 Not Found (Garanti). (Ne renvoie jamais l'ancien objet). |
4. LIST (Listage) | (App) PUT objet-Z (SuccÚs).(App) LIST / (Immédiat) -> SuccÚs (objet-Z apparaßt dans la liste). |
(Impact) : Simplification massive des applications (Data Lakes, Big Data). Plus besoin d'utiliser des "caches de consistance" (ex: DynamoDB, Redis) pour savoir si un objet S3 *existe vraiment* (ce qui était nécessaire avant 2020 pour les LIST ou DELETE).
1.1. Quâest-ce quâAmazon S3 ? (Stockage Objet)
S3 (Simple Storage Service) est un service de stockage dâobjets (Object Storage). C'est le service de stockage le plus ancien et le plus fondamental d'AWS. Il n'est pas un disque dur (Block Storage) ni un dossier partagĂ© (File Storage).
S3 (Objet) vs EBS (Block) vs EFS (File)
| Type | Service AWS | Analogie | Cas d'usage |
|---|---|---|---|
| Objet (Key/Value) | S3 (Simple Storage Service) | Un "Vestiaire" (Ticket=Clé, Manteau=Objet). AccÚs via API HTTP (PUT, GET, DELETE). | Stockage "Infini" (Images, Vidéos, Logs, Backups, Assets Statiques). |
| Block (Disque Dur) | EBS (Elastic Block Store) | Un "Disque Dur" (virtuel, SAN). Formaté (XFS/EXT4). Attaché à 1 seule EC2. | Disque de Boot (OS), BDD (Haute perf IOPS). |
| File (Partagé) | EFS (Elastic File System) | Un "Dossier Partagé" (NAS / NFS). Monté (mount) sur plusieurs EC2s (Linux). | CMS (WordPress), Dossiers /home partagés, Code partagé. |
Les Piliers de S3
- Stockage "Illimité" : Il n'y a pas de limite (théorique) à la quantité de données (Pétaoctets) ou au nombre d'objets (Milliards) que vous pouvez stocker dans un bucket.
- Fiabilité (Durability) 11-9s : 99.999999999%. C'est la durabilité (non-perte de données) annuelle. (Si vous stockez 10 millions d'objets, vous pouvez (statistiquement) vous attendre à en perdre 1 tous les 10 000 ans).
- Comment (11-9s) ? : Quand vous uploadez un objet, S3 (automatiquement, en arriĂšre-plan) le rĂ©plique (copie) sur plusieurs (au moins 3) datacenters (Availability Zones) physiquement sĂ©parĂ©s (dans la mĂȘme RĂ©gion).
- Haute DisponibilitĂ© (Availability) : (SLA 99.99% (Standard)) Le service est conçu pour ĂȘtre accessible (lecture/Ă©criture) en permanence, mĂȘme en cas de panne d'une AZ (Datacenter).
1.2. Pourquoi utiliser S3 ? (Cas d'Usage)
S3 est utilisé lorsque vous avez besoin de stocker des "fichiers" (objets) de maniÚre fiable, scalable, et économique, accessibles via une API HTTP universelle (s3:PutObject, s3:GetObject).
- Stockage de Fichiers (Assets) : Le cas d'usage principal. Stocker les "user uploads" (photos de profil, vidéos), les assets (CSS, JS, images) d'un site web, les logs (
.log,.gz) des serveurs (EC2, ALB, CloudTrail). - Data Lakes (Lac de Données) : C'est la fondation des Data Lakes sur AWS. C'est le "réceptacle" (pas cher, illimité) pour toutes les données brutes (JSON, CSV, Parquet, IoT streams) avant qu'elles ne soient nettoyées (ETL) et analysées (Analytics).
- Backups & Disaster Recovery (DR) : C'est la destination "par défaut" pour tous les backups :
- Snapshots EBS (EC2)
- Snapshots RDS (Base de données)
pg_dump(Exports BDD)- Archives (via Lifecycle Policies vers S3 Glacier).
- Hébergement de Site Web Statique (Static Web Hosting) :
- Stocker (et servir) directement (via HTTP) un site web statique (ex: un build
React,Vue,Angular, ouHTML/CSS). (L'option "Static Website Hosting" du bucket).
- Stocker (et servir) directement (via HTTP) un site web statique (ex: un build
- Architectures Serverless & Big Data :
- S3 sert de Trigger (Déclencheur) (ex:
s3:ObjectCreated) pour AWS Lambda (ex: "DÚs qu'un.jpgest uploadé, déclenche cette Lambda pour créer un thumbnail"). - S3 sert de Source et de Destination pour les services Big Data (EMR, Glue, Athena).
- S3 sert de Trigger (Déclencheur) (ex:
1.3. S3 comme "Hub" Central des Données AWS
Dans AWS, S3 n'est pas "juste" un disque dur. C'est le "hub de données" (ou "databus") central (régional) qui connecte (presque) tous les autres services.
| Service AWS | Interaction avec S3 |
|---|---|
| EC2 (Compute) | (App) L'application (Python/Node) sur l'EC2 (via IAM Role) Lit/Ăcrit (boto3) des objets (ex: user uploads, config) sur S3. |
| Lambda (Serverless) | (Trigger) S3 dĂ©clenche (s3:ObjectCreated) Lambda.(App) Lambda Lit/Ăcrit sur S3 (ex: crĂ©er un thumbnail). |
| CloudFront (CDN) | (Origine) CloudFront lit depuis S3 (son "Origine") et met en cache (distribue) les objets (images, CSS, JS) globalement (sur les Edge Locations). |
| Athena (Analytics) | (Source) Athena lit et exĂ©cute (SELECT *) des requĂȘtes SQL directement sur les fichiers (CSV, Parquet, JSON) stockĂ©s dans S3. (S3 *est* la base de donnĂ©es). |
| Glue / EMR (Big Data) | (Source/Destination) Les Jobs (ETL, Spark) lisent les données brutes (depuis S3-Raw-Bucket), les transforment (en mémoire), et écrivent les résultats (Parquet) (vers S3-Processed-Bucket). |
| RDS / EC2 (Backups) | (Backup) Les Snapshots (EBS/RDS) sont (en arriÚre-plan) stockés dans S3 (géré par AWS). |
| CloudTrail / ALB (Logs) | (Destination) Ces services écrivent (exportent) leurs logs d'audit (CloudTrail) ou d'accÚs (ALB Access Logs) vers un bucket S3. |
| SageMaker (ML) | (Source/Destination) Lit les "datasets" (données d'entraßnement) depuis S3, et écrit les "modÚles" (model.tar.gz) entraßnés vers S3. |
S3 n'est PAS un SystĂšme de Fichiers (File System)
C'est la confusion la plus fréquente. S3 est un Stockage Objet (Key-Value).
| CritĂšre | S3 (Stockage Objet) | EFS (File System / NFS) |
|---|---|---|
| Structure | Plate (Flat). Pas de "dossiers". | Hiérarchique (Arborescence, dossiers, sous-dossiers). |
| AccĂšs | API (HTTP PUT, GET, DELETE). | Protocole POSIX (mount, ls, cd). |
| Modification | Immutable. On ne peut pas "modifier" un fichier. On le ré-uploade (écrase) en entier. | Mutable. On peut modifier 1 octet (append) au milieu d'un fichier. |
| ScalabilitĂ© | Infinie (Stockage, RequĂȘtes). | Scalable (stockage), mais performance liĂ©e au dĂ©bit (Throughput). |
| Clé (Key) | rapports/2024/janvier.pdf (La clé EST le chemin complet). | /data/rapports/2024/janvier.pdf (Chemin + Fichier). |
Analogie : S3 est un "vestiaire" (vous donnez votre manteau [Valeur] et recevez un ticket [Clé]). EFS est votre "disque dur" (vous organisez vos fichiers dans des dossiers).
Le "Bucket" (Seau)
Le Bucket est le "contenant" (dossier racine) de vos objets. C'est l'entité de base sur laquelle on applique la configuration.
- Block Public Access (BPA).
- Policies (Bucket Policy).
- Versioning.
- Logging (Server Access Logs).
- Website Hosting.
Le Namespace Global (PiÚge n°1)
Lorsque vous crĂ©ez un bucket, son nom doit ĂȘtre unique au monde (sur tous les comptes AWS, toutes rĂ©gions confondues).
Exemple : Si "Jean" (compte A) crée mon-bucket-test (en Irlande), "Marie" (compte B) ne peut pas créer mon-bucket-test (à Paris). L'API renverra BucketAlreadyExists.
Raison : S3 utilise (historiquement) les noms de bucket comme sous-domaines DNS (ex: mon-bucket-test.s3.amazonaws.com).
Bonne Pratique : Toujours nommer vos buckets avec un préfixe unique (ex: ideo-lab-facturation-prod-euwest3).
(Mise Ă jour majeure de 2020) C'est un changement fondamental d'AWS S3.
Historique (Avant 2020) : "Eventual Consistency"
Avant, si vous écrasiez (Overwrite) un objet (PUT v2) ou le supprimiez (DELETE), un GET (lecture) immédiatement aprÚs pouvait (parfois) renvoyer l'ancienne version (v1) ou le fichier (avant suppression). Il fallait attendre "éventuellement" (quelques secondes/minutes).
Aujourd'hui : "Strong Read-after-Write Consistency"
S3 garantit désormais une cohérence forte pour toutes les opérations. (Sauf quelques configurations rares).
| Scénario | Comportement Garanti |
|---|---|
| 1. PUT (Nouveau) | (Client A) PUT rapport.pdf( Client B) GET rapport.pdf -> (Garanti) RécupÚre le fichier (pas 404). |
| 2. PUT (Overwrite) | (Client A) PUT v1, puis PUT v2( Client B) GET -> (Garanti) RécupÚre v2 (jamais v1). |
| 3. DELETE | (Client A) DELETE rapport.pdf( Client B) GET rapport.pdf -> (Garanti) Reçoit 404 Not Found (jamais le fichier). |
| 4. LIST | (Client A) PUT fichier1, PUT fichier2( Client B) LIST -> (Garanti) Voit fichier1 et fichier2. |
Impact : Simplifie massivement les applications (Data Lakes, Big Data) qui n'ont plus besoin de gérer des "caches de consistance" (ex: DynamoDB) pour savoir si un objet S3 existe vraiment.
C'est la classe de stockage par défaut. Optimisée pour les données "chaudes" (accÚs fréquent).
Caractéristiques
- Usage : Sites web (CDN), applications, data lakes (zone "raw"), big data.
- Latence : Millisecondes (First Byte Out).
- Disponibilité (SLA) : 99.99%.
- Durabilité (Perte) : 99.999999999% (11 9's).
- Réplication : Données répliquées (automatiquement) sur au moins 3 AZs (Data Centers) physiques.
- CoĂ»t (Retrieval) : ZĂ©ro. Vous ne payez que le Stockage (GB/mois) et les RequĂȘtes (PUT/GET).
(Recommandé par AWS) C'est la classe "intelligente" pour les données aux patterns d'accÚs inconnus ou variables.
Fonctionnement (Automatique)
S3 monitore l'accĂšs Ă chaque objet :
- (Jour 0) L'objet est dans le Tiers "Frequent Access" (Prix S3 Standard).
- (Jour 30) Si l'objet n'a pas été lu depuis 30 jours, S3 le déplace (automatiquement) vers le Tiers "Infrequent Access" (Prix S3-IA, -40% coût).
- Si l'objet (en IA) est relu, S3 le déplace (automatiquement) vers le Tiers "Frequent Access".
- (Optionnel) (Jour 90) Si activé, S3 déplace les objets non-lus (depuis 90j) vers "Archive Instant Access" (Prix Glacier Instant, -68% coût).
L'Avantage Clé (vs S3-IA)
Si vous déplacez (manuellement) un objet vers S3-IA (2.3) et que vous le lisez 10 fois, vous payez 10x les "Frais de Récupération (Retrieval Fee)".
Avec S3-INT, si vous lisez un objet (en Tiers "Infrequent"), S3 ne facture AUCUN Retrieval Fee, et le dĂ©place vers "Frequent" (oĂč les lectures sont gratuites).
Le Coût (FinOps)
En échange de ce service, S3 facture un petit frais de monitoring (par objet). (Ex: $0.0025 par 1,000 objets).
PiÚge : N'activez pas INT pour des millions de petits fichiers (logs < 128KB). Le coût du monitoring dépassera l'économie de stockage.
Classes optimisées pour les données "froides" (accÚs rare), mais nécessitant un accÚs immédiat (ms).
Usage : Backups (long terme), Disaster Recovery (DR), anciens fichiers.
Le PiĂšge (Retrieval Fee)
Le coût de Stockage (GB/mois) est bas (ex: -40% vs Standard).
MAIS, vous payez un Frais de Récupération (Retrieval Fee) (ex: $0.01 / GB) chaque fois que vous lisez (GET) les données.
| CritĂšre | S3 Standard-IA | S3 One Zone-IA |
|---|---|---|
| Usage | Backups, DR (Données critiques). | Données re-créables (ex: Thumbnails, copies). |
| Réplication (AZ) | ℠3 AZs (Multi-AZ). | 1 seule AZ. |
| Disponibilité (SLA) | 99.9% | 99.5% (Plus faible). |
| Risque | TrÚs faible (Résiste à une panne d'AZ). | Perte de données si l'AZ unique est détruite (feu, inondation). |
| Coût Stockage | Bas. | TrÚs Bas (Encore -20% vs Standard-IA). |
PiĂšge (DurĂ©e) : Les classes IA ont une facturation minimale de 30 jours. Si vous mettez un fichier en IA et le supprimez aprĂšs 10 jours, vous payez quand mĂȘme 30 jours.
Classes d'archivage (trĂšs long terme). Stockage extrĂȘmement bas (le moins cher d'AWS), mais latence de rĂ©cupĂ©ration (pas d'accĂšs "ms", sauf "Instant").
S3 Glacier Instant Retrieval
Le "meilleur des deux mondes" : Stockage d'archive, mais accÚs immédiat (ms).
- Usage : Archives mĂ©dicales, photos/vidĂ©os (News) accĂ©dĂ©es rarement mais qui doivent ĂȘtre immĂ©diates si besoin.
- Coût : Stockage (trÚs bas), Retrieval (trÚs cher, 3x plus cher que S3-IA).
- Min Durée : 90 jours.
S3 Glacier Flexible Retrieval (Ex: "S3 Glacier")
L'archive "classique".
- Usage : Backups (oĂč une attente de quelques minutes/heures est OK).
- Retrieval (Latence) :
- Expedited : 1-5 minutes (Coûteux).
- Standard : 3-5 heures (Défaut).
- Bulk : 5-12 heures (Gratuit, si < 10% / mois).
- Min Durée : 90 jours.
S3 Glacier Deep Archive
Le stockage le moins cher du cloud AWS.
- Usage : Rétention légale (Compliance), remplacement des bandes (Tapes) LTO. Données "écrire 1 fois, ne jamais lire (sauf audit)".
- Retrieval (Latence) :
- Standard : < 12 heures.
- Bulk : < 48 heures.
- Min Durée : 180 jours.
(Bonne Pratique n°1) C'est le "verrou" de sécurité principal, activé par défaut (depuis 2019) sur les nouveaux buckets.
BPA est un "interrupteur" (booléen) qui écrase (override) toute autre configuration (Bucket Policy, ACL) qui tenterait de rendre un bucket public.
Les 4 ParamĂštres (Niveau Compte ou Bucket)
Il est recommandé de cocher les 4 au niveau du Compte (Account) :
| ParamÚtre (Anglais) | Signification (Français) |
|---|---|
| Block new public ACLs | Bloque les PUT d'objets qui tentent d'ajouter une ACL "publique". |
| Block any public ACLs | Bloque (ignore) toutes les ACLs publiques (nouvelles ou existantes). |
| Block new public bucket policies | Bloque les PUT de Bucket Policies qui contiennent un "Effect": "Allow" pour un "Principal": "*". |
| Block public and cross-account... | Bloque (ignore) toutes les policies publiques (nouvelles ou existantes). |
Quand le désactiver (Partiellement) ?
Le seul cas d'usage légitime pour désactiver (partiellement) BPA est pour l'Hébergement de Site Web Statique (Static Website Hosting). Dans ce cas, on désactive les 2 options "Block public... policies". (Mais la bonne pratique (6.3) est de garder S3 privé et d'utiliser CloudFront OAC).
C'est la Politique Basée Ressource (Resource-based). C'est un fichier JSON attaché au Bucket qui dit : "Qui (Principal) peut faire Quoi (Action) sur Moi (Resource) ?".
Ex 1 : Forcer le chiffrement (SSE-KMS) Ă l'Upload
Refuse (Deny) tout PutObject si le Header x-amz-server-side-encryption n'est pas aws:kms.
{
"Sid": "DenyIncorrectEncryptionHeader",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::mon-bucket-securise/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
}
}Ex 2 : Restreindre l'accĂšs Ă une IP Publique (Bureau)
Autorise (Allow) tout (*) si (Condition) l'IP source est 80.1.2.3.
{
"Sid": "AllowIP",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::mon-bucket-admin/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "80.1.2.3/32"
}
}
}Ex 3 : Restreindre l'accĂšs Ă un VPC (Endpoint)
Autorise l'accĂšs (Lecture) seulement si la requĂȘte provient de l'Endpoint VPC vpce-12345.
{
"Sid": "AllowVPC",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mon-bucket-prive/*",
"Condition": {
"StringEquals": {
"aws:sourceVpce": "vpce-1234567890"
}
}
}Comprendre qui gagne est crucial pour débugger les "Access Denied" (403).
- IAM Policy (Identity-based) : Attachée à un User/Role. Dit : "Moi, Jean, j'ai le droit de lire (GetObject) sur S3 (Resource: *)".
- Bucket Policy (Resource-based) : Attachée au Bucket. Dit : "Moi, Bucket-A, j'autorise (Principal) Jean à me lire (GetObject)".
La Logique d'Ăvaluation (Ordre)
Quand "Jean" essaie de lire "Bucket-A" :
- 1. DENY Explicite ? (Stop)
- Est-ce que la Policy IAM (de Jean) a un
"Effect": "Deny"? -> ACCĂS REFUSĂ (FIN). - Est-ce que la Bucket Policy (de A) a un
"Effect": "Deny"? -> ACCĂS REFUSĂ (FIN). - (VĂ©rifie aussi SCP, Permissions Boundary...).
- Est-ce que la Policy IAM (de Jean) a un
- 2. ALLOW Explicite ? (Continue)
- Est-ce que la Policy IAM (de Jean) a un
"Effect": "Allow"? -> OUI. (Aller 3). - (OU) Est-ce que la Bucket Policy (de A) a un
"Effect": "Allow"? -> OUI. (Aller 3). - (Si ni IAM ni Bucket Policy n'ont de "Allow" -> AccÚs Refusé (Défaut)).
- Est-ce que la Policy IAM (de Jean) a un
- 3. (Si Cross-Account)
- Si Jean (Compte 111) veut lire Bucket-A (Compte 222) :
- IL FAUT LES DEUX : (IAM 111
Allow) ET (Bucket Policy 222Allow).
RĂšgle d'Or : Un DENY explicite (IAM ou Bucket Policy) gagne TOUJOURS sur un ALLOW.
ACL (Access Control Lists) = Legacy
C'est l'ancien systÚme de sécurité d'S3 (pré-IAM). Il permettait de définir des droits (READ, WRITE) objet par objet (pas bucket).
ProblĂšme (Cross-Account) : Si Compte B uploade un objet dans le bucket du Compte A, c'est le Compte B qui possĂšde (Owner) l'objet. Le Compte A (Owner du Bucket) ne pouvait (parfois) mĂȘme pas lire/supprimer cet objet (dans son propre bucket !).
La Solution Moderne : Object Ownership
C'est un paramÚtre (au niveau Bucket) qui désactive les ACLs.
| Mode | Description |
|---|---|
| Bucket owner preferred | (Défaut/Transition) Les ACLs fonctionnent. (L'uploader (B) possÚde l'objet). |
| Bucket owner enforced | (RecommandĂ©) DĂ©sactive (Ignore) TOUTES les ACLs. Le propriĂ©taire du Bucket (A) possĂšde tous les objets (mĂȘme ceux uploadĂ©s par B). |
Bonne Pratique : Mettre tous les buckets en Bucket owner enforced et gérer 100% des permissions via IAM Policies et Bucket Policies (3.2 / 3.3).
Depuis Janvier 2023, S3 chiffre (crypte) automatiquement 100% des nouveaux objets (PutObject) uploadés, sans impact sur la performance.
Ce chiffrement par défaut utilise SSE-S3 (Server-Side Encryption S3).
SSE-S3 (Clés gérées par S3)
- Algorithme : AES-256 (GCM).
- Gestion des Clés : Totalement gérée par AWS S3. S3 gÚre la Data Key, la Master Key, la rotation, etc.
- Transparence : 100% transparent. Vous n'avez rien Ă faire.
- Coût : Gratuit. (Inclus dans S3).
- Inconvénient : Vous n'avez aucun contrÎle ni aucun audit (CloudTrail) sur "qui" a utilisé la clé pour déchiffrer l'objet (car la clé appartient à S3).
(Recommandé pour la Compliance) C'est le chiffrement cÎté serveur (Server-Side Encryption) utilisant le service KMS (Key Management Service).
Fonctionnement (Envelope Encryption)
- (Upload) Vous envoyez
PUT Object(Header:x-amz-server-side-encryption: aws:kms). - (S3) Demande à KMS : "GénÚre-moi une Clé de Données (Data Key) (via ma Clé Maßtre CMK)".
- (KMS) Crée une Data Key (Unique), la chiffre (avec la CMK), et renvoie (Data Key Claire + Data Key Chiffrée).
- (S3) Chiffre l'objet (avec la Data Key Claire).
- (S3) Efface la Data Key Claire, et stocke l'Objet (chiffré) + la Data Key (chiffrée).
Avantages (vs SSE-S3)
- ContrÎle (Key Policy) : C'est VOTRE Clé (CMK). Vous définissez (dans KMS) qui (IAM User, Role) a le droit de l'utiliser (
kms:Encrypt,kms:Decrypt). - Audit (CloudTrail) : (Crucial) Chaque
GET Object(lecture) sur S3 génÚre une entréeDecryptdans CloudTrail (logs). Vous savez "Qui a lu Quoi, Quand". - Rotation : Vous pouvez activer la rotation automatique (1 an) de la CMK.
Inconvénients
- Coût : Vous payez KMS (
$0.03 / 10,000requĂȘtes API). (Peut chiffrer vite si vous lisez des millions de petits fichiers). - Quotas KMS : Vous pouvez atteindre les limites (Throttling) de l'API KMS (ex: 5,500 req/sec).
Solution aux Inconvénients : Activer "S3 Bucket Key" (4.3).
C'est une option (case Ă cocher) Ă activer (sur le Bucket) lorsque vous utilisez SSE-KMS (4.2).
Objectif : Réduire les coûts KMS de 99% (et éviter le Throttling).
Flux (Sans Bucket Key)
Si vous téléchargez 1000 objets (SSE-KMS) :
- S3 fait 1000 appels API Ă KMS (
Decrypt) (1 appel par objet, pour dĂ©chiffrer la "Data Key" unique de chaque objet). - CoĂ»t : 1000 requĂȘtes KMS.
Flux (Avec Bucket Key Activée)
Si vous téléchargez 1000 objets (SSE-KMS + Bucket Key) :
- (1er GET) S3 appelle KMS 1 fois pour générer une "Bucket Key" (temporaire, ex: 5 min).
- (S3) Met cette "Bucket Key" (claire) en cache (cÎté S3).
- (2Úme -> 1000Úme GET) S3 utilise la "Bucket Key" (en cache) pour déchiffrer les 999 autres objets sans re-contacter KMS.
Résultat : 1000 objets lus = 1 appel API KMS (au lieu de 1000).
Bonne Pratique : Toujours activer "S3 Bucket Key" si vous utilisez SSE-KMS.
Le Versioning est un paramÚtre (Niveau Bucket) qui protÚge contre l'écrasement (Overwrite) et la suppression (Delete) accidentels.
Une fois activĂ© (Enabled), il ne peut ĂȘtre que Suspended (jamais Disabled).
Flux (Sans Versioning)
PUT rapport.pdf(v1)PUT rapport.pdf(v2) -> (v1 est écrasé, perdu).DELETE rapport.pdf-> (v2 est supprimé, perdu).
Flux (Avec Versioning)
PUT rapport.pdf-> (CréeID: 111, (Current)).PUT rapport.pdf-> (CréeID: 222, (Current)). (ID: 111devient (NonCurrent)).GET rapport.pdf-> (LitID: 222(Current)).GET rapport.pdf?versionId=111-> (LitID: 111(l'ancienne version)).
Le "Delete Marker" (PiÚge n°1)
DELETE rapport.pdf(sur un bucket "versioned") :- Ne supprime RIEN.
- Crée un "marqueur" (Delete Marker) (
ID: 333) qui devient (Current). GET rapport.pdf-> (LitID: 333) -> S3 renvoie 404 Not Found (l'objet semble supprimé).
Restauration : Pour "restaurer" le fichier, il faut supprimer le "Delete Marker" (ID: 333). (ID: 222 redevient (Current)).
Coût (FinOps) : Vous payez pour toutes les versions (Current + NonCurrent). (Utiliser Lifecycle (5.2) pour nettoyer les anciennes versions).
Permet d'automatiser le Tiering (Déplacement) et l'Expiration (Suppression) des objets pour optimiser les coûts (FinOps).
Une RÚgle (Rule) s'applique sur un Préfixe (ex: logs/) ou un Tag (ex: Status: Archive).
Exemple de RĂšgle (Logs)
(Filtre: Préfixe = "logs/")
1. (Transition - Versions Courantes)
- AprÚs 30 Jours -> Déplacer vers S3 Standard-IA
- AprÚs 90 Jours -> Déplacer vers S3 Glacier Flexible
- AprÚs 365 Jours -> (Expiration) Supprimer définitivement.
2. (Transition - Versions Non-Courantes (si Versioning activé))
- AprÚs 30 Jours (NonCurrent) -> Déplacer vers S3-IA (NonCurrent)
- AprÚs 60 Jours (NonCurrent) -> (Expiration) Supprimer définitivement.
3. (Nettoyage)
- Supprimer les "Delete Markers" orphelins (Expired object delete markers).
- Supprimer les "Multipart Uploads" incomplets (aprĂšs 7 jours).
PiĂšges (FinOps)
- Frais de Transition : S3 facture des frais (minimes) par objet (ex: $0.01 / 1000) pour chaque transition (Standard -> IA, IA -> Glacier). (Ne pas transitionner des millions de mini-fichiers !).
- Taille Minimale (128 KB) : S3 ne transitionnera pas les objets < 128 KB vers IA/Glacier (car non-rentable).
- Durée Minimale (30j/90j) : Si vous transitionnez vers S3-IA (Min 30j) et supprimez aprÚs 10j, vous payez les 20j restants (Early Delete Fee).
C'est une fonctionnalitĂ© (activĂ©e Ă la crĂ©ation du bucket) qui applique un modĂšle WORM (Write Once, Read Many). Une fois l'objet "verrouillĂ©" (Locked), il est impossible de le supprimer ou de le modifier (mĂȘme pour le Root) jusqu'Ă la date de RĂ©tention.
PrĂ©-requis : Le Versioning (5.1) doit ĂȘtre activĂ© sur le bucket.
Les 2 Modes de Rétention (Retention)
| Mode | Niveau de Protection | Qui peut le supprimer ? |
|---|---|---|
| Governance Mode (Gouvernance) | ProtÚge contre les suppressions accidentelles (ex: scripts fous). | Le Root (ou un User/Role avec la permission IAM spéciale : s3:BypassGovernanceRetention). |
| Compliance Mode (Conformité) | Protection Absolue (Rétention légale/SEC). | PERSONNE. (Ni vous, ni le Root, ni AWS). L'objet est verrouillé jusqu'à la date d'expiration. |
Legal Hold (Mise en attente légale)
C'est un verrou (booléen ON/OFF) indépendant de la Rétention. Il n'a pas de date de fin.
Usage : (Audit/Litige) Un Auditeur (avec permission s3:PutObjectLegalHold) active le Legal Hold (ON). L'objet ne peut plus ĂȘtre supprimĂ© (mĂȘme si la RĂ©tention (ex: 1 an) expire). L'Auditeur doit (manuellement) le remettre (OFF) Ă la fin de l'enquĂȘte.
C'est la méthode recommandée (et obligatoire pour les > 5GB) pour uploader des fichiers volumineux.
L'AWS CLI (aws s3 cp) le fait automatiquement.
Fonctionnement (3 Ătapes API)
- 1. Initiate (
CreateMultipartUpload) :- (Client) "Bonjour S3, je veux uploader
gros-fichier.zip". - (S3) "OK. Voici un
UploadId(ex:xyz...) unique pour cette transaction."
- (Client) "Bonjour S3, je veux uploader
- 2. Upload Parts (
UploadPart) : (En ParallĂšle)- (Client Thread 1) "OK S3 (
UploadId: xyz), voici la Partie 1 (bytes 0-10MB)." - (Client Thread 2) "OK S3 (
UploadId: xyz), voici la Partie 2 (bytes 10-20MB)." - (Client Thread 3) "..."
- (S3) Renvoie un "ETag" (checksum) pour chaque Part (
ETag1,ETag2...).
- (Client Thread 1) "OK S3 (
- 3. Complete (
CompleteMultipartUpload) :- (Client) "OK S3 (
UploadId: xyz), j'ai fini. Voici la liste (Manifest) des Parts (Part 1 =ETag1, Part 2 =ETag2...)." - (S3) Vérifie le Manifest, assemble les parts (cÎté serveur), et crée
gros-fichier.zip.
- (Client) "OK S3 (
Avantages
- Vitesse (Parallélisme) : Peut saturer la bande passante (ex: 10 Gbps) en utilisant plusieurs Threads (HTTP).
- Résilience (Retry) : Si la Part 2 échoue (timeout réseau), le client n'a qu'à relancer l'
UploadPart2 (pas les 5GB). - Pause/Reprise : On peut "pauser" un upload (garder l'
UploadId) et le reprendre (ListParts) le lendemain.
C'est la méthode sécurisée pour donner un accÚs temporaire (limité) à un objet dans un bucket 100% privé.
L'URL "signée" (SigV4) contient l'authentification (Access Key, Signature, Expiration) dans les paramÚtres (Query Params) de l'URL.
Cas 1 : Téléchargement (GET) Sécurisé
(Ex: Espace client "Mes Factures"). Les factures sont dans un bucket privé.
- (Client) Clique "Télécharger Facture 123".
- (Serveur/Lambda) Authentifie le Client.
- (Serveur/Lambda) (Code Boto3) Appelle S3 (
generate_presigned_url('get_object', ...)). - (S3) GénÚre une URL (valide 5 min) :
https://bucket.s3.../facture123.pdf?AWSAccessKeyId=...&Expires=...&Signature=... - (Serveur/Lambda) Renvoie cette URL (Redirect 302) au Client.
- (Client) (Browser) Télécharge le PDF (pendant 5 min).
Cas 2 : Upload (PUT) Sécurisé (Client-side)
(Ex: Changer sa photo de profil). Permet à un navigateur (JS) d'uploader un fichier de 500 MB (la photo) directement vers S3 (privé), sans passer (et saturer) par le Serveur/Lambda.
- (Client JS) "Je veux uploader
profil.jpg". - (Serveur/Lambda) GénÚre une URL (
generate_presigned_url('put_object', ...)) (valide 10 min). - (Client JS) Reçoit l'URL. Fait un
Fetch (PUT)(HTTP) (Body: [data]) directement vers S3 (via l'URL signée). - (S3) Accepte le fichier (upload de 500 MB).
C'est la meilleure pratique (moderne) pour héberger un site web statique (React, Angular, HTML) sur S3.
L'Ancienne Méthode (Risquée)
- (S3) Activer "Static Website Hosting".
- (S3) Désactiver "Block Public Access" (BPA) (3.1).
- (S3) Ajouter une Bucket Policy
"Effect": "Allow", "Principal": "*". (Le bucket est public). - (CloudFront) Pointe vers l'URL "Website" (
...s3-website...).
ProblÚme : Le bucket est public. N'importe qui peut y accéder (ex: ...s3.amazonaws.com) en contournant CloudFront (et votre WAF, Logs, etc.).
La Nouvelle Méthode (OAC - Origin Access Control)
- (S3) Garder le bucket 100% PRIVà (BPA reste Activé (ON)).
- (CloudFront) Créer une "Distribution".
- (CloudFront) Dans "Origine", créer un OAC (Origin Access Control).
- (CloudFront) AWS affiche une Bucket Policy (Ă copier).
- (S3) Coller cette Bucket Policy (JSON) (3.2).
- (Cette Policy dit : "
Allow s3:GetObjectSEULEMENT auPrincipal: Service: cloudfront.amazonaws.com" (et ARN de la distribution)).
- (Cette Policy dit : "
Résultat : Le Bucket est privé. Les utilisateurs (publics) ne peuvent pas y accéder (403). Seul CloudFront (OAC) a le droit (via la Bucket Policy) de lire les fichiers (pour les servir/cacher).
Permet d'exĂ©cuter une requĂȘte (type SQL) directement sur un objet (fichier) S3 (CSV, JSON, Parquet) cĂŽtĂ© serveur, et de ne rĂ©cupĂ©rer que le rĂ©sultat (pas le fichier entier).
ProblĂšme (Sans S3 Select)
Vous avez un fichier logs-2024.csv (non-compressé) de 5 GB. Vous voulez "trouver toutes les erreurs 500".
- (Lambda/EC2)
GetObject()-> Télécharge 5 GB (Lent, Coûteux (Data Transfer)). - (Lambda/EC2) Charge 5 GB en RAM.
- (Lambda/EC2) Parse (CPU) les 5 GB (ligne par ligne) pour trouver 10 lignes (Erreurs 500).
- (Lambda/EC2) Renvoie les 10 lignes.
Solution (Avec S3 Select)
Vous envoyez une requĂȘte SelectObjectContent (API) Ă S3 :
(Format: CSV, GZIP, Header: Use)
SELECT * FROM S3Object s WHERE s._5 = '500'
- (S3) Reçoit la requĂȘte.
- (S3) Lit 5 GB (cÎté serveur).
- (S3) Filtre (cÎté serveur) les 10 lignes (Erreurs 500).
- (S3) Renvoie uniquement 1 KB (les 10 lignes) Ă Lambda/EC2.
Résultat : Jusqu'à 400% plus rapide (pas de DL) et 80% moins cher (moins de Data Transfer).
Note : (Pour des requĂȘtes complexes (JOIN, GROUP BY) sur plusieurs fichiers -> Utiliser AWS Athena).
Contenu à venir pour S3 Access Points (points d'accÚs logiques avec policies dédiées).
Contenu Ă venir pour Cross-Region Replication (DR) et Same-Region Replication (Logs).
