Modos de Capacidad en DynamoDB: ¿Provisionado o Bajo Demanda?
Cuando lanzas una nueva aplicación en AWS y aún no tienes datos históricos de tráfico, elegir el modo de capacidad incorrecto en DynamoDB puede resultar en throttling inesperado o en facturas que no esperabas. Esta guía cubre los modos de capacidad de DynamoDB desde una perspectiva operacional real: cuándo cada uno tiene sentido, cómo migrar entre ellos, y cómo evitar los errores más comunes.
TL;DR — Guía de Decisión Rápida
Si no conoces tus patrones de tráfico todavía, empieza con On-Demand (Bajo Demanda). Migra a Provisionado con Auto Scaling cuando tengas al menos 2-4 semanas de métricas reales de consumo.
| Criterio | On-Demand | Provisionado + Auto Scaling |
|---|---|---|
| Tráfico predecible | No óptimo | Recomendado |
| Tráfico impredecible o spiky | Recomendado | Riesgo de throttling |
| Fase de desarrollo / MVP | Recomendado | Sobreingeniería temprana |
| Costo por millón de solicitudes | Mayor por unidad | Menor si se utiliza bien |
| Configuración operacional | Cero | Requiere tuning de políticas |
Cómo Funcionan los Modos de Capacidad de DynamoDB
DynamoDB mide el throughput en unidades de capacidad de lectura (RCU) y escritura (WCU). Una RCU cubre una lectura fuertemente consistente de hasta 4 KB, y una WCU cubre una escritura de hasta 1 KB. Todo lo que exceda esas unidades disponibles genera un error ProvisionedThroughputExceededException — lo que los operadores llaman throttling.
automáticamente"] C -->|"Provisionado"| E{"¿Hay RCU/WCU
disponibles?"} D --> F["Solicitud Procesada"] E -->|"Sí"| F E -->|"No"| G["ThrottlingException"] E -->|"Consumo alto"| H["CloudWatch detecta
utilización elevada"] H --> I["Auto Scaling ajusta
capacidad (minutos)"] I --> E
- Solicitud de lectura/escritura: La aplicación envía una operación a DynamoDB.
- Token Bucket: DynamoDB evalúa si hay capacidad disponible en el bucket de tokens del modo activo.
- On-Demand: AWS gestiona automáticamente la capacidad; la solicitud se procesa sin configuración previa.
- Provisionado: Si hay RCU/WCU disponibles, la solicitud pasa. Si no, se genera throttling.
- Auto Scaling (Provisionado): CloudWatch detecta el consumo elevado y ajusta los límites provisionados, pero con latencia de minutos — no de milisegundos.
Auto Scaling en modo Provisionado no es instantáneo. Funciona como un termostato que ajusta la calefacción después de que ya sientes frío — útil para tendencias, inútil para picos abruptos de segundos.
Modo On-Demand: Cuándo Usarlo
On-Demand elimina completamente la gestión de capacidad. DynamoDB escala automáticamente para manejar cualquier volumen de tráfico sin que configures nada. El costo se calcula por solicitud consumida.
Este modo es la elección correcta cuando:
- Estás en fase de MVP o prototipo y no tienes datos históricos de tráfico.
- Tu aplicación tiene picos de tráfico impredecibles — lanzamientos de productos, campañas virales, eventos en tiempo real.
- El costo operacional de gestionar políticas de Auto Scaling supera el ahorro potencial.
- Prefieres cero riesgo de throttling sobre optimización de costos.
La limitación real de On-Demand no es el costo por unidad — es que tiene un límite de throughput máximo por tabla que AWS puede ajustar bajo solicitud. Para cargas de trabajo con volúmenes extremadamente altos y predecibles, Provisionado termina siendo más económico.
Modo Provisionado con Auto Scaling: Cuándo Usarlo
En modo Provisionado, defines explícitamente cuántas RCU y WCU quieres reservar. Auto Scaling de DynamoDB usa políticas de Application Auto Scaling para ajustar esos valores dentro de un rango mínimo y máximo que tú configuras, basándose en el porcentaje de utilización objetivo.
RCU/WCU cada minuto"] C --> D["Application Auto Scaling"] D -->|"Utilización > objetivo"| E["Aumentar capacidad
provisionada"] D -->|"Utilización < objetivo"| F["Reducir capacidad
provisionada"] E --> B F --> B B -->|"Capacidad insuficiente
durante el gap"| G["Throttling temporal"]
- Configuración inicial: Defines mínimo, máximo y objetivo de utilización (típicamente 70%).
- Monitoreo continuo: CloudWatch publica métricas de consumo de RCU/WCU cada minuto.
- Decisión de escala: Application Auto Scaling evalúa si el consumo supera o baja del objetivo.
- Ajuste de capacidad: DynamoDB actualiza los valores provisionados — este proceso toma minutos, no segundos.
- Throttling en el gap: Si el tráfico sube más rápido que el ciclo de Auto Scaling, ocurre throttling durante ese intervalo.
Este modo tiene sentido cuando tienes al menos varias semanas de métricas reales que muestran un patrón de crecimiento gradual y predecible. La combinación de Provisionado + Auto Scaling bien configurada es significativamente más económica que On-Demand para cargas de trabajo estables de alto volumen.
Comparación Técnica Detallada de los Modos de Capacidad
| Característica | On-Demand | Provisionado |
|---|---|---|
| Gestión de capacidad | Automática (AWS) | Manual o Auto Scaling |
| Riesgo de throttling | Muy bajo | Presente si mal configurado |
| Modelo de costo | Por solicitud consumida | Por capacidad reservada por hora |
| Ideal para | Tráfico variable / desconocido | Tráfico predecible y estable |
| Tiempo de escala | Instantáneo | Minutos (vía Auto Scaling) |
| Configuración requerida | Ninguna | Políticas de Auto Scaling |
| Reserved Capacity | No compatible | Compatible (ahorro adicional) |
Guía de Decisión: ¿Qué Modo Elegir?
de tráfico (2+ semanas)?"} Q1 -->|"No"| OD["✅ On-Demand
(PAY_PER_REQUEST)"] Q1 -->|"Sí"| Q2{"¿El tráfico es
predecible y estable?"} Q2 -->|"No — picos abruptos"| OD Q2 -->|"Sí — crecimiento gradual"| Q3{"¿Alto volumen
de solicitudes?"} Q3 -->|"Bajo/Medio"| OD Q3 -->|"Alto y sostenido"| PROV["✅ Provisionado
+ Auto Scaling"] PROV --> NOTE1["Configura min/max
y objetivo de utilización"] OD --> NOTE2["Monitorea consumo
2-4 semanas"]
Cómo Crear una Tabla DynamoDB con Cada Modo
Crear tabla en modo On-Demand
aws dynamodb create-table \
--table-name mi-tabla-ondemand \
--attribute-definitions AttributeName=PK,AttributeType=S \
--key-schema AttributeName=PK,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--region us-east-1
Crear tabla en modo Provisionado
aws dynamodb create-table \
--table-name mi-tabla-provisionada \
--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
Configurar Auto Scaling para una tabla Provisionada
🔽 Ver comandos de Auto Scaling (click para expandir)
# Registrar la tabla como objetivo escalable (escritura)
aws application-autoscaling register-scalable-target \
--service-namespace dynamodb \
--resource-id "table/mi-tabla-provisionada" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits" \
--min-capacity 10 \
--max-capacity 500 \
--region us-east-1
# Registrar la tabla como objetivo escalable (lectura)
aws application-autoscaling register-scalable-target \
--service-namespace dynamodb \
--resource-id "table/mi-tabla-provisionada" \
--scalable-dimension "dynamodb:table:ReadCapacityUnits" \
--min-capacity 10 \
--max-capacity 1000 \
--region us-east-1
# Crear política de escalado para escritura (objetivo: 70% de utilización)
aws application-autoscaling put-scaling-policy \
--service-namespace dynamodb \
--resource-id "table/mi-tabla-provisionada" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits" \
--policy-name "WriteAutoScalingPolicy" \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration \
'{"TargetValue": 70.0, "PredefinedMetricSpecification": {"PredefinedMetricType": "DynamoDBWriteCapacityUtilization"}}' \
--region us-east-1
Cómo Migrar Entre Modos de Capacidad de DynamoDB
Puedes cambiar el modo de capacidad de una tabla existente en cualquier momento. AWS documenta la siguiente regla sobre la frecuencia de cambios: puedes cambiar entre modos una vez cada 24 horas, con la excepción de que si cambias una tabla de modo Provisionado a On-Demand, puedes volver a cambiarla a modo Provisionado dentro del mismo período de 24 horas.
Migrar de Provisionado a On-Demand
aws dynamodb update-table \
--table-name mi-tabla-provisionada \
--billing-mode PAY_PER_REQUEST \
--region us-east-1
Migrar de On-Demand a Provisionado
aws dynamodb update-table \
--table-name mi-tabla-ondemand \
--billing-mode PROVISIONED \
--provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=50 \
--region us-east-1
Verificar el modo de capacidad actual de una tabla
aws dynamodb describe-table \
--table-name mi-tabla-ondemand \
--query 'Table.BillingModeSummary' \
--region us-east-1
Permisos IAM Mínimos para Gestionar Modos de Capacidad
Para que una aplicación o rol de CI/CD pueda consultar y modificar el modo de capacidad de una tabla, necesita al menos estos permisos. Nota: dynamodb:DescribeTable y dynamodb:UpdateTable soportan restricción por ARN de recurso.
🔽 Ver política IAM (click para expandir)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DescribeTableCapacity",
"Effect": "Allow",
"Action": [
"dynamodb:DescribeTable"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/mi-tabla-ondemand"
},
{
"Sid": "UpdateTableCapacityMode",
"Effect": "Allow",
"Action": [
"dynamodb:UpdateTable"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/mi-tabla-ondemand"
},
{
"Sid": "AutoScalingRegistration",
"Effect": "Allow",
"Action": [
"application-autoscaling:RegisterScalableTarget",
"application-autoscaling:PutScalingPolicy",
"application-autoscaling:DescribeScalableTargets",
"application-autoscaling:DescribeScalingPolicies"
],
"Resource": "*"
}
]
}
Diagnóstico: Throttling en DynamoDB — Síntoma, Diagnóstico Erróneo y Causa Real
El escenario clásico: tienes Auto Scaling configurado, las métricas de CloudWatch muestran que la utilización promedio está al 60%, y aun así aparecen errores ProvisionedThroughputExceededException en los logs. El diagnóstico inicial suele ser 'el límite provisionado es insuficiente' — y la respuesta instintiva es subir las WCU manualmente.
El problema real casi siempre es una distribución desigual de acceso a particiones — lo que DynamoDB llama 'hot partitions'. DynamoDB distribuye el throughput provisionado entre las particiones de la tabla. Si el 80% de tus escrituras van a la misma clave de partición, esa partición específica se satura aunque el throughput agregado de la tabla esté por debajo del límite.
Subir las WCU totales no resuelve el problema — solo lo enmascara temporalmente. La solución correcta es revisar el diseño de la clave de partición para distribuir el acceso uniformemente.
Verificar throttling por tabla y partición
# Ver eventos de throttling recientes en CloudWatch
aws cloudwatch get-metric-statistics \
--namespace AWS/DynamoDB \
--metric-name WriteThrottleEvents \
--dimensions Name=TableName,Value=mi-tabla-provisionada \
--start-time 2024-01-01T00:00:00Z \
--end-time 2024-01-01T01:00:00Z \
--period 300 \
--statistics Sum \
--region us-east-1
Si ves throttling con utilización agregada baja, el problema es de distribución de particiones — no de capacidad total. Cambiar a On-Demand no resuelve hot partitions; solo cambia el modelo de cobro del problema.
Monitoreo de Consumo de Capacidad con CloudWatch
Independientemente del modo elegido, estas métricas son las que debes monitorear activamente para tomar decisiones de migración entre modos.
# Consumo de WCU en los últimos 60 minutos (resolución de 1 minuto)
aws cloudwatch get-metric-statistics \
--namespace AWS/DynamoDB \
--metric-name ConsumedWriteCapacityUnits \
--dimensions Name=TableName,Value=mi-tabla-ondemand \
--start-time 2024-01-01T00:00:00Z \
--end-time 2024-01-01T01:00:00Z \
--period 60 \
--statistics Sum \
--region us-east-1
Cuando el consumo promedio de On-Demand sea estable durante 2-4 semanas sin picos abruptos, tienes suficiente información para calcular si Provisionado + Auto Scaling sería más económico para tu carga de trabajo específica.
Modos de Capacidad de DynamoDB: Próximos Pasos
Si estás comenzando sin datos de tráfico, la decisión correcta es On-Demand. No es la más económica a largo plazo, pero es la que evita throttling mientras acumulas métricas reales. Una vez que tengas 2-4 semanas de datos de ConsumedReadCapacityUnits y ConsumedWriteCapacityUnits, puedes evaluar si la migración a Provisionado con Auto Scaling justifica el ahorro.
- Consulta la documentación oficial de modos de capacidad de DynamoDB para detalles actualizados sobre límites y precios.
- Revisa las métricas de
WriteThrottleEventsyReadThrottleEventsen CloudWatch antes de cualquier migración. - Si migras a Provisionado, configura siempre Auto Scaling — nunca dejes capacidad fija sin ajuste automático en producción.
Glosario de Términos Clave
| Término | Definición |
|---|---|
| RCU (Read Capacity Unit) | Unidad que representa una lectura fuertemente consistente de hasta 4 KB, o dos lecturas eventualmente consistentes del mismo tamaño. |
| WCU (Write Capacity Unit) | Unidad que representa una escritura estándar de hasta 1 KB en DynamoDB. |
| Throttling | Rechazo de solicitudes por DynamoDB cuando el throughput consumido supera la capacidad disponible. Genera el error ProvisionedThroughputExceededException. |
| Hot Partition | Partición de DynamoDB que recibe una proporción desproporcionada del tráfico, causando throttling localizado aunque el throughput agregado sea suficiente. |
| PAY_PER_REQUEST | Valor del parámetro --billing-mode en la CLI de AWS que activa el modo On-Demand en una tabla DynamoDB. |
Comentarios
Publicar un comentario