July 31, 2025

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

TipoEjemplo
Clave de particiónUserID
Clave compuestaUserID + 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

TipoDescripción
ProvisionadaDefinida en RCU/WCU (lecturas/escrituras por segundo)
On-DemandSe escala automáticamente según uso (ideal para cargas variables)
AutoscalingDisponible 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ónDescripción
GetItemObtener ítem por clave
PutItemCrear/Actualizar ítem
UpdateItemModificar atributos
DeleteItemEliminar ítem
QueryBuscar por clave de partición
ScanLeer toda la tabla (costoso)

🧠 Índices secundarios

TipoClaveUso principal
GSI (Global Sec.)Clave distintaBúsqueda por otros atributos
LSI (Local Sec.)Misma particiónBú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

ServicioIntegración
LambdaFunciones como triggers de Streams o acceso directo
API GatewayBackend sin servidor con acceso a DynamoDB
CloudWatchMétricas y alarmas de capacidad/uso
S3 + GlueExportación de datos a S3 y análisis
AthenaConsultas 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 Query sobre Scan

  • Elige 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 Version o ConditionExpression


📄 Comparación con otros servicios

ServicioTipoUso ideal
DynamoDBNoSQL clave/valorApps web, IoT, gaming, sesiones, carritos
AuroraRelacional SQLAplicaciones que requieren joins complejos
DocumentDBNoSQL documentalDatos semiestructurados en formato JSON
S3Objeto (blob)Archivos grandes, backup, estáticos

🎓 Preguntas tipo certificación

  1. ¿Qué operación es más eficiente en DynamoDB?

    • Query (usa clave primaria)
  2. ¿DynamoDB tiene límite de tamaño por ítem?

    • ✅ Sí, 400 KB
  3. ¿Qué usar para activar lógica cuando cambia un ítem?

    • ✅ DynamoDB Streams + Lambda
  4. ¿Cómo proteger contra escrituras simultáneas?

    • ConditionExpression o control de versión manual

📚 Recursos adicionales