Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

đŸȘŁ AWS S3 (Simple Storage Service)

Guide complet IDEO-Lab : Stockage Objet, Classes, Policies (IAM/Bucket), Lifecycle, Versioning & Encryption.

1.1

Concept : Objet (Clé/Valeur)

S3 n'est pas un File System. C'est un "Key-Value Store" plat (stockage objet).

Key-Value Flat Namespace
1.2

Concept : Bucket & Namespace

Le "contenant" (dossier racine). Nom globalement unique (DNS).

Bucket Global Namespace
1.3

Concept : Strong Consistency

(Important) Cohérence forte (Read-after-Write) pour tous les PUT/DELETE.

Strong Consistency Atomic
2.1

Classe : S3 Standard

Défaut. AccÚs fréquent, latence ms. Multi-AZ (99.99% dispo).

Standard Hot Data
2.2

Classe : Intelligent-Tiering

(RecommandĂ©) Tiering automatique (Frequent ↔ Infrequent) sans frais.

Intelligent-Tiering Auto-Tiering
2.3

Classe : Standard-IA / OneZone-IA

AccĂšs > 30 jours. Moins cher au stockage, payant Ă  la lecture (Retrieval).

Infrequent Access Retrieval Fee
2.4

Classe : Glacier (Archive)

Instant (ms), Flexible (min/heures), Deep Archive (12h). Archivage long terme.

Glacier Deep Archive
3.1

Sécu : Block Public Access (BPA)

(Crucial) Le "bouton ON" de la sécurité. Bloque tout accÚs public (compte/bucket).

BPA Security Best Practice
3.2

Sécu : Bucket Policies (JSON)

Le "Pare-feu" du bucket (Resource-based). Autoriser/Refuser par IP, VPC...

Bucket Policy JSON
3.3

Sécu : IAM vs Bucket Policy

IAM (User-based) vs Bucket Policy (Resource-based). Un "Deny" gagne toujours.

IAM Evaluation Logic
3.4

Sécu : ACLs & Object Ownership

(Legacy) À dĂ©sactiver. Utiliser "Bucket Owner Enforced" (Moderne).

ACL (Legacy) Object Ownership
4.1

Chiffrement : Par Défaut (SSE-S3)

(Automatique) Tous les objets sont chiffrés (AES-256) par défaut.

SSE-S3 Default Encryption
4.2

Chiffrement : SSE-KMS

Utilise vos propres clés (CMK) KMS. Permet audit (CloudTrail) & rotation.

SSE-KMS CMK Audit
4.3

Chiffrement : S3 Bucket Key

(FinOps) Réduit les coûts KMS de 99% en partageant une clé temporaire.

Bucket Key KMS Cost
5.1

Gestion : Versioning

Garde un historique (v1, v2, v3). ProtÚge contre suppression/écrasement.

Versioning Delete Marker
5.2

Gestion : Lifecycle Rules

RĂšgles (XML/JSON). (Ex: Standard -> Glacier (90j) -> Delete (365j)).

Lifecycle Tiering
5.3

Gestion : Object Lock (WORM)

(Compliance) Bloque la suppression (Mode Governance ou Compliance).

Object Lock WORM
6.1

Perf : Multipart Upload

(Vitesse) Upload en parallĂšle (chunks). Obligatoire > 5GB.

Multipart Parallel
6.2

AccĂšs : Presigned URLs (SigV4)

URL (temporaire) pour donner accÚs (Read/Write) à un objet privé.

Presigned URL SigV4
6.3

AccĂšs : CloudFront (OAC)

(Best Practice) Servir S3 (privé) via CloudFront (CDN) avec OAC.

CloudFront OAC OAI (Legacy)
6.4

Perf : S3 Select

Filtrer (SQL) un CSV/JSON/Parquet cÎté S3 (Server-side).

