lección 12
Control de costes: cómo no arruinarte (historias de terror)
Billing alerts, budgets, reservas, Spot, rightsizing y las historias de terror que todo ingeniero de datos debería conocer antes de tocar producción.
⏱ 50 min
Voy a empezar esta lección con tres historias reales que me han contado colegas o he vivido yo mismo. Primera: un equipo dejó un clúster EMR de 20 nodos corriendo un viernes por la tarde. El lunes descubrieron una factura de $3,200 por 60 horas de compute inútil. Segunda: un desarrollador publicó un bucket S3 con Transfer Acceleration activado y una Lambda que se trigger recursiva (Lambda escribe en S3, S3 triggerea Lambda, Lambda escribe en S3...). 200 millones de invocaciones en 4 horas. $8,000. Tercera: un data engineer configuró Kinesis con 100 shards "por si acaso" para un proyecto que recibía 10 eventos/segundo. $3,600/mes por capacidad que nunca usó.
AWS puede ser muy barato o muy caro. La diferencia no es suerte — es diseño. Un pipeline bien diseñado que procesa 1TB/día puede costar $30/mes. El mismo pipeline mal diseñado puede costar $3,000/mes. Esta lección es sobre cómo estar en el grupo de los $30.
### Regla #1: Configura alertas de facturación ANTES de hacer nada
Lo primero que debes hacer en CUALQUIER cuenta AWS — antes de crear un solo recurso — es configurar alertas de billing. AWS te envía un email cuando tu gasto supera un umbral. Configura alertas a $10, $50, $100 y $500. Así nunca te llevarás una sorpresa.
1# Ejemplo conceptual: crear presupuesto con alertas2# (En AWS real usarías la API de Budgets)3import boto345def crear_presupuesto_alerta(limite_mensual: float, emails: list):6 """Crea un presupuesto con alertas al 50%, 80% y 100%."""7 budget = {8 'nombre': 'limite-equipo-datos',9 'limite_usd': limite_mensual,10 'alertas': [11 {'umbral': 50, 'mensaje': f'⚠️ 50% del presupuesto (${limite_mensual*0.5})'},12 {'umbral': 80, 'mensaje': f'🚨 80% del presupuesto (${limite_mensual*0.8})'},13 {'umbral': 100, 'mensaje': f'🔴 LÍMITE ALCANZADO (${limite_mensual})'},14 ],15 'destinatarios': emails16 }17 print(f"✅ Presupuesto configurado: ${limite_mensual}/mes")18 for alerta in budget['alertas']:19 print(f" Alerta al {alerta['umbral']}%: {alerta['mensaje']}")20 return budget2122crear_presupuesto_alerta(200, ['data-team@empresa.com'])
Configura alertas ANTES de crear recursos — no después de la factura
### Los 5 mayores ladrones de dinero en pipelines de datos
- 01.Recursos olvidados: clústeres EMR, instancias EC2, endpoints VPC que nadie apagó. Solución: tags obligatorios + scripts de limpieza automática.
- 02.Sobredimensionamiento: Glue con 20 DPUs cuando 5 bastaban. Redshift con nodos ra3.4xlarge cuando dc2.large era suficiente. Solución: empieza pequeño y escala.
- 03.Formato incorrecto en S3: consultar CSV sin comprimir con Athena en vez de Parquet particionado. 100x más caro. Solución: SIEMPRE Parquet para analítica.
- 04.Lambdas recursivas: Lambda → S3 → Lambda → S3... loop infinito. Solución: prefijos diferentes para input/output, nunca escribas donde lees.
- 05.Transfer innecesario: mover datos entre regiones ($0.02/GB), usar NAT Gateway para tráfico S3 ($0.045/GB). Solución: VPC Endpoints para S3, todo en la misma región.
### Estrategias de ahorro por servicio
- S3: Intelligent-Tiering para datos con acceso impredecible. Lifecycle rules para mover a Glacier. Borrar versiones antiguas.
- EMR: Clústeres efímeros + Spot instances. Nunca dejar clústeres 24/7 para batch nocturno.
- Glue: Ajustar DPUs al mínimo necesario. Usar push-down predicates para leer menos datos.
- Athena: Parquet + particionado + workgroup con límite de scan. CTAS para crear tablas optimizadas.
- Lambda: Ajustar memoria al mínimo (128MB si es posible). ARM64 en vez de x86 (20% más barato).
- Redshift: Pausar clúster fuera de horario laboral. Reserved Instances para cargas predecibles.
Consejo de senior: crea un "cost dashboard" semanal que muestre gasto por servicio y equipo. Cuando la gente VE cuánto cuesta lo que usa, se vuelve más cuidadosa naturalmente. Los tags de AWS (equipo=data-engineering, proyecto=fashionstore) son esenciales para atribuir costes.
### Reserved Instances y Savings Plans
Si sabes que vas a usar un recurso durante 1 o 3 años (Redshift, EMR core nodes, RDS), puedes pagar por adelantado y ahorrar 30-60%. Es como pagar la matrícula del gimnasio anual en vez de mensual. AWS te da un descuento por comprometerte. Pero cuidado: si no lo usas, pagas igual.
NUNCA compres Reserved Instances sin al menos 3 meses de datos de uso real. He visto equipos comprar reservas de Redshift ra3.16xlarge para 3 años y darse cuenta a los 2 meses de que ra3.xlarge era suficiente. $50,000 tirados a la basura. Empieza On-Demand, mide, y DESPUÉS optimiza.
Consejo de senior: incluye el coste como una métrica más de tu pipeline, al mismo nivel que la latencia o la calidad de datos. Añade un paso al final de tu pipeline que registre cuánto costó la ejecución (compute time * precio). Si un día el coste se dispara, investiga.
## ejercicios
Calculadora de coste de un pipeline completo
Crea una calculadora que estime el coste mensual de un pipeline típico: ingesta con Lambda, transformación con Glue, consulta con Athena, almacenamiento en S3.
Detector de recursos olvidados
Escribe un script que busque recursos potencialmente olvidados: buckets vacíos, roles sin usar, Lambdas sin invocaciones recientes.
Calcular ahorro por migrar CSV a Parquet
Tu equipo ejecuta 200 queries diarias sobre datos CSV en S3. Calcula cuánto ahorrarían migrando a Parquet particionado y cuánto tiempo tardaría en "pagarse" la migración.
💡 Resultado esperado
📊 Análisis de ROI: Coste actual (CSV): $146.48/mes Coste futuro (Parquet): $2.44/mes Ahorro: $144.04/mes (98.3%)
Generar policy de tags obligatorios
Crea una función que genere una SCP (Service Control Policy) que obligue a taggear todos los recursos con equipo, proyecto y entorno.
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...