En la actualidad, muchas aplicaciones modernas requieren servicios stateful, es decir, servicios que mantienen información y estado entre sesiones o solicitudes. Implementar estos servicios sobre contenedores exige garantizar que cada instancia conserve su estado y datos, incluso si se escala o reinicia. Amazon Web Services (AWS) ha revolucionado el mundo del cómputo en la nube con sus herramientas gestionadas, y Apache Pinot, una plataforma analítica en tiempo real, se beneficia enormemente cuando se ejecuta en AWS con las configuraciones adecuadas. Un avance reciente en esta dirección es la posibilidad de ejecutar Apache Pinot en AWS Fargate apoyándose en volúmenes EBS para almacenamiento persistente mediante la constructo personalizado "StatefulSets" para ECS. Este enfoque combina la elasticidad y facilidad de Fargate con la persistencia y consistencia de EBS, solucionando, además, el desafío de ofrecer identificadores estables y escalabilidad ordenada para servicios stateful.
Tradicionalmente, la orquestación de contenedores con estado ha encontrado bastantes retos en ambientes serverless o sin gestión directa de infraestructura, como lo es Fargate. Aunque Fargate elimina la necesidad de administrar servidores y clusters subyacentes, presenta limitaciones cuando se requieren volúmenes persistentes que sobrevivan a las interrupciones o paradas de tareas. AWS no permite que Fargate adjunte directamente volúmenes EBS ya existentes a tareas o contenedores. Para superar esta barrera, se ha desarrollado una solución innovadora a través de un constructo de AWS Cloud Development Kit (CDK) denominado "StatefulSet" para ECS que replica las funcionalidades conocidas de los StatefulSets de Kubernetes, pero optimizado para Fargate y utilizando snapshots de EBS para mantener la persistencia de datos. Este constructo permite crear clusters de servicios stateful con varias réplicas, donde cada réplica cuenta con su propio volumen EBS, que es creado, protegido por snapshot y reconstruido automáticamente en caso de fallos o escalamiento hacia abajo.
Esto es vital para aplicaciones como Apache Pinot, ya que sus componentes necesitan acceder a datos persistentes en disco para ofrecer funcionalidades como almacenamiento de segmentos y metadatos. Además, el constructo StatefulSet facilita nombres DNS estables y predecibles para cada réplica, permitiendo que, por ejemplo, zk-0.svc.internal, zk-1.svc.
internal, etc., se resuelvan de manera consistente en la red privada de AWS. Esta característica es fundamental para la comunicación interna y la coordinación de servicios distribuidos donde los nodos requieren conocerse y comunicarse entre sí con rutas fijas. El ejemplo práctico más destacado de esta solución es la implementación completa de un cluster Apache Pinot corriendo sobre tareas Fargate, cada una organizada dentro del StatefulSet. Apache Pinot es una plataforma de análisis en tiempo real diseñada para realizar consultas rápidas en grandes volúmenes de datos.
Contar con una arquitectura robusta y escalable que mantenga el estado y los datos del sistema es clave para garantizar su alto rendimiento y disponibilidad. Al desplegar Pinot con esta arquitectura, cada uno de sus componentes —como controladores, servidores y brokers— está contenido en una tarea Fargate independiente pero vinculada por el constructo StatefulSet. Esto implica que cada nodo Pinot mantiene su volumen EBS individual, respaldado por snapshots automáticos para recuperación ante fallos o escalamiento dinámico, un requisito esencial que Fargate por sí solo no soportaba. El mecanismo de administración de StatefulSet emplea una función Lambda que sirve como bucle de control. Esta función se ejecuta periódicamente o ante eventos específicos definidos en EventBridge y se encarga de gestionar el ciclo de vida de las tareas, asegurar la correcta asociación de volúmenes, gestionar el registro DNS y garantizar que, en cualquier momento, el número de réplicas y la configuración sean consistentes con el estado deseado.
Esta automatización libera a los operadores de complejidad de configuración manual y reduce el riesgo de errores en producción. Desde el punto de vista de seguridad y red, el constructo también incorpora configuraciones que integran subredes, grupos de seguridad y zonas alojadas en Route 53 para registrar los nombres DNS de los servicios. Esto asegura tanto el aislamiento y la protección de las tareas como la fácil resolución y conexión entre los nodos, fundamentales para aplicaciones distribuidas y sensibles a la latencia. La experiencia de usuario mejora aún más gracias a la posibilidad de portear las conexiones al entorno local del desarrollador o administrador mediante técnicas de reenvío de puertos con AWS Systems Manager (SSM) o SSH. Esto permite acceder a las interfaces de administración como el controlador de Apache Pinot desde entornos externos a AWS, facilitando la gestión, monitoreo y diagnóstico sin requerir acceso directo a la red privada o establecer VPN.
Para desarrollar e implementar esta solución es necesario contar con conocimientos en AWS CDK y TypeScript, así como familiaridad con la arquitectura de containers y ECS. El repositorio disponible en GitHub ofrece el código base, ejemplos detallados y scripts para compilar y desplegar el stack completo mediante comandos sencillos como npx tsc y cdk deploy. Su diseño modular permite extender o adaptar la solución a otros servicios stateful más allá de Apache Pinot, como Zookeeper u otros sistemas que requieren volúmenes persistentes y administración compleja. El uso de StatefulSets en ECS Fargate con EBS representa un paso significativo para la comunidad de usuarios AWS que desean combinar la simplicidad y escalabilidad de Fargate con los requerimientos avanzados de estado y persistencia en aplicaciones críticas. Esta construcción abre nuevas puertas para arquitecturas cloud nativas que antes solo eran posibles con clusters Kubernetes o sistemas con gestión detallada de infraestructura.