Contexto
Los nodos GPU en AWS (familias g6, g5 y p4) tienen un costo que oscila entre uno y treinta dólares por hora. En el contexto de laboratorios y demostraciones, mantener estos recursos activos las veinticuatro horas se traduce en gastos de cientos o miles de dólares mensuales. La operación manual de apagado funciona — hasta que un olvido durante un fin de semana se traduce en un sobrecosto significativo.
Las alternativas convencionales (CloudWatch schedules, Karpenter, Spot) resultan demasiado rígidas o asumen una carga de trabajo continua. La necesidad concreta era simple: un botón web que el usuario activa al iniciar la sesión y libera al concluirla.
Arquitectura
El panel se sirve como sitio estático desde S3 detrás de CloudFront, comunicándose con un endpoint protegido en API Gateway. La función Lambda detrás del endpoint cumple tres responsabilidades:
- Validación de un token simple (cookie firmada o header).
- Llamada a EKS para escalar el
desired-capacitydel nodegroup GPU. - Devolución del estado actual al panel para reflejar las transiciones (iniciando, apagando, listo).
El frontend realiza polling sobre el endpoint de estado cada pocos segundos, ofreciendo al usuario una experiencia próxima al tiempo real.
Justificación del stack
- Sin servidor que mantener: la combinación S3 + CloudFront + Lambda es 100% serverless y mantiene un costo de centavos por mes en estado inactivo.
- CloudFront proporciona TLS, caché y latencia adecuada sin necesidad de configurar un load balancer.
- API Gateway aísla la Lambda y ofrece un punto único de aplicación de rate limiting o WAF cuando se requiere.
- IAM otorga a la Lambda permisos exclusivamente sobre el nodegroup objetivo: cualquier compromiso eventual de la función limita el blast radius a un único recurso, no a la cuenta completa.
Decisiones que aportaron valor
Estado en el clúster, no en una base de datos
En lugar de mantener una tabla externa con el estado de cada nodegroup, el sistema consulta directamente a EKS por el desired-capacity. La fuente de verdad reside en un único lugar y elimina por completo los problemas de desincronización.
Apagado automático con timeout
Un parámetro opcional permite encender el nodo “por dos horas”. La Lambda agenda una tarea EventBridge que apaga el recurso si el usuario olvida hacerlo manualmente. Una decisión menor en el diseño que se traduce en ahorros consistentes.
Autenticación deliberadamente simple
Para un panel de uso personal o de equipos reducidos, OAuth resulta sobredimensionado. Un secreto compartido firmado en cookie es suficiente. El diseño contempla la migración futura a Cognito o IAM Identity Center sin necesidad de modificar el resto de la arquitectura.
Reutilización
Hoy aplico este mismo patrón al laboratorio de FortiAIGate, pero el código está concebido como una plantilla: basta con cambiar el nodegroup objetivo y el branding para extender su uso a FortiEDR, sandboxes de análisis de malware o cualquier carga de GPU consumida por sesiones.
Próximos pasos
Estoy consolidando el panel en un módulo Terraform que recibe el clúster y el nodegroup como entrada y aprovisiona automáticamente S3, CloudFront, API Gateway, Lambda e IAM. El objetivo es permitir que cualquier ingeniero pueda incorporar un “interruptor de GPU” a su despliegue EKS mediante un único terraform apply.