Tutorial: Creación de una aplicación de chat sin servidor con una API de WebSocket, Lambda y DynamoDB - Amazon API Gateway

Tutorial: Creación de una aplicación de chat sin servidor con una API de WebSocket, Lambda y DynamoDB

En este tutorial, creará una aplicación de chat sin servidor con una API de WebSocket. Con una API de WebSocket, puede admitir la comunicación bidireccional entre clientes. Los clientes pueden recibir mensajes sin tener que sondear para comprobar si hay actualizaciones.

Se tardan aproximadamente 30 minutos en completar este tutorial. En primer lugar, usará una plantilla de AWS CloudFormation para crear funciones Lambda que gestionarán las solicitudes de API, así como una tabla de DynamoDB que almacena los ID de cliente. A continuación, utilizará la consola de API Gateway para crear una API de WebSocket que se integra con las funciones Lambda. Por último, probarás la API para verificar que se envían y reciben mensajes.

Descripción general de la arquitectura de la API creada en este tutorial.

Para completar este tutorial, necesita una cuenta de AWS y un usuario de AWS Identity and Access Management con acceso a la consola. Para obtener más información, consulte Requisitos previos para comenzar con API Gateway.

También es necesario wscat para conectarse a la API. Para obtener más información, consulte Utilice wscat para conectarse y enviar mensajes a una API de WebSocket.

Paso 1: Crear funciones Lambda y una tabla de DynamoDB

Descargue y descomprima la plantilla de creación de aplicaciones para AWS CloudFormation. Utilizará esta plantilla para crear una tabla de Amazon DynamoDB para almacenar los ID de cliente de la aplicación. Cada cliente conectado tiene un ID único que utilizaremos como clave de partición de la tabla. Esta plantilla también crea funciones Lambda que actualizan las conexiones de clientes en DynamoDB y gestionan el envío de mensajes a los clientes conectados.

Para crear una pila de AWS CloudFormation
  1. Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation.

  2. Seleccione Create stack (Crear pila) y, a continuación, seleccione With new resources (standard) (Con nuevos recursos [estándar]).

  3. En Specify template (Especificar plantilla), elija Upload a template file (Cargar un archivo de plantilla).

  4. Seleccione la plantilla que ha descargado.

  5. Elija Next (Siguiente).

  6. En Stack name (Nombre de pila), escriba websocket-api-chat-app-tutorial y, a continuación, elija Next (Siguiente).

  7. En Configure stack options (Configurar opciones de pila), elija Next (Siguiente).

  8. Para Capabilities (Capacidades), sepa que AWS CloudFormation puede crear recursos de IAM en su cuenta.

  9. Seleccione Submit (Enviar).

AWS CloudFormation aprovisiona los recursos especificados en la plantilla. Puede tardar varios minutos en finalizar el aprovisionamiento de los recursos. Cuando el estado de la pila de AWS CloudFormation sea CREATE_COMPLETE, estará listo para continuar con el paso siguiente.

Paso 2: Crear una API de WebSocket

Creará una API de WebSocket para gestionar las conexiones de clientes y enrutar solicitudes a las funciones Lambda que creó en el paso 1.

Para crear una API de WebSocket
  1. Inicie sesión en la consola de API Gateway en https://console.aws.amazon.com/apigateway.

  2. Seleccione Create API (Crear API). En WebSocket API (API de WebSocket), elija Build (Crear).

  3. En API name (Nombre de la API), escribawebsocket-chat-app-tutorial.

  4. Para Route selection expression (Expresión de selección de ruta), ingrese request.body.action. La expresión de selección de ruta determina la ruta que API Gateway invoca cuando un cliente envía un mensaje.

  5. Elija Siguiente.

  6. Para Predefined routes (Rutas predefinidas), elija Add $connect (Agregar $connect), Add $disconnect (Agregar $disconnect) y Add $default (Agregar $default). Las rutas $connect y $disconnect son rutas especiales que API Gateway invoca automáticamente cuando un cliente se conecta o se desconecta de una API. API Gateway invoca la ruta $default cuando ninguna otra ruta coincide con una solicitud.

  7. Para Custom routes (Rutas personalizadas), elija Add custom route (Agregar ruta personalizada). Para Route key (Clave de ruta), ingrese sendmessage. Esta ruta personalizada gestiona los mensajes que se envían a los clientes conectados.

  8. Elija Siguiente.

  9. En Attach integrations (Adjuntar integraciones), para cada ruta e Integration type (Tipo de integración), elija Lambda.

    Para Lambda, elija la función Lambda correspondiente que creó con AWS CloudFormation en el paso 1. El nombre de cada función coincide con una ruta. Por ejemplo, para la ruta $connect, elija la función denominada websocket-chat-app-tutorial-ConnectHandler.

  10. Revise la etapa que API Gateway le crea. De forma predeterminada, API Gateway crea un nombre de etapa production e implementa automáticamente la API en esa fase. Elija Next (Siguiente).

  11. Elija Create and deploy (Crear e implementar).