S3 Select Data Filtering
9. Tarification S3 et Optimisation (FinOps)
9.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 StockageCoût ($/GB/Mois) (Estimé)Latence AccÚsFrais de Récupération ($/GB)
S3 Standard~ $0.023 (Base)MillisecondesAucun
S3 Intelligent-Tiering~ $0.023 (Tiers Fréquent)MillisecondesAucun (mais frais $/objet de monitoring)
S3 Standard-IA~ $0.0125 (Moins cher)MillisecondesOui (~ $0.01 / GB)
S3 One Zone-IA~ $0.01 (Encore moins cher)MillisecondesOui (~ $0.01 / GB)
S3 Glacier Instant~ $0.004MillisecondesTrĂšs ÉlevĂ© (~ $0.03 / GB)
S3 Glacier Flexible~ $0.0036Minutes / HeuresBas (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 TransfertDestinationCoût (Estimé)
Data Transfer IN (Ingress)(Internet) -> S3Gratuit
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 -> CloudFront est gratuit. Le CloudFront -> Internet est (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 : Transition vers Glacier 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 Lifecycle Standard -> 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. Architectures autour de S3
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:GetObject uniquement (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 :

  1. (S3) L'objet facture.pdf est privé (OAC).
  2. (App) Votre App (EC2/Lambda) génÚre (signe) une URL CloudFront Signée (pas une URL S3 Signée) (valide 5 min).
  3. (Client) Le client utilise cette URL (.../facture.pdf?Expires=...&Signature=...).
  4. (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) :

  1. Le backup (On-Prem) est uploadé à Paris (Source) (pour restauration "chaude" rapide, si besoin).
  2. CRR copie (immédiatement) le backup à Francfort (Destination-DR).
  3. (Paris) La Lifecycle (Source) supprime le backup (chaud) aprÚs 30 jours (pour économiser).
  4. (Francfort) La Lifecycle (Destination) archive le backup (froid) vers Glacier Deep Archive (pour rétention 7 ans (Compliance)).
7. Fonctionnalités Avancées
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)
  1. (Bucket) Activer "Static website hosting".
  2. (Bucket) Spécifier le index.html (document racine) et error.html (document d'erreur 404).
  3. (Sécurité) Désactiver (OFF) le "Block Public Access (BPA)" (au niveau du Bucket).
  4. (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 :

  1. (S3) Garder le bucket 100% PRIVÉ (BPA ActivĂ© (ON)).
  2. (CloudFront) Créer une Distribution (CDN).
  3. (CloudFront) Utiliser OAC (Origin Access Control) (plutĂŽt que OAI (Legacy)) comme "Origine".
  4. (CloudFront) Copier la Bucket Policy (générée par OAC) dans S3 (qui Allow uniquement cloudfront.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Ă© par PUT, POST, COPY, CompleteMultipartUpload).
  • s3:ObjectRemoved:* (DĂ©clenchĂ© par DELETE, DeleteMarkerCreated).
  • s3:ObjectRestore:* (DĂ©clenchĂ© quand une restauration (Glacier) est Initiated ou Completed).

(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
  1. (Config) Vous activez "S3 Inventory" (sur Bucket-A).
  2. (Config) Vous choisissez Quoi lister (Champs : Size, StorageClass, EncryptionStatus, ObjectLockInfo, LastModifiedDate...).
  3. (Config) Vous choisissez le Format (Sortie) : CSV, ORC, ou (Recommandé) Apache Parquet.
  4. (Config) Vous choisissez la Destination (ex: Bucket-B (Logs)).
  5. (Run) (Tous les jours/semaines) S3 (service) scanne Bucket-A et écrit le "Manifest" (inventaire) (ex: .../inventory.parquet) dans Bucket-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. Monitoring & Observabilité (S3)
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 des 404 Not Found ou 403 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 Standard vs Glacier ?"
  • (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 en Standard).
  • (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)
  1. (Logs) (Automatique) Les Logs (CloudTrail/S3) arrivent dans s3://mon-bucket-logs/.
  2. (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...).
  3. (Glue) Le Crawler crée (automatiquement) une "Table" (Métadonnées) (ex: cloudtrail_logs) dans le Glue Data Catalog.
  4. (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. Performances & Optimisation (S3)
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 PUT simple (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 GET parallĂšles (chacun demandant 1GB via un Header HTTP Range: 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) :

  1. (Admin) Active S3TA (sur le bucket).
  2. (Admin) L'utilisateur (Sydney) uploade (via un DNS spécial : .s3-accelerate.amazonaws.com).
  3. (Flux) S3TA route (via DNS) l'utilisateur vers la Edge Location (CDN) AWS la plus proche (ex: Sydney-Edge).
  4. (Flux) L'upload (Sydney -> Sydney-Edge) est rapide (latence faible).
  5. (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 dans Standard vs Glacier ?"
  • (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. Gestion du Cycle de Vie et Conservation
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 vers Glacier 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)DescriptionCas d'Usage (Exemple)
Expire current object versionsSupprime 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Ă©e ID: AAAA (Version Current (Actuelle)).
  • (Upload v2) PUT rapport.pdf (v2) -> CrĂ©e ID: BBBB (Version Current). (ID: AAAA (v1) devient NonCurrent (Ancienne)).
  • (Lecture) GET rapport.pdf -> Lit toujours la version Current (ID: BBBB (v2)).
  • (Lecture v1) GET rapport.pdf?versionId=AAAA -> (Permet de lire l'ancienne version v1).
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 devient Current.
  • (Lecture) GET rapport.pdf -> (Lit ID: CCCC (Current)) -> S3 renvoie 404 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" :

ModeNiveau de ProtectionQui 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. SĂ©curitĂ© et ContrĂŽle d’AccĂšs (S3)
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.

  1. (Console S3 -> Bucket -> Permissions)
  2. ParamÚtre "Object Ownership" (Propriété de l'objet)
  3. 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éthodeNom (Header API)Gestion de la Clé (Qui ?)Avantage (Cas d'usage)
SSE-S3 (Server-Side)AES256AWS S3 (Clé maßtresse S3)Défaut (Transparent). Gratuit. Zéro configuration. (Pas d'audit sur la clé).
SSE-KMS (Server-Side)aws:kmsAWS 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 Object qui ont une ACL public-read).
  • Ignore public ACLs (Ignorer les ACLs publiques existantes) :
    • (Ignore toutes les ACLs public-read sur le bucket).
  • Block new public bucket policies (Bloquer les nouvelles policies publiques) :
    • (Refuse les PutBucketPolicy qui contiennent "Effect": "Allow" pour "Principal": "*").
  • 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)
  1. (Admin) "Create Endpoint" -> Type: Gateway -> Service: s3 (ou dynamodb).
  2. (Admin) Cochez la Route Table (rt-private) de votre Subnet Privé.
  3. (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. Concepts Fondamentaux S3
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-3 Paris). 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
ComposantDescriptionExemple
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)).

ClasseLatence AccÚsUsage (AccÚs)Coût (Stockage)Coût (Retrieval)
StandardMillisecondesFrĂ©quent (DonnĂ©es "chaudes")ÉlevĂ©Aucun
Standard-IA (Infrequent)MillisecondesRare (ex: < 1x/mois)MoyenOui ($/GB)
One Zone-IAMillisecondesRare (Données re-créables)BasOui ($/GB)
Glacier Instant RetrievalMillisecondesArchive (ex: < 1x/an)TrĂšs BasTrĂšs ÉlevĂ© ($/GB)
Glacier Flexible RetrievalMinutes / HeuresArchive (Backups)TrĂšs BasBas (ou Gratuit)
Glacier Deep ArchiveHeures (12h+)Archive Longue (Compliance)Le Moins CherMoyen
Archivage Automatique (Lifecycle & INT)
  • 1. S3 Lifecycle Policy : (Manuel) Vous crĂ©ez une RĂšgle (ex: "IF prĂ©fixe=/logs/, THEN (AprĂšs 30j) -> Transition (vers Standard-IA), THEN (AprĂšs 90j) -> Transition (vers Glacier 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énarioComportement (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. Introduction Générale à AWS S3
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)
TypeService AWSAnalogieCas 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, ou HTML/CSS). (L'option "Static Website Hosting" du bucket).
  • Architectures Serverless & Big Data :
    • S3 sert de Trigger (DĂ©clencheur) (ex: s3:ObjectCreated) pour AWS Lambda (ex: "DĂšs qu'un .jpg est 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).
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 AWSInteraction 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.
1.1 Concept : S3 (Stockage Objet)
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ĂšreS3 (Stockage Objet)EFS (File System / NFS)
StructurePlate (Flat). Pas de "dossiers".Hiérarchique (Arborescence, dossiers, sous-dossiers).
AccĂšsAPI (HTTP PUT, GET, DELETE).Protocole POSIX (mount, ls, cd).
ModificationImmutable. 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).

1.2 Concept : Bucket & Namespace Global
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).

1.3 Concept : Strong Consistency (Cohérence Forte)

(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énarioComportement 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.

2.1 Classe : S3 Standard

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).
2.2 Classe : S3 Intelligent-Tiering (INT)

(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 :

  1. (Jour 0) L'objet est dans le Tiers "Frequent Access" (Prix S3 Standard).
  2. (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).
  3. Si l'objet (en IA) est relu, S3 le déplace (automatiquement) vers le Tiers "Frequent Access".
  4. (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.

2.3 Classe : S3 Standard-IA & One Zone-IA

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ĂšreS3 Standard-IAS3 One Zone-IA
UsageBackups, 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).
RisqueTrÚs faible (Résiste à une panne d'AZ).Perte de données si l'AZ unique est détruite (feu, inondation).
Coût StockageBas.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.

2.4 Classe : S3 Glacier (Archive)

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.
3.1 Sécu : Block Public Access (BPA)

(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 ACLsBloque les PUT d'objets qui tentent d'ajouter une ACL "publique".
Block any public ACLsBloque (ignore) toutes les ACLs publiques (nouvelles ou existantes).
Block new public bucket policiesBloque 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).

3.2 Sécu : Bucket Policies (JSON)

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"
                }
                }
                }
3.3 SĂ©cu : Logique d'Évaluation (IAM vs Bucket Policy)

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. 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...).
  2. 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)).
  3. 3. (Si Cross-Account)
    • Si Jean (Compte 111) veut lire Bucket-A (Compte 222) :
    • IL FAUT LES DEUX : (IAM 111 Allow) ET (Bucket Policy 222 Allow).

RĂšgle d'Or : Un DENY explicite (IAM ou Bucket Policy) gagne TOUJOURS sur un ALLOW.

3.4 Sécu : ACLs (Legacy) & Object Ownership
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.

ModeDescription
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).

4.1 Chiffrement : Par Défaut (SSE-S3)

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).
4.2 Chiffrement : SSE-KMS (Clés gérées par le Client)

(Recommandé pour la Compliance) C'est le chiffrement cÎté serveur (Server-Side Encryption) utilisant le service KMS (Key Management Service).

Fonctionnement (Envelope Encryption)
  1. (Upload) Vous envoyez PUT Object (Header: x-amz-server-side-encryption: aws:kms).
  2. (S3) Demande à KMS : "GénÚre-moi une Clé de Données (Data Key) (via ma Clé Maßtre CMK)".
  3. (KMS) Crée une Data Key (Unique), la chiffre (avec la CMK), et renvoie (Data Key Claire + Data Key Chiffrée).
  4. (S3) Chiffre l'objet (avec la Data Key Claire).
  5. (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Ă©e Decrypt dans 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,000 requĂȘ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).

4.3 Chiffrement : S3 Bucket Key (Optimisation Coûts KMS)

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) :

  1. (1er GET) S3 appelle KMS 1 fois pour générer une "Bucket Key" (temporaire, ex: 5 min).
  2. (S3) Met cette "Bucket Key" (claire) en cache (cÎté S3).
  3. (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.

5.1 Gestion : Versioning (Historique)

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Ă©e ID: 111, (Current)).
  • PUT rapport.pdf -> (CrĂ©e ID: 222, (Current)). (ID: 111 devient (NonCurrent)).
  • GET rapport.pdf -> (Lit ID: 222 (Current)).
  • GET rapport.pdf?versionId=111 -> (Lit ID: 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 -> (Lit ID: 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).

5.2 Gestion : Lifecycle Rules (RĂšgles de Cycle de Vie)

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).
5.3 Gestion : S3 Object Lock (WORM / Compliance)

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)
ModeNiveau de ProtectionQui 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.

