Aplicación de mensajería en tiempo real serverless construida sobre AWS. Los usuarios se identifican con un ID anónimo tipo PM-XXXX — sin número de teléfono.
Arquitectura 100% serverless desplegada en eu-west-1. Sin servidores que gestionar. El frontend se sirve desde S3 a través de CloudFront. El backend son 5 funciones Lambda invocadas por API Gateway.
Cada Lambda tiene una responsabilidad única. Se ejecutan solo cuando llega una petición y se apagan al terminar — coste cero en reposo.
Gestiona el ciclo completo de autenticación usando Amazon Cognito. Al registrarse genera un ID anónimo PM-XXXX aleatorio que se guarda en DynamoDB y es la identidad del usuario en la app.
PM-XXXX en DynamoDB. Devuelve el userId generado.Carga la lista de conversaciones del usuario al abrir la app. Cada entrada contiene el último mensaje y timestamp para mostrar la vista previa en la barra lateral, ordenadas de más a menos reciente.
conversaciones de DynamoDB filtrando por userId. Devuelve todas las conversaciones activas con su último mensaje y timestamp.Se ejecuta automáticamente cuando un usuario abre la app y el cliente React establece la conexión WebSocket. Registra la presencia online del usuario para poder enviarle mensajes en tiempo real.
connectionId generado por API Gateway en la tabla conexiones de DynamoDB. Este ID es el canal directo para enviar mensajes al usuario. TTL de 24 horas como seguridad si no se ejecuta el disconnect.Se ejecuta cuando el usuario cierra la app o pierde la conexión. Limpia el registro de presencia para que el sistema sepa que ese usuario está offline y los mensajes deben guardarse para entrega diferida.
connectionId que se ha cerrado y borra su entrada de la tabla conexiones. A partir de ese momento el usuario figura como offline.El núcleo del sistema. Maneja el envío, recuperación y estados de los mensajes. Si el destinatario está online entrega el mensaje en menos de 100ms. Si está offline lo persiste en DynamoDB para entrega cuando reconecte.
post_to_connection de API Gateway.leido en DynamoDB. Permite implementar confirmaciones de lectura en el frontend.Modelo NoSQL con TTL automático. Sin gestión de infraestructura, pago por operación.
Almacena el perfil de cada usuario: su ID anónimo PM-XXXX, email y nombre. Se escribe una vez al registrarse.
Todos los mensajes con su conversationId, timestamp, remitente, destinatario y estado de lectura. TTL de 90 días.
Usuarios online ahora mismo. Cada entrada vincula un userId con el connectionId activo de API Gateway. TTL de 24 horas.
Vista previa de cada conversación por usuario — último mensaje y timestamp para mostrar la lista lateral sin leer todos los mensajes.
Recorrido completo de un mensaje cuando Diego manda "Hola" a Maria estando los dos conectados.
action y enruta. Encuentra sendMessage en su tabla de rutas y despierta la Lambda pingme-ws-message.conexiones quién tiene el connectionId entrante y encuentra a Diego (PM-B93F).mensajes y actualiza tabla conversaciones para ambos usuarios con el nuevo último mensaje.conexiones con el userId de Maria. Si existe, obtiene su connectionId activo.apigateway.post_to_connection(connectionId_maria). API Gateway entrega el frame TCP a Maria en menos de 100ms. Si está offline el mensaje queda en DynamoDB y se entrega cuando reconecte.Cada capa protege contra un vector diferente.
wss://. El bucket S3 es privado y solo accesible a través de CloudFront mediante Origin Access Control.pingme-conversaciones solo puede leer la tabla conversaciones. pingme-auth solo puede tocar la tabla usuarios y llamar a Cognito.