Paso 3: probar la API

A continuación, pruebe la API para asegurarse de que funciona correctamente. Utilice el comando wscat para conectarse a la API.

Para obtener la URL para invocar la API
  1. Inicie sesión en la consola de API Gateway en https://console.aws.amazon.com/apigateway.

  2. Elija la API.

  3. Elija Stages (Etapas) y, a continuación, elija production (producción).

  4. Tenga en cuenta la WebSocket URL (URL de WebSocket) de la API. La dirección URL debe tener un aspecto similar al siguiente: wss://abcdef123.execute-api.us-east-2.amazonaws.com/production.

Para conectarse a la API
  1. Para conectarse a la API, utilice el siguiente comando. Cuando se conecte a la API, API Gateway invoca la ruta $connect. Cuando se invoca esta ruta, llama a una función Lambda que almacena el ID de conexión en DynamoDB.

    wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
    Connected (press CTRL+C to quit)
  2. Abra un nuevo terminal y ejecute el comando wscat de nuevo con los siguientes parámetros.

    wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
    Connected (press CTRL+C to quit)

    Esto le proporciona dos clientes conectados que pueden intercambiar mensajes.

Cómo enviar un mensaje
  • API Gateway determina qué ruta invocar en función de la expresión de selección de rutas de la API. La expresión de selección de rutas de la API es $request.body.action. Como resultado, API Gateway invoca la ruta sendmessage cuando envía el siguiente mensaje:

    {"action": "sendmessage", "message": "hello, everyone!"}

    La función Lambda asociada a la ruta invocada recopila los ID de cliente de DynamoDB. A continuación, la función llama a la API de administración de API Gateway y envía el mensaje a esos clientes. Todos los clientes conectados reciben el siguiente mensaje:

    < hello, everyone!
Para invocar la ruta $default de la API
  • API Gateway invoca la ruta predeterminada de la API cuando un cliente envía un mensaje que no coincide con las rutas definidas. La función Lambda asociada a la ruta $default utiliza la API de administración de API Gateway para enviar información al cliente sobre la conexión.

    test
    Use the sendmessage route to send a message. Your info: {"ConnectedAt":"2022-01-25T18:50:04.673Z","Identity":{"SourceIp":"192.0.2.1","UserAgent":null},"LastActiveAt":"2022-01-25T18:50:07.642Z","connectionID":"Mg_ugfpqPHcCIVA="}
Para desconectarse de la API
  • Pulse CTRL+C para desconectarse de la API. Cuando un cliente se desconecta de la API, API Gateway invoca la ruta $disconnect de la API. La integración de Lambda para la ruta $disconnect de la API elimina el ID de conexión de DynamoDB.

Paso 4: Limpiar

Para evitar costos innecesarios, elimine los recursos creados como parte de este tutorial Los siguientes pasos eliminan la pila y API de WebSocket de AWS CloudFormation.

Para eliminar una API de WebSocket
  1. Inicie sesión en la consola de API Gateway en https://console.aws.amazon.com/apigateway.

  2. En la página de las API, seleccione la API websocket-chat-app-tutorial. Elija Action (Acciones), elija Delete (Eliminar)y, a continuación, confirme su elección.

Para eliminar una pila de AWS CloudFormation
  1. Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation.

  2. Seleccione su pila de AWS CloudFormation.

  3. Elija Delete (Eliminar) y, a continuación, confirme su elección.

Próximos pasos: automatice con AWS CloudFormation

Puede automatizar la creación y la limpieza de todos los recursos de AWS involucrados en este tutorial. Para obtener una plantilla de AWS CloudFormation que cree esta API y todos los recursos relacionados, consulte chat-app.yaml.