DynamoDB
📘 ¿Qué es DynamoDB?
Amazon DynamoDB es un servicio de base de datos NoSQL completamente gestionado, rápido y altamente escalable. Diseñado para manejar cargas de trabajo de millones de solicitudes por segundo con baja latencia y alta disponibilidad.
-
⚡ NoSQL (clave-valor / documento)
-
🔄 Serverless (sin servidores que administrar)
-
📈 Escala automáticamente
-
⏱️ Latencia en milisegundos de un solo dígito
-
☁️ Integrado con IAM, Lambda, Streams, etc.
🗃️ Modelo de datos
📦 Tabla
- Colección de ítems (similar a una tabla en SQL)
🔑 Claves primarias
| Tipo | Ejemplo |
|---|---|
| Clave de partición | UserID |
| Clave compuesta | UserID + Timestamp (orden) |
🧱 Ítem
-
Objeto JSON (hasta 400 KB)
-
No requiere esquema fijo
-
Cada ítem puede tener diferentes atributos
🧾 Atributos
- Tipos: String, Number, Boolean, Map, List, Null, Binary
⚙️ Capacidad
| Tipo | Descripción |
|---|---|
| Provisionada | Definida en RCU/WCU (lecturas/escrituras por segundo) |
| On-Demand | Se escala automáticamente según uso (ideal para cargas variables) |
| Autoscaling | Disponible en modo provisionado |
🔒 Seguridad
-
IAM: Control de acceso granular a tablas y operaciones (
dynamodb:GetItem, etc.) -
Cifrado en reposo: Activado por defecto (KMS)
-
TLS en tránsito: Activado por defecto
-
Backup: Snapshots bajo demanda y backups continuos
🔄 Operaciones básicas
| Operación | Descripción |
|---|---|
GetItem | Obtener ítem por clave |
PutItem | Crear/Actualizar ítem |
UpdateItem | Modificar atributos |
DeleteItem | Eliminar ítem |
Query | Buscar por clave de partición |
Scan | Leer toda la tabla (costoso) |
🧠 Índices secundarios
| Tipo | Clave | Uso principal |
|---|---|---|
| GSI (Global Sec.) | Clave distinta | Búsqueda por otros atributos |
| LSI (Local Sec.) | Misma partición | Búsqueda ordenada por otro campo |
🧪 Ejemplo con Boto3 (Python)
import boto3
dynamo = boto3.resource('dynamodb')
table = dynamo.Table('Users')
# Agregar usuario
table.put_item(Item={'UserID': '123', 'Name': 'Alice', 'Age': 30})
# Obtener usuario
response = table.get_item(Key={'UserID': '123'})
print(response['Item'])
# Consultar por clave
response = table.query(
KeyConditionExpression=boto3.dynamodb.conditions.Key('UserID').eq('123')
)
⚡ Streams y triggers
-
DynamoDB Streams: Captura cambios en ítems (insert, update, delete)
-
Usado con AWS Lambda para ejecutar acciones en tiempo real (auditoría, notificaciones, sincronización, etc.)
🧰 Integraciones útiles
| Servicio | Integración |
|---|---|
| Lambda | Funciones como triggers de Streams o acceso directo |
| API Gateway | Backend sin servidor con acceso a DynamoDB |
| CloudWatch | Métricas y alarmas de capacidad/uso |
| S3 + Glue | Exportación de datos a S3 y análisis |
| Athena | Consultas con SQL sobre backups exportados |
💵 Costos
Se basa en:
-
RCU/WCU (lectura/escritura)
-
Modo on-demand (por ítem accedido)
-
Almacenamiento (por GB/mes)
-
Streams, backups, exportaciones
💡 Tips para optimizar costos:
Usa índices solo si los necesitas
Prefiere
QuerysobreScanElige on-demand para cargas impredecibles
🧠 Buenas prácticas
-
Diseño por acceso: Diseña tablas en función de cómo accederás a los datos, no como modelarías en SQL.
-
Usa claves compuestas para ordenar por tiempo, categorías, etc.
-
Limita el uso de
Scan(usa paginación si es necesario) -
Evita hot partitions (valores de clave repetidos)
-
Aplica control de concurrencia optimista con atributos
VersionoConditionExpression
📄 Comparación con otros servicios
| Servicio | Tipo | Uso ideal |
|---|---|---|
| DynamoDB | NoSQL clave/valor | Apps web, IoT, gaming, sesiones, carritos |
| Aurora | Relacional SQL | Aplicaciones que requieren joins complejos |
| DocumentDB | NoSQL documental | Datos semiestructurados en formato JSON |
| S3 | Objeto (blob) | Archivos grandes, backup, estáticos |
🎓 Preguntas tipo certificación
-
¿Qué operación es más eficiente en DynamoDB?
- ✅
Query(usa clave primaria)
- ✅
-
¿DynamoDB tiene límite de tamaño por ítem?
- ✅ Sí, 400 KB
-
¿Qué usar para activar lógica cuando cambia un ítem?
- ✅ DynamoDB Streams + Lambda
-
¿Cómo proteger contra escrituras simultáneas?
- ✅
ConditionExpressiono control de versión manual
- ✅