đ Amazon DynamoDB (NoSQL Key-Value & Document Store)
Guide IDEO-Lab : Modélisation de tables, partitionnement, capacité (RCU/WCU), indexes (LSI/GSI), Streams, Backups & Global Tables.
Concept : NoSQL Key-Value / Document
DynamoDB est un datastore managé, clé-valeur et document, conçu pour les charges massives à faible latence.
NoSQL Key-ValueConcept : Table, Item, Attribut
Une table contient des items (lignes), chaque item étant un document JSON flexible (attributs libres).
Table ItemConcept : Primary Key (PK/SK)
Partition key seule ou couple (PK, Sort Key) pour organiser les items par partition et par ordre.
Partition Key Sort KeyCapacité : RCU/WCU
CapacitĂ© de lecture (RCU) et dâĂ©criture (WCU), provisionnĂ©e ou Ă la demande.
RCU WCUModes : On-Demand vs Provisioned
Choix entre facturation Ă la requĂȘte ou capacitĂ© fixe avec autoscaling.
On-Demand ProvisionedThrottling & Hot Partitions
Quand une partition reçoit trop de trafic, les requĂȘtes sont throttlĂ©es (HTTP 400/ProvisionedThroughputExceeded).
Throttling Hot PartitionIndex : Local Secondary Index (LSI)
Index sur la mĂȘme partition key, avec une seconde sort key pour un autre ordre de tri.
LSI Same PKIndex : Global Secondary Index (GSI)
Index avec sa propre clĂ© de partition/sort, permettant dâautres patterns de requĂȘtes.
GSI Alternate PKSingle-Table Design
Regrouper plusieurs âentitĂ©sâ dans une seule table, optimisĂ©e pour les patterns de requĂȘte.
Single Table Access PatternsDynamoDB Streams & Lambda
Flux de changements (insert/update/delete) pour dĂ©clencher des Lambdas et alimenter dâautres systĂšmes.
Streams LambdaBackups & Point-in-Time Recovery
Backups complets Ă la demande et restauration Ă la seconde prĂšs.
Backup PITRGlobal Tables (Multi-Région)
Réplication active/active entre régions pour applications globales à faible latence.
Multi-Region Active-ActiveLes 5 Piliers de la réussite DynamoDB
Si vous ne respectez pas ces rÚgles, votre projet coûtera cher ou sera lent.
1. Access Pattern First
Ne crĂ©ez jamais une table sans savoir quelles requĂȘtes elle va servir.
"Dites-moi vos questions, je vous dirai votre schéma."
2. Cardinalité de la PK
La Partition Key doit avoir le plus de valeurs uniques possible (Millions d'IDs > 3 Status). C'est la clé de la scalabilité infinie.
3. Ăvitez les Scans
Un Scan est un échec de modélisation (sauf pour l'export/migration). Utilisez toujours GetItem ou Query.
4. Pré-calculer (Pre-Join)
DynamoDB ne fait pas de calcul complexe Ă la lecture. Stockez la donnĂ©e telle qu'elle doit ĂȘtre lue (Single Table Design).
5. Instrumenter le Throttling
L'application cliente DOIT gérer les "Retries" et l'"Exponential Backoff".
Checklist avant mise en Production
| Catégorie | Point de contrÎle | Recommandation |
|---|---|---|
| Design | PK & SK | La PK distribue-t-elle bien la charge ? La SK permet-elle les requĂȘtes de plage ? |
| Index (GSI) | Avez-vous limité les projections (KEYS_ONLY/INCLUDE) pour réduire les coûts ? | |
| Item Size | Les items sont-ils < 400KB ? Les gros blobs sont-ils dans S3 ? | |
| Ops | Capacity Mode | Provisioned + AutoScaling pour la Prod stable. On-Demand pour les pics imprévisibles. |
| Backup | PITR activé sur la Prod ? Plan de backup AWS Backup configuré ? | |
| TTL | Le TTL est-il activé pour nettoyer les données obsolÚtes (Logs, Sessions) ? | |
| Sécurité | IAM | Les rÎles sont-ils restreints (pas de dynamodb:*) ? Chiffrement KMS activé ? |
Architecture : DynamoDB au centre de tout
DynamoDB est souvent le "Hub" de stockage des architectures Serverless.
Patterns d'Intégration
- API Gateway + Lambda : Le backend standard. Lambda lit/écrit via le SDK.
- DynamoDB Streams + Lambda : Architecture événementielle (CDC). Déclenche un traitement à chaque insert.
- DynamoDB + OpenSearch : Pour la recherche textuelle floue (via Streams).
- S3 + Athena : Pour l'analytique (via Export Table).
Quand sortir de DynamoDB ?
Si vous commencez Ă tordre le modĂšle pour faire :
- Des agrégations complexes (SUM, AVG sur 1M lignes).
- Des recherches "LIKE %text%".
- Des graphes de relations profonds.
STOP ! Utilisez Redshift, OpenSearch ou Neptune.
L'outil indispensable : NoSQL Workbench
Ne modélisez pas sur un tableau blanc ou Excel. Utilisez l'outil officiel AWS (Gratuit, Mac/Win/Linux).
Fonctionnalités
- Data Modeler : Dessiner les tables, GSI et attributs.
- Visualizer : Voir comment les données s'organisent (Item Collections).
- Capacity Calculator : Estimer le coût WCU/RCU.
- Code Generator : GénÚre le code Python/Node/Java pour créer la table.
Autres Outils
- Dynobase : Client GUI tiers (Payant mais trĂšs puissant pour les devs).
- PartiQL : Langage SQL-like dans la console AWS pour tester des requĂȘtes rapides (attention, ça reste du NoSQL dessous !).
Résumé des Anti-Patterns (Ce qu'il ne faut pas faire)
| Erreur | Conséquence | Correction |
|---|---|---|
| Utiliser Scan | Lenteur extrĂȘme, CoĂ»t explosif. | CrĂ©er un GSI adaptĂ©. |
| 1 Table par EntitĂ© | Multiples requĂȘtes rĂ©seaux (N+1). | Single Table Design (Pre-join). |
| Hot Keys (Date/Status) | Throttling sur 1 partition. | Ajouter de l'entropie (Sharding) ou changer de clé. |
| GSI sur-projection | Coût de stockage x2 ou x3. | Utiliser KEYS_ONLY ou INCLUDE. |
Le Choc des Mondes : Relationnel vs NoSQL
La question n'est pas "Lequel est le meilleur ?", mais "Avez-vous besoin de JOINs ou de Scale ?"
| CritĂšre | RDS / Aurora (SQL) | DynamoDB (NoSQL) |
|---|---|---|
| ModÚle | Relationnel normalisé. Jointures complexes (JOIN). Intégrité référentielle (FK). | Clé-Valeur dénormalisé. Pas de JOIN. Données pré-assemblées (Item Collections). |
| Scaling | Vertical. On augmente la taille de l'instance (CPU/RAM). Limite : Max 128TB (Aurora) et limite de connexions TCP. | Horizontal. On ajoute des partitions. Limite : Aucune (Infinie). Performance constante Ă 100 TB. |
| Connexions | Stateful (TCP). Nécessite un Proxy pour les Lambdas (sinon "Too many connections"). | Stateless (HTTPS). Idéal pour le Serverless (Lambda peut ouvrir 10k connexions sans souci). |
| RequĂȘtes | Ad-hoc. SELECT * WHERE age > 20 AND city = 'Paris' (Flexible). | Par ClĂ©. GetItem(PK) ou Query(PK+SK). Tout autre filtre est un Scan (Lent). |
La Guerre du JSON : DynamoDB vs DocumentDB
Les deux stockent du JSON. Mais la philosophie est radicalement différente.
DynamoDB (Propriétaire AWS)
- Vrai Serverless : 0 instance à gérer. Scale à 0.
- Rigueur : Vous oblige Ă penser vos "Access Patterns" avant de coder.
- Index : Limité à 20 GSI. Coût à l'écriture.
- API : Propriétaire AWS (PutItem, GetItem).
DocumentDB (Mongo Compatible)
- Cluster Based : Vous payez des instances (min ~50$/mois) mĂȘme Ă vide (sauf vInstance).
- FlexibilitĂ© : Vous pouvez indexer n'importe quel champ JSON Ă la volĂ©e. RequĂȘtes d'agrĂ©gation puissantes.
- API : Compatible MongoDB (Migration facile).
Matrice de Décision
Migration Lift & Shift d'un MongoDB existant ? -> DocumentDB.
Nouveau projet Cloud-Native optimisé ? -> DynamoDB.
Vitesse vs Durabilité : Le Cache et la Base
DynamoDB est rapide (ms), mais Redis est ultra-rapide (”s). Sont-ils concurrents ?
| Feature | ElastiCache (Redis/Memcached) | DynamoDB (+ DAX) |
|---|---|---|
| Latence | Microsecondes. (In-Memory). | Millisecondes. (SSD). (Microsecondes avec DAX). |
| Durabilité | Volatile (RAM). Persistence optionnelle mais pas garantie à 100% sur crash. | Durable (3-AZ). Donnée stockée sur disque. Safe. |
| ModÚle de Coût | Provisioned (Instances de Cache). | On-Demand ou Provisioned. |
Quand utiliser Redis ?
Leaderboards temps réel, Compteurs transitoires, Pub/Sub, Session Store (si perte tolérée). Données que l'on peut recalculer.
Quand utiliser DynamoDB (ou DAX) ?
Paniers d'achat, Profils utilisateurs, Historique de commandes. Données qui doivent survivre à un redémarrage.
â Quand NE PAS utiliser DynamoDB
DynamoDB n'est pas un marteau pour tous les clous. Voici les cas oĂč vous allez souffrir.
| Besoin | Pourquoi DynamoDB échoue ? | Alternative AWS |
|---|---|---|
| Analytique / BI (GROUP BY, AVG, SUM) | Nécessite de scanner toute la table. Lent et coûteux. Pas de moteur d'agrégation natif. | Redshift (Data Warehouse) Athena (Sur S3) |
| Recherche Full-Text ("Contient 'chat'") | DynamoDB ne supporte que begins_with. Pas de recherche floue ou de tokenisation. | OpenSearch (Elasticsearch) CloudSearch |
| Gros Blobs (Images, PDF > 400KB) | Limite dure de 400KB par item. Coût de stockage élevé (0.25$/GB vs 0.023$/GB pour S3). | S3 (Stockez le lien dans Dynamo) |
| Graphes Complexes (RĂ©seaux sociaux, Fraude) | Parcourir des relations N Ă N profondes demande trop de requĂȘtes successives. | Neptune (Graph DB) |
| Données trÚs froides (Archivage 7 ans) | Le stockage DynamoDB est performant mais cher pour de l'archive morte. | S3 Glacier (Via Export S3 ou TTL) |
OĂč part votre argent ?
DynamoDB a plusieurs compteurs qui tournent en parallĂšle.
| Composante | Mode On-Demand | Mode Provisioned | Impact |
|---|---|---|---|
| Lecture/Ăcriture | PayĂ© au Million de requĂȘtes (RRU/WRU). Cher Ă l'unitĂ©. | PayĂ© Ă l'heure par capacitĂ© (RCU/WCU). Pas cher si bien utilisĂ©. | Majeur (70%) |
| Stockage | 0.25$ / GB / mois. | 0.25$ / GB / mois. | Moyen (20%) |
| Backup (PITR) | ~0.20$ / GB / mois. | ~0.20$ / GB / mois. | Faible (sauf Huge Data). |
| Streams | Gratuit (RCU) pour 2 consumers. | Gratuit (RCU) pour 2 consumers. | Nul. |
| Global Tables | Replicated WRU (xN Régions). | Replicated WCU (xN Régions). | Critique (Multiplicateur) |
Réduire la facture sans réduire la perf
1. Reserved Capacity (Le -50% facile)
Si vous ĂȘtes en mode Provisioned et que votre trafic a un "plancher" stable (baseline), achetez de la capacitĂ© rĂ©servĂ©e.
Gain : 50% à 77% de réduction sur les WCU/RCU.
2. TTL (Le Nettoyeur)
Ne payez pas pour stocker des vieux logs ou des sessions expirées.
Activez le TTL sur un attribut expire_at. La suppression est gratuite (ne consomme pas de WCU).
3. Compresser les Items
DynamoDB facture par bloc de 1 KB.
Utilisez des noms d'attributs courts ("d" vs "description") ou compressez les gros textes en binaire cÎté client.
Quel mode choisir selon votre Business ?
Scénario A : SaaS B2B (Stable)
Profil : Trafic constant de 9h Ă 18h. Peu de trafic la nuit. Pas de pics soudains.
- Choix : Provisioned + Autoscaling.
- Pourquoi : L'autoscaling a le temps de suivre la courbe douce du matin et du soir. Le coût unitaire est le plus bas.
- Bonus : Acheter des réservations pour couvrir le trafic de base.
ScĂ©nario B : App ĂvĂ©nementielle (Bursty)
Profil : Rien pendant 1 semaine, puis 1 Million de users en 10 minutes (Vote TV, Flash Sale).
- Choix : On-Demand.
- Pourquoi : L'autoscaling est trop lent (met 10-30 min à scaler). On-Demand absorbe le pic instantanément.
- Calcul : Payer 1.25$ le million de requĂȘtes pendant 10 min est moins cher que de provisionner 50k WCU pendant 1h.
Scénario C : App Mobile (Cycle Jour/Nuit)
Profil : Trafic sinusoïdal trÚs marqué.
- Choix : Provisioned + Autoscaling Agressif.
- Réglage : Mettre la cible (Target Utilization) à 80% pour scaler vite, et réduire le scale-in cooldown pour redescendre vite la nuit.
Les piÚges à éviter
- Les Scans : Un développeur fait un
Scancomplet de la table toutes les 5 minutes pour compter les users.
-> Facture explosive car il lit TOUTE la table Ă chaque fois.
-> Solution : Utiliser DynamoDB Streams + Lambda pour incrĂ©menter un compteur. - GSI Inutiles : Vous ajoutez un index "au cas oĂč".
-> Vous payez le stockage ET les Ă©critures (WCU) pour cet index, mĂȘme si personne ne le lit. - RĂ©seau NAT Gateway : Vos Lambdas dans un VPC privĂ© accĂšdent Ă DynamoDB via la NAT Gateway.
-> Vous payez le traitement des données NAT (0.045$/GB).
-> Solution : Utiliser un VPC Gateway Endpoint (Gratuit).
Pourquoi DynamoDB est "increvable" ?
Avant mĂȘme de parler de backups, comprenez comment la donnĂ©e est stockĂ©e.
Réplication Synchrone Multi-AZ
- Chaque écriture (PutItem) est répliquée de maniÚre synchrone sur des disques SSD situés dans 3 Zones de Disponibilité (AZ) physiquement distinctes.
- DynamoDB confirme l'écriture (HTTP 200) seulement quand la donnée est sécurisée sur au moins 2 zones.
- Résultat : Si un Datacenter brûle, vous ne perdez aucune donnée et la base continue de répondre (High Availability).
SLA & Durabilité
| Durabilité | 99.999999999% (11 nines). |
| Disponibilité | 99.99% (Standard) ou 99.999% (Global Tables). |
Snapshots Complets : Ă la demande & AWS Backup
Utile pour l'archivage long terme, la conformité légale ou avant une mise en prod risquée.
Option A : DynamoDB Native Backup
- Vitesse : Instantané (Zéro impact sur la prod).
- Gestion : Au niveau de la table.
- Rétention : Manuelle (on supprime quand on veut).
Option B : AWS Backup (Enterprise)
- CentralisĂ© : GĂšre DynamoDB, RDS, EBS, S3 au mĂȘme endroit.
- Lifecycle : Passage automatique en Cold Storage (Archive) pour réduire les coûts aprÚs X jours.
- Vault Lock : Protection WORM contre les Ransomwares (Interdiction de supprimer les backups, mĂȘme pour l'admin root).
PITR (Point-in-Time Recovery) : Le "Ctrl+Z" ultime
ProtÚge contre les erreurs humaines ("Oups, j'ai supprimé la table" ou "Mon script a corrompu les données").
| Fonctionnalité | Détail Technique |
|---|---|
| Principe | Enregistre chaque modification en continu (Log stream). |
| Granularité | Restauration à la seconde prÚs. |
| FenĂȘtre | Les 35 derniers jours (glissant). Au-delĂ , c'est perdu (sauf si snapshot). |
| CoĂ»t | Payant au GB/mois. (Doit ĂȘtre activĂ© explicitement). |
â ïž Architecture : Le PiĂšge de la Restauration
Il est IMPOSSIBLE de restaurer une table "sur place".
Toute restauration (PITR ou Snapshot) crée obligatoirement une NOUVELLE TABLE avec un nouveau nom (ou un nouvel ARN).
Impact sur le RTO (Recovery Time Objective)
Votre procédure de DR doit prévoir le basculement de l'application :
- Lancer le Restore (Temps : ~20min Ă plusieurs heures selon la taille).
- Option 1 (DNS/Config) : Changer la variable d'env
DYNAMODB_TABLE_NAMEdans les Lambdas/EC2 pour pointer vers la nouvelle table. - Option 2 (Route53) : Si vous utilisez Global Tables, faire un failover vers une autre région saine.
Note : La nouvelle table n'a PAS les alarmes, les tags, ni les politiques IAM de l'ancienne. Utilisez l'IaC (Terraform/CDK) pour réappliquer la config.
Export to S3 : Analytics sans Impact
Comment faire des GROUP BY ou des analyses BI sur vos données NoSQL ?
La Méthode "Export Table"
- Zéro RCU : L'export utilise une copie interne. Votre prod ne ralentit pas d'une milliseconde.
- Formats : DynamoDB JSON ou ION (binaire).
- Destination : S3 (Data Lake).
Intégration Athena / Glue
Une fois les données dans S3 :
1. Crawler Glue catalogue les données.
2. Athena permet de faire du SQL standard dessus.
Idéal pour les rapports mensuels ou l'audit.
IAM : L'Authentification & Autorisation
DynamoDB n'a pas de "login/password". Tout accÚs se fait via des IAM Roles (pour les services) ou IAM Users (pour les humains, à éviter).
Principe de Moindre PrivilĂšge
Ne donnez jamais AmazonDynamoDBFullAccess. Soyez chirurgical.
| Action | Description | Risque |
|---|---|---|
dynamodb:PutItem | Ăcrire/Ecraser un item. | Peut Ă©craser des donnĂ©es critiques. |
dynamodb:GetItem | Lire un item par sa clé. | Faible (si ciblé). |
dynamodb:Scan | Lire TOUTE la table. | ĂlevĂ©. Fuite de donnĂ©es massive + CoĂ»t $$$. |
dynamodb:DeleteTable | Supprimer la table. | Critique. à réserver aux admins. |
Resource ARN
Restreignez toujours l'accÚs à des tables spécifiques (et leurs index).
Fine-Grained Access Control (FGAC) : La "Row-Level Security"
Comment autoriser un utilisateur mobile à accéder uniquement à ses propres données dans une table partagée ?
Réponse : Les Conditions IAM.
1. LeadingKeys (Sécurité Ligne)
Restreint l'accĂšs aux items dont la Partition Key correspond Ă une variable (ex: ID de l'utilisateur Cognito).
2. Attributes (Sécurité Colonne)
Interdit la lecture de certains attributs (ex: voir le profil mais pas le salary).
Exemple de Policy (SaaS Multi-Tenant)
{
"Effect": "Allow",
"Action": [ "dynamodb:GetItem", "dynamodb:Query" ],
"Resource": "arn:aws:dynamodb:region:id:table/AppTable",
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": ["${www.amazon.com:user_id}"],
"dynamodb:Attributes": ["Name", "Email", "Orders"]
}
}
}Traduction : "L'utilisateur ne peut lire que les lignes oĂč PK = Son ID, et ne peut voir que les colonnes Nom, Email et Commandes."
Chiffrement au Repos (Encryption at Rest)
Toutes les tables DynamoDB sont chiffrées. Vous ne pouvez pas le désactiver. Mais vous pouvez choisir la clé.
| Type de Clé (KMS) | Coût | ContrÎle | Usage |
|---|---|---|---|
| AWS Owned Key (Par défaut) | Gratuit | Aucun. AWS gÚre la rotation. | Projets standards, Dev, Tests. |
| AWS Managed Key ( aws/dynamodb) | Gratuit* | Visible dans IAM. Rotation auto tous les ans. | Besoin de voir la clé dans les logs CloudTrail. |
| Customer Managed Key (CMK) | Payant 1$/mois + appels API. | Total. Vous gérez la rotation, les droits d'accÚs, la suppression. | Obligatoire pour : - Cross-Account Access. - Données sensibles (PCI-DSS, Santé). |
Stratégies d'Isolation : "Blast Radius"
Comment empĂȘcher qu'un script de test supprime la base de prod ?
Niveau 1 : Naming (Faible)
Tables Prod_Users et Dev_Users dans le mĂȘme compte.
Risque : Erreur humaine élevée (oubli du préfixe dans le code). Quotas partagés (le load test en Dev throttle la Prod).
Niveau 2 : Multi-Account (Fort)
Un compte AWS Production et un compte Staging.
Avantage : Isolation totale (Sécurité et Quotas). Impossible de supprimer la prod par accident avec des credentials de dev.
VPC Endpoints (Réseau)
Par défaut, DynamoDB est accessible via Internet public (sécurisé par IAM).
Pour une sécurité maximale, utilisez un VPC Gateway Endpoint.
Chiffrement CÎté Client (Banking/Santé)
MĂȘme avec KMS (Server-Side), les admins AWS ou les admins de votre compte *pourraient* thĂ©oriquement voir les donnĂ©es s'ils ont les droits.
Pour une confidentialité absolue (Zero Trust), chiffrez la donnée avant de l'envoyer.
DynamoDB Encryption Client
Une librairie AWS open-source.
- Fonctionnement : Chiffre les valeurs des attributs (ex: le numéro de carte bleue) mais laisse la Clé Primaire en clair (pour permettre le routing).
- Transparence : Le SDK déchiffre automatiquement à la lecture si l'app a la clé.
- Sécurité : La donnée stockée sur DynamoDB est un blob binaire illisible pour quiconque n'a pas la clé privée.
Strongly vs Eventually Consistent : Le compromis
DynamoDB réplique vos données sur 3 Zones de Disponibilité (AZ). La vitesse de la lumiÚre n'étant pas infinie, il y a un délai de propagation.
| Mode | Comportement | Impact (Coût & Perf) |
|---|---|---|
| Eventually Consistent (Par Défaut) | Vous lisez sur 1 seule copie (au hasard). Risque : Si une écriture a eu lieu il y a 100ms, vous pourriez recevoir l'ancienne valeur (Stale Data). | Rapide Latence la plus faible. 0.5 RCU par 4KB (Moitié prix !). |
| Strongly Consistent (Optionnel) | DynamoDB force un quorum de lecture. Il garantit que vous recevez la derniÚre écriture validée (ACK). | Latence + élevée (Réseau inter-AZ). 1 RCU par 4KB (Plein tarif). |
Transactions ACID (Multi-Item / Multi-Table)
Depuis 2018, DynamoDB n'est plus "juste" NoSQL. Il supporte des transactions complexes "Tout ou Rien".
Cas d'usage : Virement Bancaire
Je dois dĂ©biter Alice (-100âŹ) ET crĂ©diter Bob (+100âŹ).
Si l'un échoue, l'autre ne doit pas se faire.
Le Prix de la Sécurité
Les transactions utilisent un protocole de validation en 2 phases (2PC).
Coût : x2
1 Ăcriture Transactionnelle = 2 WCUs.
1 Lecture Transactionnelle = 2 RCUs.
Le ProblĂšme du "Lost Update"
Alice lit un document (v1). Bob lit le mĂȘme document (v1). Alice sauvegarde (v2). Bob sauvegarde (v2).
Résultat : Les modifications d'Alice sont écrasées par Bob.
Solution : Optimistic Locking avec numéro de version
- Ajouter un attribut
version(nombre) à chaque item. - à chaque lecture, récupérer la version actuelle.
- à chaque écriture, envoyer la version lue et demander d'incrémenter.
Condition Expressions : La logique au niveau stockage
Ne faites pas "Read-Then-Write" dans votre code (lent et risqué). Envoyez la condition à DynamoDB.
| Pattern | Syntaxe | Usage |
|---|---|---|
| CrĂ©ation Unique | attribute_not_exists(PK) | EmpĂȘche PutItem d'Ă©craser un item existant. Utile pour "CrĂ©er un compte" (Email unique). |
| Stock suffisant | Stock >= :qty | Vérifie qu'il y a assez de produits avant de décrémenter. |
| Appartenance | OwnerID = :me | Sécurité : Vérifie que je suis bien le propriétaire de l'item avant de le modifier/supprimer. |
| Validation | contains(Roles, :role) | Vérifie si une chaßne existe dans un Set ou une Liste. |
Note : Si la condition échoue, vous ne payez que 1 WCU (coût de vérification), pas le coût de l'écriture complÚte.
Idempotence : Gérer les pannes réseaux
Si vous envoyez une requĂȘte TransactWrite et que vous avez un timeout rĂ©seau (pas de rĂ©ponse), l'Ă©criture a-t-elle rĂ©ussi ? Vous ne savez pas.
Si vous réessayez (Retry), vous risquez de débiter le client deux fois !
ClientRequestToken
DynamoDB supporte un token d'idempotence pour les transactions.
- Générez un UUID unique pour chaque transaction métier.
- Passez-le dans
ClientRequestToken. - Si vous relancez la mĂȘme requĂȘte avec le mĂȘme token (dans les 10 min), DynamoDB renvoie le rĂ©sultat de la 1Ăšre rĂ©ussite sans rĂ©-exĂ©cuter (et sans re-facturer).
L'Inversion de ContrĂŽle : Design from Queries
En SQL, on crĂ©e les tables (Data First) et on Ă©crit les requĂȘtes aprĂšs. En DynamoDB, c'est l'inverse. Si vous ne connaissez pas vos requĂȘtes, vous ne pouvez pas crĂ©er la table.
Le Workflow de Design
- Lister les Entités : User, Order, Product.
- Lister les Access Patterns : "Je veux voir les commandes d'un user", "Je veux voir le détail d'une commande".
- Définir les Clés : Choisir PK et SK pour satisfaire ces demandes.
- Créer la Table : Seulement à la fin.
La "Rule of Thumb"
"Si votre application a besoin de faire 2 requĂȘtes DynamoDB pour afficher une seule vue (Page Web), votre modĂšle est probablement sub-optimal."
Objectif : 1 Vue = 1 RequĂȘte (Pre-Joining).
Structure Single-Table : Noms Génériques
Pour stocker des Users et des Produits dans la mĂȘme table, il faut abstraire les noms de colonnes.
| Attribut | Type | Description & RĂŽle |
|---|---|---|
| PK | String | Partition Key. Contient l'ID principal (ex: `USER#123`, `ORDER#456`). |
| SK | String | Sort Key. Définit le type de donnée ou le tri (ex: `METADATA`, `ITEM#001`). |
| Type | String | (Optionnel) Permet de filtrer cÎté application ou pour l'export Analytics (ex: "User", "Order"). |
| GSI1PK | String | Clé de partition pour le 1er Index Global (Overloading). |
| GSI1SK | String | Clé de tri pour le 1er Index Global. |
#) dans vos clés pour faciliter le parsing cÎté client (ex: split('#')[1]).Pattern : Relation 1-N (PÚre-Fils)
Le cas classique E-Commerce : Un Client a des Commandes, qui ont des Paiements.
Table : Données stockées
| PK | SK | Data | Access Pattern |
|---|---|---|---|
| USER#101 | PROFILE | { Name: "Alice" } | Get Profile |
| USER#101 | ORDER#2023-01-01 | { Total: 50⏠} | Get Order A |
| USER#101 | ORDER#2023-02-15 | { Total: 120⏠} | Get Order B |
| USER#101 | PAYMENT#2023-02-15 | { Status: "OK" } | Get Payment B |
RequĂȘtes Magiques
- Tout récupérer (User + Orders + Payments) :
Query(PK="USER#101"). - Juste les commandes :
Query(PK="USER#101", SK BEGINS_WITH("ORDER#")). - Commandes de 2023 :
Query(PK="USER#101", SK BEGINS_WITH("ORDER#2023")).
Pattern : Séries Temporelles (Logs, Feed)
Objectif : Afficher les 10 derniers événements d'un capteur IoT ou d'un réseau social.
Structure
- PK :
DEVICE#123ouUSER_FEED#456. - SK : Timestamp ISO8601 (ex:
2023-10-27T10:00:00Z).
La RequĂȘte "Derniers Items"
Le PiĂšge du Hot Partition
Si vous utilisez juste la date (ex: 2023-10-27) en PK pour grouper tous les logs du monde, vous créez une Hot Partition.
Gardez une PK distribuée (ex: AppID ou ShardID).
Pattern : Adjacency List (Many-to-Many)
Exemple : Des Ătudiants s'inscrivent Ă des Cours.
Table Principale (Vue Ătudiant)
Je veux voir les cours d'Alice.
GSI Inversé (Vue Prof)
Je veux voir les inscrits en Maths.
Technique : On copie la SK dans le GSI-PK et la PK dans le GSI-SK. Cela permet d'interroger la relation dans les deux sens.
Le Secret : "Divide & Conquer"
DynamoDB ne stocke pas vos données sur un seul serveur. Il découpe votre table en milliers de morceaux appelés Partitions. Chaque partition est répliquée sur 3 AZ (Zones de Disponibilité).
Les Limites Dures d'une Partition
Peu importe la taille de votre table, une partition individuelle ne peut pas dépasser ces limites physiques :
| Stockage | 10 GB |
| Ăcriture (WCU) | 1 000 / sec |
| Lecture (RCU) | 3 000 / sec |
Partition Split (Division)
Si vous dépassez 10GB de données dans une partition, DynamoDB la coupe automatiquement en deux nouvelles partitions (5GB chacune).
C'est ainsi que DynamoDB scale à l'infini : plus de données = plus de partitions = plus de débit total.
La "Hash Key" : Le GPS de la donnée
Comment DynamoDB sait-il sur quelle partition (parmi 10 000) se trouve votre item ? GrĂące Ă la fonction de hachage.
Bonne PK (Haute Cardinalité)
UserID, DeviceID, UUID.
Le hachage disperse ces valeurs aléatoirement sur toutes les partitions disponibles.
Résultat : Parallélisme maximal.
Mauvaise PK (Faible Cardinalité)
Status (Pending/Done), Gender, Date (2024-01-01).
MĂȘme aprĂšs hachage, tous les items "Pending" vont au mĂȘme endroit.
Résultat : Embouteillage sur une seule partition.
Hot Partition : L'Ennemi de la Performance
Une "Hot Partition" est une partition physique qui reçoit plus de trafic qu'elle ne peut en supporter (1000 WCU), alors que les autres partitions sont vides.
Causes Fréquentes
| Type | Exemple | Conséquence |
|---|---|---|
| Hot Key | Tous les utilisateurs likent le mĂȘme post populaire (PK="Post#123"). | Throttling immĂ©diat sur cette clĂ©. |
| Time Series | PK = Date du jour. Tout le trafic s'écrit sur la partition "Aujourd'hui". | On n'utilise qu'une fraction de la capacité totale provisionnée. |
ProvisionedThroughputExceeded. C'est le signe d'une Hot Partition.Adaptive Capacity : La réponse d'AWS
Depuis 2019, DynamoDB tente de corriger automatiquement les partitions chaudes.
Fonctionnement Automatique
- DynamoDB détecte un déséquilibre (Partition A chauffe).
- Il alloue plus de capacité à la Partition A (en prenant sur les autres).
- Si cela ne suffit pas, il Isole l'item chaud (Split) pour qu'il ait sa propre partition dédiée.
Limites
Adaptive Capacity prend 5 à 30 minutes pour réagir.
Il ne peut JAMAIS dépasser la limite physique de 1000 WCU / 3000 RCU pour un seul item.
Conclusion : Un bon design de clé reste obligatoire.
Technique Expert : Write Sharding
Comment gérer un compteur de votes pour l'élection présidentielle (1 Million writes/sec) sur une seule clé ?
Algorithme de Write Sharding
Lecture (Scatter-Gather) : Pour avoir le total, l'application doit lire les 100 partitions (BatchGetItem ou Query parallĂšle) et faire la somme.
Coût : Complexité applicative en lecture, mais performance d'écriture infinie.
Le Choix CornĂ©lien : FlexibilitĂ© ou Ăconomie ?
Vous pouvez changer de mode une fois toutes les 24 heures. Il est donc crucial de comprendre les différences.
| Caractéristique | On-Demand (à la demande) | Provisioned (Provisionné) |
|---|---|---|
| Facturation | Par million de requĂȘtes (RRU / WRU). Prix Premium (~7x plus cher) | Par capacitĂ© horaire (RCU / WCU). Prix Bas (Surtout avec RĂ©servation) |
| Scaling | Instantané. GÚre les pics de 0 à 40 000 req/s sans configuration. | Réactif (Lent). L'autoscaling met quelques minutes à réagir à un pic. |
| Throttling | Quasi impossible (sauf Hot Partition ou limite de compte atteinte). | Possible si le pic est plus rapide que l'autoscaling ("Flash Crowd"). |
| Idéal pour... | Startups, Dev, Trafic imprévisible, Batchs irréguliers. | Trafic stable, E-commerce constant, Production optimisée. |
Mode On-Demand : La tranquillité d'esprit
Aucune configuration de capacité. DynamoDB gÚre tout. Idéal pour les charges de travail "Spiky" (en dents de scie).
Comment ça marche ?
- DynamoDB alloue instantanĂ©ment les ressources dĂšs qu'une requĂȘte arrive.
- Warm-up : Une nouvelle table On-Demand peut encaisser 4000 WCU et 12000 RCU immédiatement.
- Adaptation : Si vous dépassez le pic précédent, DynamoDB double la capacité disponible en ~30 minutes pour le prochain pic.
Unités de Facturation
- RRU (Read Request Unit) : 1 lecture forte (4KB).
- WRU (Write Request Unit) : 1 écriture (1KB).
- Exemple : Ăcrire 1 million d'items coĂ»te ~1.25$ (us-east-1).
Mode Provisioned : L'optimisation FinOps
Vous définissez un nombre de WCU/RCU min et max. L'Auto Scaling ajuste la capacité entre les deux.
Le PiĂšge de l'Autoscaling (Lag)
Solution : Pour les événements prévisibles (Black Friday), utilisez le Scheduled Scaling pour augmenter la capacité avant le pic.
Le Cycle de Vie d'une Table
La bonne stratégie n'est pas statique, elle évolue avec votre produit.
| Phase Projet | Mode Recommandé | Raison |
|---|---|---|
| 1. Développement | On-Demand | Trafic nul ou sporadique. On ne veut pas payer la nuit/weekend. |
| 2. Lancement (Go Live) | On-Demand | On ne connaßt pas encore le comportement des utilisateurs. On évite le throttling à tout prix. |
| 3. CroisiÚre (Run) | Provisioned | AprÚs 1 ou 2 mois, on analyse les métriques CloudWatch. Le trafic est stable/prévisible. On active l'Autoscaling. |
| 4. Optimisation | Reserved Cap. | On achÚte de la capacité réservée sur 1 an pour la "baseline" du trafic. |
Maths : Quand basculer ?
Provisioned est moins cher, MAIS si votre autoscaling est mal réglé (sur-provisionning), vous payez pour du vide.
Le seuil de rentabilité
Le mode Provisioned est environ 5 à 7 fois moins cher à l'unité que le On-Demand.
Cependant, si votre table Provisioned a un taux d'utilisation moyen (Utilization Ratio) de moins de 15% (trÚs peu utilisée la nuit, pics énormes le jour), alors On-Demand reste moins cher.
Exemple Chiffré (US East)
- On-Demand : 1 Million écritures = 1.25$
- Provisioned : 1 WCU (suffit pour ~2.6M écritures/mois à 100% load) = 0.47$ / mois.
Si vous arrivez à garder votre WCU chargé à >20%, le Provisioned gagne toujours.
Le Choix Fondateur : Simple ou Composite ?
à la création de la table, vous devez choisir la structure de votre clé primaire. Ce choix est immuable.
| Clé Simple (Partition Key Only) | VS | Clé Composite (PK + Sort Key) |
|---|---|---|
Structure : 1 attribut (ex: SessionId). | Structure : 2 attributs (ex: UserId + Timestamp). | |
| UnicitĂ© : La PK doit ĂȘtre unique dans toute la table. | UnicitĂ© : La combinaison (PK + SK) doit ĂȘtre unique. La PK peut ĂȘtre dupliquĂ©e. | |
| ModÚle : Key-Value Store pur (comme Redis/Memcached). | ModÚle : Relations 1-N, Séries Temporelles, Hierarchies. | |
AccÚs : Uniquement GetItem (accÚs direct). | AccÚs : GetItem (précis) OU Query (plage). |
La Partition Key (PK) : L'Adresse Physique
Pourquoi l'appelle-t-on aussi "Hash Key" ?
Parce que DynamoDB passe la valeur de la PK dans une fonction de hachage interne.
Le Flux Interne
PK="User#123"
âŹïž Hash Function (MD5-like)
Result="7a9d..."
âŹïž Map to Storage Node
Partition #4 (SSD)
Conséquences Architecturales
- Distribution : Si vos PK sont séquentielles (1, 2, 3), le hachage les disperse bien.
- ĂgalitĂ© stricte : Vous ne pouvez JAMAIS faire de requĂȘte "Commence par" ou "SupĂ©rieur Ă " sur une PK. C'est toujours
PK = valeur. - Performance : L'accĂšs est O(1). DynamoDB sait exactement sur quel serveur aller sans chercher.
La Sort Key (SK) : L'Ordre Logique
Si la PK détermine "Sur quelle étagÚre" est le livre, la SK détermine "à quelle place" sur l'étagÚre.
Stockage Trié (B-Tree)
Sur le disque, les items partageant la mĂȘme PK sont stockĂ©s physiquement contigus, triĂ©s par ordre binaire de la SK.
C'est pour cela que lire une plage de dates est ultra-rapide.
Opérateurs Puissants
Contrairement à la PK, la SK supporte les opérateurs riches :
BEGINS_WITH("2023-")BETWEEN 100 AND 200>,<,>=
Item Collections : Le "Cluster" de données
L'ensemble des items ayant la mĂȘme PK forme une Item Collection.
Exemple E-Commerce (Table Unique)
| PK (Partition) | SK (Sort) | Data | Commentaire |
|---|---|---|---|
| CUSTOMER#101 (Collection) | METADATA | { "Nom": "Alice" } | Le profil du client |
| ORDER#2023-01-05 | { "Total": 50⏠} | Commande Janvier | |
| ORDER#2023-02-14 | { "Total": 120⏠} | Commande Février | |
| ORDER#2023-03-01 | { "Total": 10⏠} | Commande Mars |
Query(PK="CUSTOMER#101"). Je peux récupérer juste les commandes de 2023 :
Query(PK="CUSTOMER#101", SK BEGINS_WITH("ORDER#2023")).Quelle API utiliser ?
Comprendre la différence est vital pour la performance et le coût.
| API | Condition | Résultat | Coût (RCU) |
|---|---|---|---|
| GetItem | Doit fournir la PK ET la SK exacte. | 1 seul item (ou rien). | Taille de l'item (arrondi 4KB). |
| Query | Doit fournir la PK exacte. Peut fournir une condition sur la SK. | Une liste d'items (jusqu'à 1MB de données). | Somme des tailles des items retournés (TrÚs efficace). |
| Scan | Aucune clé requise. | Toute la table (page par page). | Taille totale de la table. $$$ |
Structure Logique : Schemaless & JSON
DynamoDB organise les données de maniÚre hiérarchique simple, mais avec une flexibilité totale au niveau de l'Item.
Table
Collection d'items.
Contrairement à SQL, une table est Schemaless : vous ne définissez que la Clé Primaire lors de la création. Le reste est libre.
Item
Enregistrement individuel (Ligne).
C'est un Document JSON. Chaque item peut avoir des attributs différents des autres (ex: un item a "Email", l'autre a "Telephone").
Attribut
ĂlĂ©ment de donnĂ©e (Colonne).
Peut ĂȘtre simple (String, Number) ou complexe (List, Map imbriquĂ©e).
Le CĆur du Design : La ClĂ© Primaire
Il n'y a que deux façons de définir une clé primaire. Ce choix dicte comment vous pourrez accéder à vos données.
1. Partition Key (Simple)
Composée d'un seul attribut (PK).
Contrainte : La PK doit ĂȘtre unique dans toute la table.
Usage : Key-Value Store (ex: Session Cache, User Profile par ID).
2. Partition Key + Sort Key (Composite)
Composée de deux attributs (PK + SK).
Contrainte : La combinaison (PK + SK) doit ĂȘtre unique.
Usage : Relations 1-N (ex: Un Client a plusieurs Commandes).
Types Scalaires & Complexes
DynamoDB supporte un jeu riche de types de données pour modéliser des documents complexes.
| Catégorie | Type | Code | Description & Usage |
|---|---|---|---|
| Scalaires | String | S | UTF-8 binaire. (ex: "Bonjour"). |
| Number | N | Stocké comme texte pour préserver la précision ("105.50"). Supporte entiers et flottants. | |
| Binary | B | Données binaires brutes (ex: Image compressée, hash chiffré). | |
| Boolean | BOOL | True / False. | |
| Sets (Ensembles) | String Set | SS | Liste de chaĂźnes uniques. L'ordre n'est pas garanti. (ex: Tags ["React", "AWS"]). |
| Documents | Map | M | Objet JSON imbriqué. (ex: {"Rue": "Paix", "CP": 75000}). |
| List | L | Tableau ordonné hétérogÚne. (ex: ["Alice", 42, true]). |
La Limite des 400 KB
Hard Limit
La taille totale d'un item (Noms des attributs + Valeurs) ne peut pas dépasser 400 KB.
Cela inclut les structures imbriquées (Listes, Maps).
Workarounds
- Compression : Gzipper les gros textes avant stockage (Type Binary).
- S3 Offloading : Stocker les gros contenus (PDF, Images, Textes longs) dans S3 et garder uniquement le lien (URL) dans DynamoDB.
- Découpage : Séparer un item en plusieurs lignes (Item Collection).
Autres Limites Importantes
- Profondeur JSON : Max 32 niveaux d'imbrication (Maps dans Maps).
- Taille Clé Partition (PK) : Max 2048 octets.
- Taille Clé de Tri (SK) : Max 1024 octets.
Oubliez la Normalisation (3NF)
En SQL, on modélise les données pour économiser de l'espace (Normalisation). On crée des tables séparées (Users, Orders) et le moteur fait des JOINs au moment de la lecture (CPU intensif).
La Philosophie DynamoDB
- Access Pattern First : On ne modélise pas les entités, on modélise les questions qu'on posera à la base.
- Pre-Joining : Puisque DynamoDB ne fait pas de JOIN, on pré-calcule les jointures en écrivant les données liées cÎte à cÎte sur le disque.
- 1 Application = 1 Table : On réduit l'overhead de gestion (monitoring, alarmes, connexion).
Le Concept Clé
"Les donnĂ©es qui sont lues ensemble doivent ĂȘtre stockĂ©es ensemble."
-- Rick Houlihan (Inventeur du pattern)
Key Overloading : Des noms génériques
Dans une table unique, la colonne de clé primaire va contenir des IDs d'utilisateurs, de commandes, de produits... On ne peut pas l'appeler UserID.
| Nom de Colonne | Type | Pourquoi ce nom ? |
|---|---|---|
| PK (Partition Key) | String | Nom générique. Contiendra USER#123 ou ORDER#999. |
| SK (Sort Key) | String | Nom générique. Contiendra PROFILE ou ITEM#abc. |
| Data / Payload | Any | Les autres attributs (Nom, Prix, Date) gardent leurs noms sémantiques. |
USER#, ORD#) pour éviter les collisions d'ID et permettre le tri.Cas Pratique : E-Commerce (Client + Commandes)
Objectif : Stocker un client, ses commandes, et le détail des produits, tout en permettant des accÚs rapides.
Visualisation de la Table
| PK | SK | Attributs (Data) | Type d'entité |
|---|---|---|---|
| USER#123 | PROFILE | { "Nom": "Alice", "Email": "..." } | Profil Utilisateur |
| USER#123 | ORDER#2023-01-01 | { "Total": 50, "Status": "Shipped" } | Commande A |
| USER#123 | ORDER#2023-02-15 | { "Total": 120, "Status": "Pending" } | Commande B |
Item Collections : Le "JOIN" gratuit
Tous les items partageant la mĂȘme PK (ici USER#123) sont stockĂ©s physiquement ensemble sur le disque. C'est une Item Collection.
La RequĂȘte Magique
Comparatif Performance
- SQL :
1. Chercher User (Index Scan)
2. Chercher Orders (Index Scan)
3. Merge (CPU)
Lent si beaucoup de données. - DynamoDB Single-Table :
1. Aller direct au Hash "USER#123".
2. Lire séquentiellement.
Vitesse constante (O(1)) mĂȘme avec 1 milliard de donnĂ©es.
Faut-il utiliser Single-Table partout ?
Non. C'est un pattern expert qui a des inconvénients majeurs.
Avantages
- Vitesse : Une seule requĂȘte rĂ©seau pour rĂ©cupĂ©rer des donnĂ©es hiĂ©rarchiques.
- Coût : Moins d'overhead (WCU/RCU) qu'en gérant 10 tables.
- Ops : Une seule table Ă monitorer, backuper, scaler.
Inconvénients
- Complexité : Courbe d'apprentissage brutale. Code plus difficile à lire.
- Rigidité : TrÚs difficile d'ajouter de nouveaux access patterns plus tard.
- Analytics : Impossible à analyser avec des outils BI standards sans export ETL préalable.
Verdict : Utilisez le Single-Table pour les applications Ă trĂšs fort trafic (Hyper-Scale). Pour une petite app CRUD ou un MVP, le Multi-Table est souvent plus simple et suffisant.
Comprendre le GSI : Une "Table Ombre"
Un GSI n'est pas un simple B-Tree comme dans MySQL. C'est littéralement une deuxiÚme table DynamoDB gérée par AWS, synchronisée automatiquement.
Différences Table vs GSI
- Clé Primaire : Totalement différente de la table. (ex: Table PK=`UserID`, GSI PK=`Email`).
- Attributs : Ne contient qu'une copie partielle des données (Projection).
- Consistance : Toujours Eventual. Il y a un lag (ms) entre l'écriture table et l'apparition dans le GSI.
Workflow d'Ăcriture
- App fait
PutItemsur la Table Principale. - DynamoDB ack (200 OK).
- En arriÚre-plan, DynamoDB détecte la modif et la propage vers le GSI.
- Conséquence : On ne peut pas faire un "Strongly Consistent Read" sur un GSI.
Projections : Optimiser le Stockage et les WCU
Puisque le GSI est une copie, vous payez le stockage et l'écriture en double. L'attribut Projection définit ce que vous copiez.
| Type de Projection | Ce qui est copié | Impact Coût | Cas d'usage |
|---|---|---|---|
| KEYS_ONLY | Seulement PK + SK (Table) et PK + SK (Index). | Minimum | Vérifier l'existence d'un item ("Est-ce que cet email existe ?") ou récupérer juste l'ID. |
| INCLUDE | Keys + Liste spécifique (ex: `Avatar`, `Nickname`). | Moyen | Afficher une liste légÚre (Search results) sans charger le profil complet. |
| ALL | Tout l'item entier. | Double | Simplifie le dev (pas besoin de refetcher la table), mais trĂšs cher si les items sont gros. |
Le PiĂšge Mortel : GSI Throttling
Scénario Catastrophe
- Table Principale : Provisionnée à 1000 WCU.
- GSI "Email" : Provisionné à 5 WCU (oubli de config).
- Vous lancez un import massif de données.
- Le GSI sature instantanément.
- Résultat : Vos
PutItemsur la Table Principale Ă©chouent avecProvisionedThroughputExceeded, mĂȘme si la table est large.
Solution : Toujours configurer l'Autoscaling du GSI de la mĂȘme maniĂšre que la Table, ou utiliser le mode On-Demand partout.
Design Pattern : Inverted Index
Pattern classique pour gérer les relations Many-to-Many (ex: Auteurs <-> Livres).
Table Principale
PK = Auteur, SK = Livre
RequĂȘte : "Tous les livres de Stephen King".
GSI (Inversé)
PK = SK (Table), SK = PK (Table)
RequĂȘte : "Qui a Ă©crit le livre Ăa ?".
Design Pattern : GSI Overloading
Au lieu de payer pour 5 indexes différents, on en crée un seul "Générique" et on y met des données différentes selon l'entité.
| Item Type | GSI_PK (Contenu) | GSI_SK (Contenu) | Question répondue |
|---|---|---|---|
| Commande | STATUS#EN_COURS | DATE#2023-10-27 | Donne les commandes en cours triées par date. |
| Employé | DEP#Marketing | SALAIRE#45000 | Donne les employés du Marketing triés par salaire. |
| Produit | CAT#Telephone | MARQUE#Apple | Donne les téléphones de marque Apple. |
Avantage : Vous ne payez qu'un seul GSI, mais il sert Ă toute l'application. C'est le cĆur du "Single Table Design".
ProvisionedThroughputExceededException
C'est l'erreur que renvoie DynamoDB quand vous essayez d'aller plus vite que la musique. Votre requĂȘte est rejetĂ©e avec un code HTTP 400.
Les deux causes possibles
- 1. Limite de Table atteinte : Vous avez provisionné 100 WCU, vous consommez 120 WCU. (Facile à régler : Autoscaling ou On-Demand).
- 2. Limite de Partition atteinte : Vous tapez trop fort sur une seule Partition Key. (Difficile à régler : ProblÚme de Design).
Les Limites Physiques d'une Partition
Peu importe la taille de votre table (mĂȘme avec 1 million de WCU), UNE partition physique ne peut jamais dĂ©passer :
- 3 000 RCU / seconde (Lecture)
- 1 000 WCU / seconde (Ăcriture)
Anatomie d'une "Hot Partition"
Cela arrive quand la distribution de vos clés n'est pas uniforme.
Distribution Uniforme (Idéal)
PK = UserID (UUID aléatoire).
Le trafic est réparti équitablement sur les 100 partitions de la table.
Chaque partition travaille Ă 10%. Tout va bien.
Distribution Asymétrique (Hot Key)
PK = Date (ex: "2023-10-27").
100% des écritures du jour vont sur la partition qui gÚre le hash de "2023-10-27".
Cette partition sature (Throttle), les 99 autres dorment.
Adaptive Capacity : Le "Pompier" d'AWS
Heureusement, DynamoDB est intelligent. Si une partition chauffe, le systÚme réagit automatiquement.
Mécanisme Automatique
- DynamoDB détecte qu'une partition est "Hot" (consomme plus que son quota proportionnel).
- Il augmente instantanément le débit de cette partition (en utilisant des crédits "Burst").
- Si ça dure, il peut Isoler la clé chaude (Split) pour lui dédier une partition entiÚre.
Si vous Ă©crivez 2000 items/sec sur la clĂ© "Product#iPhone15", Adaptive Capacity ne pourra rien faire. Ăa throttlera.
Solutions Architecturales
| Technique | Principe | Cas d'usage |
|---|---|---|
| Write Sharding (Ăclatement) | Ajouter un suffixe alĂ©atoire Ă la PK.Vote#A devient Vote#A_1 ... Vote#A_10. | Compteurs massifs, Votes, Logs, Time Series. |
| DAX (Caching) | Placer un cache en mĂ©moire devant la DB. DAX absorbe les lectures sur la clĂ© chaude. | Lecture massive d'un mĂȘme item (ex: "Settings", "Top News"). |
| Scatter-Gather | Lire les N partitions shardées en parallÚle et agréger le résultat dans l'app. | Lecture d'un compteur shardé. |
Exemple de code : Write Sharding
// Ăcriture (RĂ©partition sur 5 shards)
const shardId = Math.floor(Math.random() * 5) + 1;
const pk = `CANDIDATE_A_${shardId}`;
await dynamo.putItem({ PK: pk, Vote: 1 });
// Lecture (Aggrégation)
// Il faut faire 5 GetItem (ou 1 BatchGetItem) et sommer les résultats.Comment réagir au Throttling ?
Ne relancez pas la requĂȘte immĂ©diatement ! Vous ne feriez qu'aggraver l'embouteillage.
Exponential Backoff
Algorithme standard (inclus dans les SDK AWS).
- Tentative 1 : Ăchec (400).
- Attendre 50ms... Tentative 2.
- Attendre 100ms... Tentative 3.
- Attendre 200ms... Tentative 4.
- Abandon (Erreur finale).
Jitter (Aléatoire)
Si 1000 clients sont throttlĂ©s en mĂȘme temps et attendent tous exactement 100ms, ils vont retenter tous ensemble (Thundering Herd).
Solution : Ajouter du hasard. Wait(100ms + random(0, 20ms)).
Qu'est-ce que DynamoDB ?
Oubliez vos serveurs MySQL. DynamoDB est une base de données Clé-Valeur & Document, Serverless, conçue pour la performance à l'échelle.
Les 3 Piliers
- Performance : Latence Ă 1 chiffre (millisecondes) quelle que soit la taille de la base (1 Go ou 100 To).
- Serverless : Pas de patching, pas de maintenance, pas de "disk full". AWS gÚre le matériel.
- ScalabilitĂ© : Peut gĂ©rer 10 comme 10 millions de requĂȘtes par seconde (RPS) automatiquement.
Architecture Physique (Invisible)
Sous le capot, vos données sont découpées en Partitions (SSD) et répliquées automatiquement sur 3 Zones de Disponibilité (AZ).
Si une AZ brûle, vos données sont toujours là . C'est inclus dans le prix.
Le Langage DynamoDB
Contrairement à SQL, la structure est flexible, mais la Clé Primaire est rigide.
- Table : Collection d'éléments (Comme une Table SQL).
- Item : Un enregistrement unique (Comme une Ligne SQL). Limite : 400KB max.
- Attribute : Une donnĂ©e (Comme une Colonne). Peut ĂȘtre simple (String, Number) ou complexe (List, Map).
1. Partition Key (PK) : Obligatoire. Sert à hacher la donnée vers une partition physique. (ex:
UserID). 2. Sort Key (SK) : Optionnel. Sert à trier les données à l'intérieur d'une partition. (ex:
DateCommande).Exemple JSON (Schemaless)
{
"PK": "USER#123", // Partition Key
"SK": "PROFILE", // Sort Key
"Nom": "Alice",
"Email": "alice@aws.com",
"Roles": ["Admin", "Editor"], // Liste
"Address": { // Map (JSON imbriqué)
"City": "Paris",
"Zip": "75001"
}
}Le Choc Culturel : SQL vs NoSQL
N'essayez pas d'utiliser DynamoDB comme MySQL, vous allez échouer.
| RDBMS (MySQL, Postgres) | DynamoDB | |
|---|---|---|
| Normalisé : On évite la duplication. On fait des JOINs. | VS | Dénormalisé : On duplique la donnée pour la vitesse. PAS DE JOIN. |
| FlexibilitĂ© : On peut requĂȘter n'importe quelle colonne (`WHERE age > 18`). | VS | AccĂšs par ClĂ© : On doit connaĂźtre la PK (+SK) pour ĂȘtre efficace. Les filtres complexes sont lents (Scan). |
| Scale Vertical : Plus gros serveur CPU/RAM. | VS | Scale Horizontal : Plus de partitions. Illimité. |
| Connexions : Persistantes (TCP/Pool). | VS | Connexions : Stateless (HTTP API). Idéal pour Lambda. |
Consistance des Lectures & Transactions
Puisque la donnée est répliquée sur 3 zones, quand je lis, est-ce que je vois la derniÚre version ?
Les 2 Modes de Lecture
- Eventual Consistency (Par défaut)
Rapide & Moins cher (0.5 RCU). La donnée peut avoir quelques millisecondes de retard (le temps de réplication). - Strongly Consistent
Plus cher (1 RCU). Garantit que vous lisez la toute derniÚre écriture. (à demander explicitement : `ConsistentRead: true`).
Transactions ACID
DynamoDB supporte les transactions ! (Oui, comme SQL).
API : TransactWriteItems / TransactGetItems.
- Permet d'Ă©crire dans 2 tables en mĂȘme temps : "Tout rĂ©ussit ou rien ne se fait".
- Coût : x2 par rapport à une écriture standard.
Quand l'utiliser (et quand FUIR)
Idéal Pour :
- Serverless Apps : Backends Lambda, API Gateway.
- High Scale : Jeux vidéo (Leaderboards), Paniers e-commerce, Voting apps.
- Key-Value simple : Stockage de session, Config, Feature Flags.
- Données chaudes : Données récentes accédées trÚs souvent.
Ă Ăviter Si :
- Analytique / BI : Faire des `GROUP BY`, `AVG` sur des années de données -> Utilisez Redshift ou Athena.
- Recherche complexe : "Trouver les utilisateurs qui s'appellent Bob OU qui habitent Paris" -> Utilisez OpenSearch.
- Binary Blobs : Stocker des images/PDFs -> Utilisez S3 (stockez juste le lien dans DynamoDB).
Sous le capot : Partitions Physiques
DynamoDB est un systÚme distribué. Votre table n'est pas sur un seul disque, elle est découpée en milliers de morceaux appelés Partitions.
L'Algorithme de Placement
- DynamoDB prend votre Partition Key (PK).
- Il applique une fonction de hachage (MD5-like).
- Le résultat détermine sur quelle partition physique la donnée atterrit.
âą Stockage Max : 10 GB.
âą Ăcriture Max : 1 000 WCU / sec.
âą Lecture Max : 3 000 RCU / sec.
Partition Split (Division Cellulaire)
Que se passe-t-il si vous dépassez 10 GB ?
La partition se divise en deux (Split). Les données sont redistribuées. C'est automatique et invisible.
Note : C'est pour cela que DynamoDB est infiniment scalable. Plus vous avez de données, plus vous avez de partitions, plus vous avez de débit total.
Comprendre PK (Partition Key) et SK (Sort Key)
C'est la décision de design la plus importante.
| Clé | RÎle | Analogie BibliothÚque |
|---|---|---|
| Partition Key (PK) Obligatoire | DĂ©termine l'emplacement physique. Doit avoir une haute cardinalitĂ© (beaucoup de valeurs uniques). | L'ĂtagĂšre. Elle dit dans quelle armoire chercher. |
| Sort Key (SK) Optionnel | Ordonne les donnĂ©es physiquement Ă l'intĂ©rieur de la partition. Permet les requĂȘtes de plage (Range Queries). | Le Classement. Sur l'Ă©tagĂšre, les livres sont triĂ©s par date ou par auteur. |
Opérations possibles sur la SK
GrĂące Ă la Sort Key, vous pouvez faire des requĂȘtes puissantes sans scanner toute la table :
L'Ennemi Public n°1 : Hot Partitions
Si tout le monde lit/Ă©crit la mĂȘme PK en mĂȘme temps, vous crĂ©ez un embouteillage sur UNE SEULE partition physique.
Mauvais Design
- PK = "Date" (ex: 2023-10-27) : Tout le trafic du jour tape la mĂȘme partition.
- PK = "Status" (ex: EN_COURS) : Si 90% des commandes sont "EN_COURS", une partition souffre.
Bon Design
- PK = "UserID" : Le trafic est réparti sur des milliers d'utilisateurs.
- PK = "OrderID" (UUID) : Répartition parfaite (aléatoire).
Adaptive Capacity
AWS peut "booster" temporairement une partition chaude en lui allouant plus de débit (emprunté aux autres). Mais ce n'est pas magique : si vous dépassez la limite physique du disque, vous aurez des erreurs ThrottlingException.
Single Table Design (STD) : Le Graal
En SQL, on fait 1 Table = 1 Entité (User, Order, Product). En DynamoDB expert, on met TOUT dans une seule table.
Pourquoi ? (Pre-Joining)
DynamoDB ne fait pas de JOIN. Pour rĂ©cupĂ©rer un User ET ses Commandes en une seule requĂȘte (10ms), on les stocke cĂŽte Ă cĂŽte.
Structure Générique
- On nomme les colonnes
PKetSK(pas UserID). - On utilise des préfixes :
USER#123,ORDER#999.
Visualisation des Données
| PK | SK | Data |
|---|---|---|
| USER#123 | PROFILE | {Nom: Alice, Email: ...} |
| USER#123 | ORDER#A1 | {Total: 50âŹ, Date: ...} |
| USER#123 | ORDER#A2 | {Total: 120âŹ, Date: ...} |
RequĂȘte : Query(PK="USER#123")
Résultat : Je reçois le profil ET les commandes en 1 seul appel réseau.
Technique Avancée : Write Sharding
Comment gérer un compteur de votes pour "Candidat A" lors d'une émission TV (1 Million votes/sec) ?
Une seule PK "CANDIDAT_A" exploserait la limite de 1000 WCU.
La Solution : Ajouter du hasard
- Ăcriture : RĂ©partie sur 100 partitions. CapacitĂ© totale = 100 * 1000 WCU = 100 000 WCU.
- Lecture : On doit lire les 100 items et faire la somme (Scatter-Gather).
Les Maths de DynamoDB : Calculez vos unités
DynamoDB ne compte pas en requĂȘtes, mais en "blocs de donnĂ©es". Si vous ignorez ces formules, vous allez surprovisionner ou throttler.
WCU (Write Capacity Unit)
1 WCU = 1 Ăcriture jusqu'Ă 1 KB / sec.
- Arrondi au KB supérieur.
- Item de 100 octets -> 1 WCU.
- Item de 1.5 KB -> 2 WCU.
- Transaction (ACID) : Coût x2 (Item 1 KB -> 2 WCU).
RCU (Read Capacity Unit)
1 RCU = 1 Lecture Forte (Strong) jusqu'Ă 4 KB / sec.
- Eventual Consistency : 2 lectures pour 1 RCU (Moitié prix).
- Strong Consistency : 1 lecture pour 1 RCU.
- Transaction : 2 RCU pour 4 KB (Double prix).
Provisioned vs On-Demand : Le Guide de Choix
| Mode | Fonctionnement | Quand l'utiliser ? |
|---|---|---|
| On-Demand Serverless pur | - Pas de configuration. - Payez Ă la requĂȘte (RRU/WRU). - Scale instantanĂ©ment (de 0 Ă 40k req/sec). - Prix : ~5x Ă 7x plus cher Ă l'unitĂ© que le Provisioned. | - Startups / Nouveaux projets (Trafic inconnu). - Trafic "Spiky" imprĂ©visible. - Environnements de Dev/Test (0$ si pas utilisĂ©). |
| Provisioned Classique | - Vous définissez un débit (ex: 100 WCU). - Autoscaling ajuste le débit (avec latence). - Prix : TrÚs bas, surtout avec les "Reserved Capacity" (-50%). | - Trafic stable et prévisible (ex: E-commerce constant). - Production à fort volume (FinOps). |
Throttling & Burst Capacity
L'Erreur 400 : ProvisionedThroughputExceeded
Cela arrive quand vous dépassez vos WCU/RCU provisionnés.
ConsĂ©quence : La requĂȘte est rejetĂ©e.
Le Joker : Burst Capacity
DynamoDB stocke jusqu'à 300 secondes (5 min) de capacité inutilisée.
Si vous avez provisionné 100 WCU mais n'en utilisez que 10, vous accumulez des crédits.
Lors d'un pic soudain, DynamoDB utilise ces crédits pour absorber le choc avant de throttler.
Comment gérer le Throttling ?
- SDK AWS : GĂšre automatiquement les "Retries" avec un Exponential Backoff (attend 50ms, puis 100ms, puis 200ms...).
- Hot Partitions : Si une seule clĂ© (ex: PK="Election2024") reçoit tout le trafic, vous serez throttlĂ© Ă 1000 WCU/3000 RCU, mĂȘme si la table a 1 million de WCU. Le Burst ne sauve pas d'une Hot Partition.
La vérité sur l'Autoscaling
En mode Provisioned, l'Autoscaling n'est PAS instantané. C'est un piÚge classique.
- Scale Out (Montée) : Prend quelques minutes pour réagir. Si votre trafic passe de 100 à 10 000 en 5 secondes (Pub TV), l'Autoscaling sera trop lent -> Throttling massif. Pour ces cas-là , utilisez On-Demand.
- Scale In (Descente) : AWS attend 15 à 60 minutes de calme avant de réduire la capacité. C'est pour éviter l'oscillation (Yo-Yo effect).
- Target Tracking : La configuration standard est "Cible 70%". DynamoDB essaiera de garder votre consommation à 70% de la limite provisionnée.
Calculatrice FinOps : Cas Réel
Scénario : Une app écrit 1 million d'items de 1KB par jour.
| Métriques | Mode On-Demand | Mode Provisioned (Optimisé) |
|---|---|---|
| Volume | 1 000 000 Ăcritures | ~11.5 Ăcritures / sec (Moyenne lissĂ©e) |
| Coût Unitaire (us-east-1) | 1.25$ / million d'écritures | 0.00065$ / WCU-heure |
| Calcul Mensuel | 30 jours * 1.25$ = 37.5$ | Besoin : ~20 WCU (marge sécu). 20 * 0.00065 * 24h * 30j = ~9.36$ |
| Verdict | Cher, mais zéro gestion. | 4x moins cher, mais nécessite un trafic lissé. |
Comprendre l'Index : Une "Copie" de la donnée
DynamoDB ne fait pas de magie. Quand vous créez un Index, AWS maintient une deuxiÚme table cachée synchronisée avec la premiÚre.
Cela a un impact majeur sur le coĂ»t (Stockage + Ăcriture).
Le concept de "Projection"
Combien de données copiez-vous dans l'index ?
- KEYS_ONLY : Copie juste la PK et la SK. Le moins cher.
- INCLUDE : Copie PK + SK + quelques colonnes spécifiques (ex: `Email`, `Status`). Optimisé.
- ALL : Copie tout l'item. Le plus cher (Double le coût de stockage).
Workflow d'Ăcriture
- Vous écrivez dans la Table Principale.
- DynamoDB propage la donnée vers les GSI (Global Secondary Indexes) de maniÚre asynchrone (millisecondes).
- Conséquence : Si vous écrivez 1 item et que vous avez 3 GSI (Projection ALL), vous payez 4 écritures (1 base + 3 indexes).
GSI (Global Secondary Index) : L'outil Ă tout faire
Permet de requĂȘter la table selon un axe totalement diffĂ©rent (Nouvelle PK, Nouvelle SK).
| Caractéristique | Détail Technique | Implication Ops |
|---|---|---|
| Partition Key | Peut ĂȘtre n'importe quel attribut (ex: `Email` au lieu de `UserID`). | Permet de trouver un user par son email sans faire de Scan. |
| Consistance | Eventual Only. | Si vous écrivez et relisez immédiatement via le GSI, la donnée peut manquer (lag ms). |
| Capacité | A ses propres RCU/WCU (si provisioned). | Danger : Si le GSI throttle (manque de WCU), il bloque les écritures sur la Table Principale ! |
| Flexibilité | Création/Suppression à la volée. | On peut ajouter un GSI en production sans downtime. |
LSI (Local Secondary Index) : Pourquoi l'éviter ?
Le LSI est un "vieux" concept de DynamoDB. Il partage la mĂȘme PK que la table, mais change la SK.
Les Avantages (Rares)
- Strong Consistency : Permet de lire l'index avec une consistance forte.
- Pas de coût WCU supp : Consomme la capacité de la table principale.
Les Inconvénients (Majeurs)
- Immuable : Doit ĂȘtre créé Ă la naissance de la table. Impossible Ă supprimer ou ajouter aprĂšs.
- La limite des 10 GB : CRITIQUE. Si une PK possÚde un LSI, la somme des données pour cette PK ne peut pas dépasser 10 GB. Si vous dépassez, la partition devient inaccessible en écriture.
Verdict : En 2024, utilisez des GSI dans 99% des cas. N'utilisez LSI que si vous avez une exigence absolue de consistance forte sur l'index.
GSI Overloading : La magie du Single-Table
Au lieu de créer 10 index (GSI_Email, GSI_Status, GSI_Date...), on crée un seul GSI générique.
On nomme ses attributs GSI1PK et GSI1SK.
Selon le type d'entité (User, Commande), on remplit ces champs avec des valeurs différentes.
Exemple Concret
| Entité | GSI1PK (Contenu) | GSI1SK (Contenu) | Usage Query |
|---|---|---|---|
| User | EMAIL#alice@aws.com | PROFILE | Trouver user par email |
| Order | STATUS#OPEN | DATE#2023-10-27 | Lister commandes ouvertes par date |
| Product | CAT#Electronics | PRICE#999 | Lister produits par catégorie triés par prix |
Résultat : 1 seul GSI payé couvre 3 access patterns différents. C'est l'essence du design DynamoDB avancé.
Pattern : Sparse Index (Index "A trous")
DynamoDB n'indexe un item QUE si l'item possÚde la clé de l'index. S'il ne l'a pas, l'item est ignoré par l'index.
Le Concept : Change Data Capture (CDC)
Au lieu de faire des requĂȘtes pĂ©riodiques (Polling) pour voir ce qui a changĂ©, DynamoDB pousse chaque modification (INSERT, MODIFY, REMOVE) dans un tuyau.
Option A : DynamoDB Streams (Natif)
- Rétention : 24 heures (fixe).
- Coût : Gratuit (les RCU du stream, pas le stockage).
- Ordre : Garanti strictement par Partition Key.
- Usage : Trigger Lambda simple, Global Tables.
Option B : Kinesis Data Streams (KDS)
- Rétention : Jusqu'à 1 an.
- Coût : Payant (par Shard ou On-Demand).
- Fan-Out : Plusieurs consommateurs peuvent lire le mĂȘme stream sans se ralentir.
- Usage : Big Data, Analytics, Pipelines complexes.
View Type (Ce qu'on envoie)
| Type | Contenu du Record | Cas d'usage |
|---|---|---|
| KEYS_ONLY | Juste la PK et SK. | Invalidation de cache légÚre. |
| NEW_IMAGE | Tout l'item aprÚs modif. | Réplication, Synchro. |
| OLD_IMAGE | Tout l'item avant modif. | Audit, Undo log. |
| NEW_AND_OLD_IMAGES | Les deux versions. | Calcul de Delta (Diff). |
Connecter Lambda : Attention aux PiĂšges
Lambda ne "reçoit" pas les données. C'est le service Lambda (Daemon) qui "poll" le stream et invoque votre fonction.
Batching (Performance)
Ne traitez pas les records 1 par 1 ! Configurez un Batch Size (ex: 100 items) et une Batch Window (ex: 10s).
Gain : Moins d'invocations Lambda, facturation réduite.
La "Poison Pill" (Danger)
Si dans un batch de 100 items, le 99Úme fait planter votre code (Exception), Lambda rejoue tout le batch indéfiniment. Le stream est bloqué.
La Solution : Partial Batch Failure
CQRS : DynamoDB + OpenSearch
ProblĂšme : DynamoDB est nul pour la recherche textuelle ("Trouver les produits contenant 'rouge'").
Solution : Utiliser les Streams pour synchroniser vers OpenSearch (Elastic).
- L'Application écrit dans DynamoDB (Source of Truth). C'est rapide et fiable.
- DynamoDB Stream capture l'écriture.
- Une Lambda transforme la donnée (JSON) et l'envoie à l'API OpenSearch.
- L'Application lit les recherches complexes sur OpenSearch.
Archivage & Analytique (S3)
Ne faites JAMAIS de Scan complet sur votre table de prod pour faire de la BI. Cela consomme toute la capacité.
Le Pipeline Moderne (Zero-Code)
- Source : Activer "Kinesis Data Streams" sur la table DynamoDB.
- Transport : Connecter Kinesis Firehose au stream.
- Transformation : Firehose convertit le JSON en Parquet (via une petite Lambda ou Glue).
- Destination : Bucket S3 (Data Lake).
- Analyse : RequĂȘter S3 avec Amazon Athena (SQL).
Alternative : Export to S3 (PITR)
Vous pouvez exporter un snapshot complet de la table vers S3 au format JSON/ION sans consommer AUCUNE capacité de lecture (RCU). C'est géré par le backup interne AWS.
EventBridge Pipes : Le Filtrage Serverless
Une nouvelle fonctionnalité (2023) qui simplifie la connexion Stream -> Lambda.
Avant (Lambda Monolithe)
La Lambda se réveille pour CHAQUE modification. if (record.status != 'COMPLETED') return;
Vous payez l'invocation pour rien.
Avec Pipes (Filtrage)
EventBridge filtre les événements avant d'appeler la Lambda.
Filtre : { "dynamodb": { "NewImage": { "status": { "S": ["COMPLETED"] } } } }
Résultat : Facture Lambda divisée par 10.
Snapshots complets & Conformité
Il existe deux façons de faire des snapshots manuels/programmés. Ils n'impactent JAMAIS la performance de la table (0% CPU/RCU consommé).
1. DynamoDB On-Demand Backup
- Granularité : Géré au niveau de la table.
- Rétention : Manuelle (on supprime quand on veut).
- Usage : Backup rapide avant une mise en prod risquée.
2. AWS Backup (Recommandé)
- Centralisé : Plan de backup global (Dynamo + RDS + EBS).
- Lifecycle : Passage automatique en Cold Storage (Archive) pour réduire les coûts (Tiering).
- Vault Lock : Protection WORM (Write Once Read Many) contre les Ransomwares (impossible de supprimer le backup mĂȘme pour l'admin).
PITR (Point-in-Time Recovery) : Le Filet de Sécurité
Imaginez un bouton "Undo" pour votre base de données. PITR enregistre chaque écriture en continu.
- FenĂȘtre : Restauration Ă la seconde prĂšs sur les 35 derniers jours.
- Coût : Payant au GB/mois (plus cher que le snapshot standard).
- Impact Perf : Nul.
Quand l'utiliser ?
"Un stagiaire a lancé un script qui a supprimé 50% des utilisateurs il y a 15 minutes."
-> Action : Restaurer la table à l'état de "Maintenant - 20 minutes".
â ïž Le Grand PiĂšge de la Restauration
Toute restauration (Snapshot ou PITR) crée obligatoirement une NOUVELLE TABLE avec un nouveau nom.
La Procédure de Crise (RTO - Recovery Time Objective)
- Lancer le Restore vers
MaTable_Restored(Prend du temps selon la taille, ~20min pour 100GB). - Option A (Swap) : Changer la config de l'application pour pointer vers
MaTable_Restored. (Rapide mais perte des données écrites *pendant* la panne). - Option B (Merge) : Scanner
MaTable_Restoredet réinjecter les items manquants dansMaTable_Originale. (Lent et complexe).
La table restaurée n'a PAS les Auto-Scaling, IAM Policies, ou Alarmes de l'originale. Il faut tout reconfigurer (IaC indispensable).
Export to S3 : ETL sans serveur
Comment faire de l'analytique sur DynamoDB sans tuer la prod ? En exportant vers S3.
| Fonctionnalité | Détail |
|---|---|
| Zéro RCU | L'export utilise la couche de réplication interne. Il ne consomme AUCUNE capacité de lecture sur votre table. La prod ne sent rien. |
| Formats | DynamoDB JSON (Verbeux) ou ION (Binaire Amazon). |
| Incremental Export | Nouveau ! Exportez seulement les données modifiées entre T1 et T2 (Delta). Idéal pour alimenter un Data Lake quotidiennement. |
| Usage | Brancher Athena ou Glue sur les fichiers S3 pour faire des requĂȘtes SQL complexes (`GROUP BY`, `JOIN`). |
Import from S3 : Migration Massive
Vous migrez de MongoDB ou Cassandra vers DynamoDB ? N'écrivez pas un script Python qui fait des PutItem un par un.
La méthode "Import Table"
- Prend un fichier CSV, JSON ou ION dans S3.
- Crée une Nouvelle Table et la remplit à vitesse maximale.
- Coût : Beaucoup moins cher que d'utiliser des WCU (Write Capacity Units).
- Vitesse : Importe des Téboctets en quelques heures.
Le Graal : Une Base Unique Mondiale
Global Tables permet de déployer une table identique dans plusieurs régions (ex: Paris, Tokyo, New York). C'est une architecture Multi-Master (Active-Active).
Comment ça marche ?
- Vous écrivez dans la région la plus proche (ex: Utilisateur Japonais -> Tokyo).
- DynamoDB propage la donnée vers Paris et NY via le backbone AWS (en ~1 seconde).
- Un utilisateur Français lit la donnée à Paris (Latence locale < 10ms).
Avantages Clés
- Performance Locale : Lecture/Ăcriture au plus prĂšs de l'utilisateur.
- Résilience Totale : Si la région
us-east-1disparaßt, l'application bascule sureu-west-1sans perte de données (ou presque). - Sans Serveur : Pas de gestion de "Maßtre/Esclave". Tout est géré par AWS.
Le PiĂšge : Concurrence & "Last Writer Wins"
Que se passe-t-il si Alice (Ă Paris) et Bob (Ă Tokyo) modifient le MĂME item Ă la MĂME seconde ?
| ProblÚme | Mécanisme AWS | Impact Application |
|---|---|---|
| Conflit d'Ăcriture | Last Writer Wins (LWW) : AWS regarde le timestamp de l'Ă©criture. La plus rĂ©cente Ă©crase l'autre. | Perte de DonnĂ©e Silencieuse. Si Alice modifie "Nom" et Bob modifie "Email", mais qu'ils envoient tout l'objet, l'un des deux changements est perdu. Solution : Utiliser des "Update Expressions" (SET email = ...) plutĂŽt que "PutItem". |
| Latence de Réplication | Le temps que la donnée voyage (ex: 1s). | Eventual Consistency : Si Bob écrit à Tokyo et appelle Alice à Paris 100ms plus tard, Alice ne verra pas encore la donnée. |
ReplicationLatency dans CloudWatch. Si elle dépasse 1000ms, vous avez un problÚme de réseau ou de capacité dans la région de destination.
Stratégies DR : RPO & RTO proches de zéro
Global Tables est l'outil ultime pour le Plan de Reprise d'Activité (PRA).
Mode Active-Active (Recommandé)
Le trafic est routé vers les 2 régions en temps normal (via Route53 Latency Routing).
- Panne Région A : Route53 détecte l'échec (Health Check) et envoie tout le trafic vers Région B.
- RTO (Recovery Time) : < 1 min (temps DNS).
- RPO (Data Loss) : ~1 sec (données en vol non répliquées).
Mode Active-Passive (Hot Standby)
Tout le trafic va vers RĂ©gion A. La RĂ©gion B est prĂȘte mais ne reçoit rien.
- Usage : Compliance légale ou simplification des conflits (on n'écrit qu'à un endroit).
- CoĂ»t : On paie quand mĂȘme le stockage et les WCU dans la rĂ©gion passive !
L'Addition SVP : Ăa coĂ»te cher ?
Oui. Multiplier les régions multiplie les coûts d'écriture.
Le concept clé est le Replicated Write Capacity Unit (rWCU).
| Action | Coût unitaire | Exemple (3 Régions) |
|---|---|---|
| Lecture | 1 RCU localement. | Pas de surcoût. Je lis à Paris, je paie à Paris. |
| Ăcriture | 1 WCU local + 1 rWCU par rĂ©plique. | J'Ă©cris 1 KB Ă Paris. AWS Ă©crit : 1 Ă Paris + 1 Ă NY + 1 Ă Tokyo. Total : 3 Ă©critures payantes + Data Transfer Out. |
| Stockage | GB standard. | Stockage multiplié par 3 (données dupliquées partout). |
Attention : Une table Global Table coĂ»te environ N fois le prix d'une table simple (oĂč N = nombre de rĂ©gions), plus le coĂ»t du transfert inter-rĂ©gion.
Avant de cliquer sur "Add Region"
- Streams activés : Global Tables V2 utilise DynamoDB Streams ("New and Old Images").
- CapacitĂ© : Toutes les rĂ©gions doivent ĂȘtre en On-Demand ou avoir l'Autoscaling configurĂ© identiquement. Si la rĂ©gion B n'a pas assez de WCU, elle va bloquer la rĂ©gion A !
- Idempotence : Votre application doit tolérer qu'une commande soit traitée deux fois (cas rare de conflit réseau).
Déconstruire la facture DynamoDB
La facture n'est pas linéaire. Elle dépend de votre mode (On-Demand vs Provisioned) et de vos fonctionnalités activées.
| Poste de dépense | Impact Facture | PiÚge à éviter |
|---|---|---|
| Throughput (WCU/RCU) | 60% à 80% | Utiliser le mode On-Demand sur un trafic stable et élevé (7x plus cher que le provisionné réservé). |
| Stockage (GB) | 10% à 20% | Laisser des données vieilles de 5 ans dans la table "Standard" (0.25$/GB) au lieu de "IA" (0.10$/GB). |
| Global Tables | Multiplicateur | RÚgle du N+1 : Chaque écriture est facturée dans la région d'origine + dans chaque région de réplication (Replicated WCU). |
| Backup & PITR | Faible | Activer PITR sur des tables de dev/test (inutile). |
Reserved Capacity : L'arme absolue (-77%)
Comme pour les EC2 Reserved Instances, vous pouvez vous engager sur un volume de WCU/RCU pour 1 ou 3 ans.
Condition : Ătre en mode Provisioned.
L'économie réelle
- Engagement 1 an : ~50% de réduction.
- Engagement 3 ans : ~77% de réduction.
- Paiement : All Upfront (Moins cher) ou No Upfront.
Stratégie Mixte (Le "Waterline")
Ne réservez pas pour votre pic !
- Base stable (Waterline) : Couvrir avec de la Reserved Capacity (pas cher).
- Pics variables : Laisser l'Auto-Scaling gérer le surplus en tarif standard.
TTL (Time To Live) : Le Nettoyeur Gratuit
Supprimer des items avec DeleteItem coûte des WCU (donc de l'argent). Le TTL permet de supprimer des items expirés GRATUITEMENT.
Comment ça marche ?
- Ajoutez un attribut
expire_at(Timestamp Unix) dans vos items. - Activez le TTL sur cet attribut dans la console.
- Un processus d'arriÚre-plan AWS scanne et supprime les items expirés (sous 48h).
- Coût WCU : 0.
Table Class Standard vs IA
Si vous stockez des logs ou historiques > 100 GB rarement accédés :
Activez la classe Standard-IA (Infrequent Access).
Gain : Stockage -60% moins cher.
Risque : Les lectures/écritures sont plus chÚres (+25%). à n'utiliser que si vous lisez rarement.
Coûts Réseau : Le Tueur Silencieux
Si vos Lambda/EC2 sont dans un VPC privé et accÚdent à DynamoDB via une NAT Gateway, vous payez des frais de traitement de données (0.045$/GB).
La Solution : Gateway VPC Endpoint
- Coût : 100% Gratuit.
- Performance : Le trafic reste dans le réseau privé AWS (pas d'internet).
- Sécurité : Permet de verrouiller l'accÚs à la table uniquement depuis votre VPC.
Chasse au Gaspillage : Top 5 des erreurs
| Erreur FinOps | Pourquoi c'est cher ? | Correction |
|---|---|---|
| Scan au lieu de Query | Vous payez pour lire TOUTE la table, mĂȘme si vous filtrez 99% des rĂ©sultats aprĂšs. | CrĂ©er un GSI adaptĂ© Ă la recherche. |
| Noms d'attributs longs | Dans DynamoDB, {"customer_creation_date": ...} est stockĂ© Ă chaque ligne. Ăa gonfle le stockage et les WCU. | Utiliser des noms courts (ex: "d" pour date) ou compresser le JSON avant Ă©criture. |
| GSIs inutilisés | Chaque écriture dans la table principale est répliquée dans le GSI (WCU x2). | Supprimer les indexes qui ne servent pas aux patterns de lecture. |
| Dev en On-Demand | Les développeurs lancent des scripts de load-test qui font 10k écritures/sec. | Mettre les tables de Dev en Provisioned avec un cap (ex: max 5 WCU) pour bloquer les abus. |
| Attribute Projection : ALL | Le GSI copie des attributs énormes dont vous n'avez pas besoin. | Utiliser KEYS_ONLY ou INCLUDE dans la définition du GSI. |
La Double Nature de DynamoDB
DynamoDB est un hybride puissant. Il combine la vitesse d'un stockage Clé-Valeur (comme Redis) avec la flexibilité d'une base Document (comme MongoDB).
Aspect Key-Value
Tout accÚs commence par une Clé Primaire (PK).
C'est ce qui garantit la performance (O(1)).
Exemple : "Donne-moi l'objet oĂč PK=User#123".
Aspect Document
La valeur stockée n'est pas juste une chaßne, mais un JSON complexe.
DynamoDB "comprend" ce JSON. Vous pouvez dire : "Mets Ă jour seulement le champ 'adresse.ville' sans toucher au reste".
Les Types de Données Supportés
DynamoDB utilise un format JSON typé spécifique (Marshalled JSON).
| Catégorie | Types | Description |
|---|---|---|
| Scalaires | S (String)N (Number)B (Binary)BOOL (Boolean), NULL | Données simples. Note : Les nombres sont stockés comme Strings pour éviter la perte de précision. |
| Ensembles (Sets) | SS (String Set)NS (Number Set)BS (Binary Set) | Liste de valeurs uniques. L'ordre n'est pas garanti. Exemple : Tags d'un article ["Tech", "Cloud", "AWS"]. DynamoDB dédoublonne auto. |
| Documents | L (List)M (Map) | Structures imbriquées complexes. List : Tableau ordonné ["a", 1, {b:2}]. Map : Objet JSON {"rue": "Paix", "cp": 75000}. |
"Schemaless" ne veut pas dire "Anarchie"
Contrairement à SQL, vous ne définissez pas les colonnes à l'avance (sauf la Clé Primaire).
Les deux items cohabitent dans la mĂȘme table. L'item 2 a un champ IsAdmin que l'item 1 n'a pas. C'est normal.
Pas de migration de schéma (`ALTER TABLE`) quand vous ajoutez une fonctionnalité. Vous commencez juste à écrire le nouvel attribut.
C'est votre code (Application) qui doit gérer la validation. Si un champ manque, votre code ne doit pas crasher (Null Safety).
La Limite Fatidique : 400 KB
Un item DynamoDB (Nom de colonnes + Valeurs) ne peut pas dépasser 400 Kilo-octets. C'est une limite dure (Hard Limit).
Ce qu'on ne stocke PAS
- Images, PDF, Vidéos (Blobs).
- Historiques de logs infinis dans une seule Liste.
- Articles de blog trĂšs longs (HTML brut).
Le Pattern "S3 Pointer"
Si la donnée est grosse (> 400KB), stockez-la dans S3. Dans DynamoDB, stockez uniquement l'URL (ou la clé S3) et les métadonnées.
Ex: `{ "PK": "Video#1", "Title": "Vacances", "S3Url": "s3://my-bucket/v1.mp4" }`
L'Anatomie d'une Base DynamoDB
Contrairement Ă SQL oĂč l'on a des "Schemas" et des "Relations", DynamoDB est plat mais structurĂ©.
Table
Le conteneur racine.
RÚgle : Pas de jointures entre tables. En général, on essaie de mettre toutes les données dans UNE seule table (Single Table Design).
Item
Un enregistrement unique (max 400KB).
Identifié obligatoirement par sa Clé Primaire complÚte.
C'est l'unité de lecture/écriture atomique.
Attribute
Un champ de donnée (Nom, Age, Adresse).
DynamoDB est Schemaless : sauf pour la clé primaire, les attributs peuvent varier d'un item à l'autre.
Clé Primaire Simple (Partition Key Only)
Utilisée quand vous voulez accéder à un item unique via un ID unique (Key-Value Store classique).
- Structure : 1 seul attribut (ex:
UserID). - Unicité : Il ne peut y avoir qu'un seul item avec cet ID dans toute la table.
- Opérations :
GetItem(Lire 1),PutItem(Ăcrire 1). Impossible de faire des requĂȘtes de plage ("Donne moi tous les users qui...").
Clé Primaire Composite (Partition Key + Sort Key)
C'est ici que réside la puissance de DynamoDB. Elle permet de modéliser des relations 1-N (Un User a N Commandes).
| Composant | RĂŽle Physique | Exemple (E-commerce) |
|---|---|---|
| Partition Key (PK) | Groupe les donnĂ©es ensemble sur le mĂȘme disque SSD. | CUSTOMER#123 |
| Sort Key (SK) | Trie les données à l'intérieur de la partition. | ORDER#2023-10-01ORDER#2023-11-05 |
La Puissance du "Query"
Avec une SK, vous pouvez utiliser l'opérateur Query :
Item Collections : Le concept de "Dossier"
Une Item Collection est l'ensemble de tous les items partageant la mĂȘme Partition Key, mais avec des Sort Keys diffĂ©rentes.
Visualisation
[ PK: TEAM#A ] <-- C'est le "Dossier" (Item Collection) âââ [ SK: METADATA ] -> { TeamName: "Lakers", City: "LA" } âââ [ SK: PLAYER#01 ] -> { Name: "LeBron", Position: "SF" } âââ [ SK: PLAYER#03 ] -> { Name: "Davis", Position: "C" } âââ [ SK: GAME#2023 ] -> { Date: "2023-12-25", Score: "..." }
Les Commandements du Design
1. CardinalitĂ© ĂlevĂ©e pour la PK
Mauvais : PK = "Status" (seulement 3 valeurs : Pending, Done, Error). Crée des "Hot Partitions".
Bon : PK = "UserID" (Millions de valeurs). Répartit la charge.
2. Naming Générique
Ne nommez pas vos colonnes UserID et OrderID. Nommez-les PK et SK.
Cela permet de stocker des entitĂ©s diffĂ©rentes (Users, Produits) dans la mĂȘme table sans conflit de nommage.
