DynamoDB Modes de Capacité : Provisionné vs On-Demand — Quel Choix Pour Votre Application ?
Vous venez de concevoir votre première table DynamoDB et la question du mode de capacité vous bloque : choisir Provisionné sans connaître votre trafic, c'est risquer le throttling à la première montée en charge — choisir On-Demand sans comprendre son modèle de coût, c'est potentiellement payer dix fois plus que nécessaire. Ce choix est l'une des premières décisions d'architecture DynamoDB qui coûte cher quand elle est mal posée.
TL;DR — Comparaison des Modes de Capacité DynamoDB
| Critère | Provisionné | On-Demand |
|---|---|---|
| Modèle de facturation | Par RCU/WCU réservés à l'heure | Par requête consommée (rRCU/rWCU) |
| Trafic adapté | Prévisible et stable | Imprévisible ou sporadique |
| Risque de throttling | Oui, si trafic dépasse les unités provisionnées | Très faible (AWS absorbe les pics) |
| Auto Scaling | Disponible (réactif, pas instantané) | Natif et transparent |
| Coût à fort volume | Moins cher si utilisation > 80% | Plus cher à volume élevé constant |
| Changement de mode autorisé | Une fois toutes les 24 heures | |
| Phase idéale | Production stable, trafic connu | Développement, lancement, trafic erratique |
Comment Fonctionne la Capacité DynamoDB
DynamoDB distribue vos données sur des partitions internes. Chaque partition a une capacité de traitement allouée, exprimée en RCU (Read Capacity Units) et WCU (Write Capacity Units). Une RCU correspond à une lecture fortement cohérente de 4 Ko, une WCU à une écriture de 1 Ko. Ces unités sont la monnaie d'échange entre votre application et le moteur de stockage.
Le mode de capacité détermine comment ces unités sont allouées et facturées. En mode Provisionné, vous déclarez à l'avance combien d'unités vous réservez par seconde. En mode On-Demand, vous ne déclarez rien — AWS adapte la capacité à la demande observée et vous facture à l'unité consommée.
RCU/WCU fixes"] P1 --> ModeOD["Mode On-Demand
Capacité adaptative"] ModeP --> Throttle["Throttling si dépassement"] ModeOD --> Scale["AWS absorbe le pic"]
- Application : émet des requêtes de lecture et d'écriture vers DynamoDB.
- Routeur DynamoDB : distribue les requêtes sur les partitions selon la clé de partition.
- Mode Provisionné : chaque partition dispose d'un quota RCU/WCU fixe. Si le trafic dépasse ce quota, les requêtes sont throttlées (
ProvisionedThroughputExceededException). - Mode On-Demand : AWS ajuste dynamiquement la capacité allouée. Les requêtes ne sont pas throttlées sauf en cas de montée en charge extrêmement brutale dépassant le double du pic précédent sur une courte fenêtre.
Mode Provisionné — Contrôle et Économies au Prix de la Prévision
En mode Provisionné, vous définissez explicitement le nombre de RCU et WCU par seconde pour votre table. Si votre application consomme plus que ce seuil, DynamoDB retourne une erreur de throttling. C'est le mode historique de DynamoDB, et il reste le plus économique quand le trafic est stable et prévisible.
Auto Scaling en Mode Provisionné
L'Auto Scaling DynamoDB ajuste les RCU/WCU provisionnés en fonction de l'utilisation observée, selon une cible d'utilisation que vous définissez (par exemple, 70% d'utilisation). Mais attention : cet ajustement est réactif. Il y a un délai entre la détection du pic et l'application de la nouvelle capacité. Un pic brutal et court peut donc provoquer du throttling même avec l'Auto Scaling activé.
# Créer une table en mode Provisionné avec Auto Scaling
aws dynamodb create-table \
--table-name ma-table-prod \
--attribute-definitions AttributeName=PK,AttributeType=S \
--key-schema AttributeName=PK,KeyType=HASH \
--billing-mode PROVISIONED \
--provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=50 \
--region us-east-1
# Activer l'Auto Scaling en lecture sur la table
aws application-autoscaling register-scalable-target \
--service-namespace dynamodb \
--resource-id table/ma-table-prod \
--scalable-dimension dynamodb:table:ReadCapacityUnits \
--min-capacity 10 \
--max-capacity 500 \
--region us-east-1
# Définir la politique de scaling (cible d'utilisation à 70%)
aws application-autoscaling put-scaling-policy \
--service-namespace dynamodb \
--resource-id table/ma-table-prod \
--scalable-dimension dynamodb:table:ReadCapacityUnits \
--policy-name ReadScalingPolicy \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration \
'TargetValue=70.0,PredefinedMetricSpecification={PredefinedMetricType=DynamoDBReadCapacityUtilization}' \
--region us-east-1
Quand le Mode Provisionné est le Bon Choix
- Trafic stable avec des variations progressives (pas de pics soudains).
- Volume élevé et constant — le coût par unité est significativement inférieur à On-Demand.
- Vous pouvez anticiper les besoins via des métriques historiques CloudWatch.
- Workloads batch planifiés avec des fenêtres de traitement connues.
Mode On-Demand — Simplicité et Résilience aux Pics
En mode On-Demand, vous ne provisionnez rien. DynamoDB adapte automatiquement la capacité à votre trafic réel. Vous êtes facturé par unité de requête consommée (rRCU pour les lectures, rWCU pour les écritures) plutôt que par capacité réservée. C'est le mode naturel pour les phases d'incertitude.
# Créer une table en mode On-Demand
aws dynamodb create-table \
--table-name ma-table-dev \
--attribute-definitions AttributeName=PK,AttributeType=S \
--key-schema AttributeName=PK,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--region us-east-1
# Basculer une table existante en On-Demand
aws dynamodb update-table \
--table-name ma-table-prod \
--billing-mode PAY_PER_REQUEST \
--region us-east-1
# Vérifier le mode de facturation actuel
aws dynamodb describe-table \
--table-name ma-table-prod \
--query 'Table.BillingModeSummary' \
--region us-east-1
La Limite des 24 Heures Entre Changements de Mode
AWS autorise le changement de mode de capacité une fois toutes les 24 heures. Si vous basculez de Provisionné à On-Demand à 14h, vous ne pourrez pas revenir en Provisionné avant 14h le lendemain. Planifiez vos migrations en conséquence — notamment si vous anticipez un événement de trafic élevé.
# Vérifier quand le dernier changement de mode a eu lieu
aws dynamodb describe-table \
--table-name ma-table-prod \
--query 'Table.BillingModeSummary.LastUpdateToPayPerRequestDateTime' \
--region us-east-1
Quand le Mode On-Demand est le Bon Choix
- Phase de développement ou de lancement — trafic inconnu.
- Applications avec des pics imprévisibles et rares (événements, campagnes marketing).
- Trafic très faible ou sporadique — payer à la requête est moins cher que réserver des unités inutilisées.
- Vous voulez zéro gestion opérationnelle de la capacité.
Guide de Décision — Quel Mode Choisir ?
- Trafic connu ? — Si vous avez des métriques historiques ou un profil de charge stable, le mode Provisionné avec Auto Scaling est économiquement supérieur.
- Trafic inconnu ou erratique ? — Démarrez en On-Demand. Observez vos métriques CloudWatch pendant 2 à 4 semaines, puis évaluez si le passage en Provisionné est justifié.
- Pics brutaux fréquents ? — On-Demand absorbe mieux les montées en charge instantanées que l'Auto Scaling Provisionné.
- Volume élevé constant ? — Au-delà d'un certain seuil d'utilisation, le mode Provisionné est moins coûteux. Comparez les coûts via le calculateur AWS.
Le Piège des Hot Partitions — Valable dans les Deux Modes
Beaucoup d'équipes basculent en On-Demand après avoir subi du throttling en mode Provisionné, convaincues que le problème vient du mode de capacité. Dans la moitié des cas, le vrai problème est une hot partition — une partition qui reçoit une proportion disproportionnée du trafic à cause d'une mauvaise clé de partition.
Imaginez un parking de 10 niveaux où 90% des voitures veulent toujours le niveau 1. Peu importe combien de places totales vous ajoutez, le niveau 1 reste saturé. C'est exactement ce qui se passe avec une hot partition DynamoDB.
100% des requêtes"] --> PA["Partition A
clé : user_123"] Traffic --> PB["Partition B
clé : product_456"] Traffic --> PC["Partition C
clé : order_789"] PA --> PA_load["90% du trafic ici → Throttling / Latence élevée"] PB --> PB_load["5% du trafic"] PC --> PC_load["5% du trafic"] style PA fill:#ff6b6b,color:#fff style PA_load fill:#ff4444,color:#fff style PB fill:#51cf66,color:#fff style PC fill:#51cf66,color:#fff
- Partition A (clé 'user_123') : reçoit 90% du trafic total. Même en On-Demand, cette partition peut atteindre ses limites internes si le trafic est extrêmement concentré.
- Partitions B et C : quasi-inutilisées malgré une capacité totale suffisante.
- Résultat : throttling ou latence élevée sur la Partition A, même si la capacité globale de la table est largement suffisante.
Le symptôme classique : vous voyez du throttling sur CloudWatch (ConsumedWriteCapacityUnits bien en dessous des unités provisionnées), mais des erreurs ProvisionedThroughputExceededException persistent. C'est une hot partition, pas un problème de capacité globale.
# Détecter les métriques de throttling par table
aws cloudwatch get-metric-statistics \
--namespace AWS/DynamoDB \
--metric-name WriteThrottleEvents \
--dimensions Name=TableName,Value=ma-table-prod \
--start-time 2024-01-15T00:00:00Z \
--end-time 2024-01-15T23:59:59Z \
--period 3600 \
--statistics Sum \
--region us-east-1
Si WriteThrottleEvents est non nul alors que votre consommation globale est faible, le problème est la distribution des clés — pas le mode de capacité. Revoir votre modèle de données est la seule vraie solution.
Surveiller et Optimiser Après le Déploiement
Quel que soit le mode choisi, instrumentez votre table dès le premier jour. Les métriques CloudWatch DynamoDB sont votre principal outil de diagnostic.
# Vérifier la consommation de capacité en lecture sur les dernières 24h
aws cloudwatch get-metric-statistics \
--namespace AWS/DynamoDB \
--metric-name ConsumedReadCapacityUnits \
--dimensions Name=TableName,Value=ma-table-prod \
--start-time 2024-01-15T00:00:00Z \
--end-time 2024-01-15T23:59:59Z \
--period 3600 \
--statistics Sum Average \
--region us-east-1
# Vérifier les événements de throttling en écriture
aws cloudwatch get-metric-statistics \
--namespace AWS/DynamoDB \
--metric-name WriteThrottleEvents \
--dimensions Name=TableName,Value=ma-table-prod \
--start-time 2024-01-15T00:00:00Z \
--end-time 2024-01-15T23:59:59Z \
--period 3600 \
--statistics Sum \
--region us-east-1
Politique IAM Minimale pour la Surveillance
🔽 Afficher la politique IAM de surveillance DynamoDB
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBDescribeTable",
"Effect": "Allow",
"Action": [
"dynamodb:DescribeTable",
"dynamodb:DescribeLimits"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/ma-table-prod"
},
{
"Sid": "CloudWatchDynamoDBMetrics",
"Effect": "Allow",
"Action": [
"cloudwatch:GetMetricStatistics",
"cloudwatch:ListMetrics"
],
"Resource": "*"
}
]
}
Notez que cloudwatch:GetMetricStatistics et cloudwatch:ListMetrics ne supportent pas les restrictions au niveau de la ressource — "Resource": "*" est requis pour ces actions.
Stratégie Recommandée : Démarrer en On-Demand, Migrer si Nécessaire
Pour une application dont le trafic est inconnu, la stratégie la plus sûre est de démarrer en On-Demand et d'observer. Après 2 à 4 semaines de production, vous aurez des données CloudWatch réelles sur votre consommation de RCU et WCU. Si votre utilisation est stable et élevée, comparez le coût mensuel On-Demand avec le coût d'un mode Provisionné calibré sur vos métriques.
- Lancement en On-Demand : aucune configuration de capacité requise, zéro risque de throttling au démarrage.
- Observation CloudWatch : collectez 2 à 4 semaines de métriques de consommation réelle.
- Analyse de coût : si la consommation est stable et élevée, calculez le coût équivalent en mode Provisionné.
- Migration si pertinent : basculez en Provisionné avec Auto Scaling, en respectant la contrainte de 24 heures entre changements de mode.
- Surveillance continue : maintenez des alarmes CloudWatch sur
WriteThrottleEventsetReadThrottleEvents.
Conclusion et Prochaines Étapes — Modes de Capacité DynamoDB
Si vous ne connaissez pas encore vos patterns de trafic, démarrez en On-Demand. Ce n'est pas le mode le moins cher à fort volume, mais c'est le mode le plus sûr pour éviter le throttling et collecter des données réelles avant de vous engager sur une capacité provisionnée. Une fois votre trafic stabilisé et mesuré, réévaluez avec des chiffres concrets.
Le vrai piège n'est pas le choix du mode — c'est de négliger la conception de la clé de partition. Un mauvais modèle de données crée des hot partitions qui throttlent indépendamment du mode de capacité choisi.
- 📖 Documentation AWS — Modes de capacité DynamoDB
- 📖 Meilleures pratiques pour la conception des clés de partition
- 📖 Tarification DynamoDB — Calculateur officiel
Glossaire — Termes Clés DynamoDB
| Terme | Définition |
|---|---|
| RCU (Read Capacity Unit) | Unité de capacité de lecture : une lecture fortement cohérente de 4 Ko par seconde, ou deux lectures éventuellement cohérentes de 4 Ko. |
| WCU (Write Capacity Unit) | Unité de capacité d'écriture : une écriture de 1 Ko par seconde. |
| Throttling | Rejet de requêtes par DynamoDB quand la capacité provisionnée est dépassée. Retourne ProvisionedThroughputExceededException. |
| Hot Partition | Partition DynamoDB recevant une proportion disproportionnée du trafic, causant du throttling localisé indépendamment de la capacité globale. |
| Auto Scaling DynamoDB | Mécanisme d'ajustement automatique des RCU/WCU provisionnés basé sur l'utilisation observée, via Application Auto Scaling. Réactif, non instantané. |
Commentaires
Enregistrer un commentaire