Optimización de costos: Cache de Secrets y DynamoDB con Redis/Valkey
En aplicaciones que hacen un uso intensivo de Secrets Manager y DynamoDB, los costos operativos pueden dispararse rápidamente si no se aplica una estrategia de optimización adecuada. En este artículo, comparto cómo hemos implementado una solución de cache con Redis (y posteriormente Valkey) que nos ha permitido reducir los costos de estos servicios de 300$ a 45$ mensuales, mejorando además la latencia de nuestras aplicaciones.
El problema: Costos desproporcionados en API calls
Nuestra arquitectura consistía en diversos componentes que accedían frecuentemente a secrets y datos de configuración:
Componentes afectados:
- Workers asíncronos: Procesos que consultan secrets en cada ejecución
- Plataforma web: API REST que accede a configuraciones almacenadas en DynamoDB
- Microservicios: Diferentes servicios que necesitan credenciales de conexión
¿El problema principal? Cada vez que un worker o la web necesitaba un secret o una configuración, hacía una petición directa a AWS Secrets Manager o DynamoDB. Esto significaba:
- Costos por API calls: Miles de peticiones diarias que se acumulan en la factura
- Latencia adicional: Cada petición requiere un viaje round-trip a AWS
- Dependencia externa: La disponibilidad dependía de los servicios de AWS
La solución: Capa de cache con Redis
La estrategia fue sencilla pero efectiva: interponer una capa de cache entre la aplicación y los servicios de AWS.
Arquitectura inicial: Redis in-cluster
La primera implementación utilizó Redis desplegado dentro del clúster Kubernetes:
Características:
- Despliegue como StatefulSet dentro del clúster EKS
- Persistencia con volúmenes EBS
- Configuración de TTL (Time To Live) para las claves
Beneficios inmediatos:
- Reducción drástica de peticiones: La gran mayoría de consultas se servían desde cache
- Mejora de latencia: Las consultas locales eran significativamente más rápidas
- Coste menor: El coste de Redis dentro del clúster era insignificante comparado con el ahorro
Implementación: Patrón Cache-Aside
Para la implementación, utilizamos el patrón Cache-Aside (también conocido como Lazy Loading):
| |
Estrategia de TTL:
- Secrets Manager y DynamoDB: 1 hora (3600 segundos) - Equilibrio entre frescura y ahorro
Migración a Valkey (AWS)
Una vez validamos que el approach de cache funcionaba correctamente, decidimos migrar a Valkey gestionado por AWS (ElastiCache).
¿Por qué Valkey?
Valkey es el proyecto open source que surgió después de la divergencia de Redis. AWS lo adoptó como opción por defecto para ElastiCache.
Ventajas de la migración:
- Gestión reducida: No hay que gestionar la infraestructura del cache
- Alta disponibilidad: Replicación automática y failover
- Escalabilidad: Fácil escalar verticalmente u horizontalmente
- Monitorización: Integración nativa con CloudWatch
- Seguridad: Encriptación en tránsito y reposo
Configuración implementada:
- Node type:
cache.t4g.small(instancias Graviton para ahorro)
Resultados cuantificables
Ahorro en costes
Antes (sin cache):
- Secrets Manager: 250$/mes
- DynamoDB: 50$/mes (principalmente en API calls)
- Total: 300$/mes
Después (con Valkey):
- Secrets Manager: 25$/mes (reducción del 90%)
- DynamoDB: 10$/mes (reducción del 80%)
- Valkey (ElastiCache): 10$/mes
- Total: 45$/mes
Ahorro total: 255$/mes (85% de reducción)
Mejora en rendimiento
Más allá del ahorro económico, las mejoras de rendimiento han sido significativas:
- Latencia de consulta: Reducción significativa en consultas de secrets y configuraciones
- Throughput: Capacidad incrementada para gestionar más peticiones por segundo
- Experiencia de usuario: Las APIs responden más rápido gracias al cache local
Beneficios operativos
- Reducción de dependencias externas: La mayoría de peticiones no salen del clúster
- Mejor experiencia de usuario: Las APIs responden más rápido
- Menos limitaciones: Reducción significativa de throttling a Secrets Manager y DynamoDB
- Escalabilidad: El sistema puede gestionar más carga con los mismos recursos
Lecciones aprendidas
1. No hace falta cachear todo
Es importante analizar qué datos se benefician realmente del cache:
- Alta frecuencia de lectura, baja frecuencia de escritura: ✅ Perfecto para cache
- Datos que cambian constantemente: ❌ Mejor acceder directamente
- Secrets críticos de seguridad: Considerar TTLs muy cortos
2. El tamaño importa
El tamaño de la instancia de Valkey debe ajustarse según:
- Volumen de datos a cachear
- Patrón de acceso (read-heavy vs write-heavy)
- Requisitos de latencia
En nuestro caso, un cache.t4g.small ha sido suficiente, pero hay que monitorizar.
3. Monitorización es clave
Hemos implementado alertas para:
- Cache hit rate: Debe ser >90%
- Evictions: Si aumentan, hay que ampliar memoria
- Errores de conexión: Indican problemas en Valkey
4. Planificando el fallback
Siempre debemos tener un plan por si Valkey cae:
| |
Esta estrategia garantiza que el sistema siga funcionando aunque el cache falle.
Conclusión
La implementación de una capa de cache con Redis/Valkey entre nuestra aplicación y los servicios de AWS (Secrets Manager y DynamoDB) ha sido una de las optimizaciones más impactantes que hemos realizado.
Resultados finales:
- Ahorro económico: 255$/mes (85% de reducción)
- Mejora de rendimiento: Reducción significativa de latencia en las consultas
- Mejor experiencia de usuario: APIs mucho más responsive
- Mayor capacidad: Incremento de throughput posible
La clave del éxito ha sido:
- Analizar el patrón de uso antes de implementar
- Comenzar sencillo (Redis in-cluster) y después escalar (Valkey AWS)
- Implementar estrategias adecuadas de TTL e invalidación
- Monitorizar continuamente para optimizar
- Planificar el fallback para garantizar disponibilidad
Para cualquier aplicación que haga un uso intensivo de Secrets Manager, DynamoDB o cualquier servicio de AWS con costes por API call, el uso de un cache como Valkey es, casi seguro, una de las mejores inversiones que puedes hacer. El retorno es inmediato, tanto en costes como en rendimiento.
Si tu aplicación tiene una factura mensual elevada en estos servicios, te animo a probar esta estrategia. Los resultados, como hemos visto nosotros, pueden ser sorprendentes.