Optimització de costos: Cache de Secrets i DynamoDB amb Redis/Valkey
En aplicacions que fan un ús intensiu de Secrets Manager i DynamoDB, els costos operatius poden disparar-se ràpidament si no s’aplica una estratègia d’optimització adequada. En aquest article, comparteixo com hem implementat una solució de cache amb Redis (i posteriorment Valkey) que ens ha permès reduir els costos d’aquests serveis de 300$ a 45$ mensuals, tot millorant la latència de les nostres aplicacions.
El problema: Costos desproporcionats en API calls
La nostra arquitectura consistia en diversos components que accedien freqüentment a secrets i dades de configuració:
Components afectats:
- Workers asíncrons: Processos que consulten secrets a cada execució
- Plataforma web: API REST que accedeix a configuracions emmagatzemades a DynamoDB
- Microserveis: Diferents serveis que necessiten credencials de connexió
El problema principal? Cada vegada que un worker o la web necessitava un secret o una configuració, feia una petició directa a AWS Secrets Manager o DynamoDB. Això significava:
- Costos per API calls: Milers de peticions diàries que s’acumulen a la factura
- Latència addicional: Cada petició requereix un viatge round-trip a AWS
- Dependència externa: La disponibilitat depenia dels serveis d’AWS
La solució: Capa de cache amb Redis
L’estratègia va ser senzilla però efectiva: interposar una capa de cache entre l’aplicació i els serveis d’AWS.
Arquitectura inicial: Redis in-cluster
La primera implementació va utilitzar Redis desplegat dins del clúster Kubernetes:
Característiques:
- Desplegament com a StatefulSet dins del clúster EKS
- Persistència amb volums EBS
- Configuració de TTL (Time To Live) per a les claus
Beneficis immediats:
- Reducció dràstica de peticions: La gran majoria de consultes es servien des de cache
- Millora de latència: Les consultes locals eren significativament més ràpides
- Cost menor: El cost de Redis dins del clúster era insignificant comparat amb l’estalvi
Implementació: Patró Cache-Aside
Per a la implementació, vam utilitzar el patró Cache-Aside (també conegut com Lazy Loading):
| |
Estratègia de TTL:
- Secrets Manager i DynamoDB: 1 hora (3600 segons) - Equilibri entre frescor i estalvi
Migració a Valkey (AWS)
Un cop vam validar que l’approach de cache funcionava correctament, vam decidir migrar a Valkey gestionat per AWS (ElastiCache).
Per què Valkey?
Valkey és el projecte open source que va sorgir després de la divergència de Redis. AWS va adoptar-lo com a opció per defecte per ElastiCache.
Avantatges de la migració:
- Gestió reduïda: No cal gestionar la infraestructura del cache
- Alta disponibilitat: Replicació automàtica i failover
- Escalabilitat: Fàcil escalar verticalment o horitzontalment
- Monitoratge: Integració nativa amb CloudWatch
- Seguretat: Encriptació en trànsit i repòs
Configuració implementada:
- Node type:
cache.t4g.small(instàncies Graviton per estalvi)
Resultats quantificables
Estalvi en costos
Abans (sense cache):
- Secrets Manager: 250$/mes
- DynamoDB: 50$/mes (principalment en API calls)
- Total: 300$/mes
Després (amb Valkey):
- Secrets Manager: 25$/mes (reducció del 90%)
- DynamoDB: 10$/mes (reducció del 80%)
- Valkey (ElastiCache): 10$/mes
- Total: 45$/mes
Estalvi total: 255$/mes (85% de reducció)
Millora en rendiment
Més enllà de l’estalvi econòmic, les millores de rendiment han estat significatives:
- Latència de consulta: Reducció significativa en consultes de secrets i configuracions
- Throughput: Capacitat incrementada per gestionar més peticions per segon
- Experiència d’usuari: Les APIs responen més ràpid gràcies al cache local
Beneficis operatius
- Reducció de dependències externes: La majoria de peticions no surten del clúster
- Millor experiència d’usuari: Les APIs responen més ràpid
- Menys limitacions: Reducció significativa de throttling a Secrets Manager i DynamoDB
- Escalabilitat: El sistema pot gestionar més càrrega amb els mateixos recursos
Lliçons apreses
1. No cal fer caché de tot
És important analitzar quines dades es beneficien realment del cache:
- Alta freqüència de lectura, baixa freqüència d’escriptura: ✅ Perfecte per cache
- Dades que canvien constantment: ❌ Millor accedir directament
- Secrets crítics de seguretat: Considerar TTLs molt curts
2. La mida importa
La mida de la instància de Valkey s’ha d’ajustar segons:
- Volum de dades a cachar
- Patró d’accés (read-heavy vs write-heavy)
- Requisits de latència
En el nostre cas, un cache.t4g.small ha estat suficient, però cal monitorar.
3. Monitoratge és clau
Hem implementat alertes per:
- Cache hit rate: Ha de ser >90%
- Evictions: Si augmenten, cal ampliar memòria
- Errors de connexió: Indiquen problemes a Valkey
4. Planificant la fallback
Sempre hem de tenir un pla per si Valkey cau:
| |
Aquesta estratègia garanteix que el sistema segueixi funcionant encara que el cache falli.
Conclusió
La implementació d’una capa de cache amb Redis/Valkey entre la nostra aplicació i els serveis d’AWS (Secrets Manager i DynamoDB) ha estat una de les optimitzacions més impactants que hem realitzat.
Resultats finals:
- Estalvi econòmic: 255$/mes (85% de reducció)
- Millora de rendiment: Reducció significativa de latència en les consultes
- Millor experiència d’usuari: APIs molt més responsive
- Major capacitat: Increment de throughput possible
La clau de l’èxit ha estat:
- Analitzar el patró d’ús abans d’implementar
- Començar senzill (Redis in-cluster) i després escalar (Valkey AWS)
- Implementar estratègies adequades de TTL i invalidació
- Monitoritzar contínuament per optimitzar
- Planificar el fallback per garantir disponibilitat
Per a qualsevol aplicació que faci un ús intensiu de Secrets Manager, DynamoDB o qualsevol servei d’AWS amb costos per API call, l’ús d’un cache com Valkey és, gairebé segur, una de les millors inversions que pots fer. El retorn és immediat, tant en costos com en rendiment.
Si la teva aplicació té una factura mensual elevada en aquests serveis, t’encoratjo a provar aquesta estratègia. Els resultats, com hem vist nosaltres, poden ser sorprenents.