6.1 Perf : Multipart Upload

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. 1. Initiate (CreateMultipartUpload) :
    • (Client) "Bonjour S3, je veux uploader gros-fichier.zip".
    • (S3) "OK. Voici un UploadId (ex: xyz...) unique pour cette transaction."
  2. 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...).
  3. 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.
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'UploadPart 2 (pas les 5GB).
  • Pause/Reprise : On peut "pauser" un upload (garder l'UploadId) et le reprendre (ListParts) le lendemain.
6.2 AccĂšs : Presigned URLs (SigV4)

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é.

  1. (Client) Clique "Télécharger Facture 123".
  2. (Serveur/Lambda) Authentifie le Client.
  3. (Serveur/Lambda) (Code Boto3) Appelle S3 (generate_presigned_url('get_object', ...)).
  4. (S3) GénÚre une URL (valide 5 min) : https://bucket.s3.../facture123.pdf?AWSAccessKeyId=...&Expires=...&Signature=...
  5. (Serveur/Lambda) Renvoie cette URL (Redirect 302) au Client.
  6. (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.

  1. (Client JS) "Je veux uploader profil.jpg".
  2. (Serveur/Lambda) GénÚre une URL (generate_presigned_url('put_object', ...)) (valide 10 min).
  3. (Client JS) Reçoit l'URL. Fait un Fetch (PUT) (HTTP) (Body: [data]) directement vers S3 (via l'URL signée).
  4. (S3) Accepte le fichier (upload de 500 MB).
6.3 AccĂšs : CloudFront OAC (Static Website)

C'est la meilleure pratique (moderne) pour héberger un site web statique (React, Angular, HTML) sur S3.

L'Ancienne Méthode (Risquée)
  1. (S3) Activer "Static Website Hosting".
  2. (S3) Désactiver "Block Public Access" (BPA) (3.1).
  3. (S3) Ajouter une Bucket Policy "Effect": "Allow", "Principal": "*". (Le bucket est public).
  4. (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)
  1. (S3) Garder le bucket 100% PRIVÉ (BPA reste ActivĂ© (ON)).
  2. (CloudFront) Créer une "Distribution".
  3. (CloudFront) Dans "Origine", créer un OAC (Origin Access Control).
  4. (CloudFront) AWS affiche une Bucket Policy (Ă  copier).
  5. (S3) Coller cette Bucket Policy (JSON) (3.2).
    • (Cette Policy dit : "Allow s3:GetObject SEULEMENT au Principal: Service: cloudfront.amazonaws.com" (et ARN de la distribution)).

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).

6.4 Perf : S3 Select (Filtrage Server-Side)

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".

  1. (Lambda/EC2) GetObject() -> Télécharge 5 GB (Lent, Coûteux (Data Transfer)).
  2. (Lambda/EC2) Charge 5 GB en RAM.
  3. (Lambda/EC2) Parse (CPU) les 5 GB (ligne par ligne) pour trouver 10 lignes (Erreurs 500).
  4. (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'
            
  1. (S3) Reçoit la requĂȘte.
  2. (S3) Lit 5 GB (cÎté serveur).
  3. (S3) Filtre (cÎté serveur) les 10 lignes (Erreurs 500).
  4. (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).

3.4 Sécu : Access Points (En construction)

Contenu à venir pour S3 Access Points (points d'accÚs logiques avec policies dédiées).

5.4 Gestion : Replication (CRR/SRR) (En construction)

Contenu Ă  venir pour Cross-Region Replication (DR) et Same-Region Replication (Logs).