Tutorial: Crie uma aplicação de bate-papo de WebSocket com uma API de WebSocket, o Lambda e o DynamoDB
Neste tutorial, você criará uma aplicação de bate-papo sem servidor com uma API WebSocket. Com uma API WebSocket, você pode oferecer suporte à comunicação bidirecional entre clientes. Os clientes podem receber mensagens sem precisar pesquisar atualizações.
Este tutorial leva aproximadamente 30 minutos para ser concluído. Primeiro, você usará um modelo de AWS CloudFormation para criar funções do Lambda que lidarão com solicitações de API, bem como uma tabela do DynamoDB que armazena suas IDs de cliente. Depois, você usará o console do API Gateway para criar uma API WebSocket que se integrará às suas funções do Lambda. Por fim, você testará sua API para verificar se as mensagens foram enviadas e recebidas.
Para concluir esse tutorial, você precisa de uma conta da AWS e de um usuário do AWS Identity and Access Management com acesso ao console. Para ter mais informações, consulte Configurar para usar o API Gateway.
Você também precisa que o wscat
se conecte à sua API. Para ter mais informações, consulte Use wscat para se conectar a uma API do WebSocket e enviar mensagens a ela.
Tópicos
Etapa 1: Criar funções do Lambda e uma tabela do DynamoDB
Baixe e descompacte o modelo de criação de aplicativos para AWS CloudFormation. Você usará esse modelo para criar uma tabela do Amazon DynamoDB para armazenar as IDs de cliente do aplicativo. Cada cliente conectado tem uma ID exclusiva que usaremos como chave de partição da tabela. Este modelo também cria funções do Lambda que atualizam suas conexões de cliente no DynamoDB e lidam com o envio de mensagens para clientes conectados.
Como criar uma pilha do AWS CloudFormation
Abra o console do AWS CloudFormation em https://console.aws.amazon.com/cloudformation
. -
Selecione Create stack (Criar pilha) e With new resources (standard) (Com novos recursos (padrão)).
-
Em Specify template (Especificar modelo), escolha Upload a template file (Fazer upload de um arquivo de modelo).
-
Selecione o modelo que você baixou.
-
Escolha Next (Próximo).
-
Em Nome da pilha, insira
websocket-api-chat-app-tutorial
e escolha Avançar. -
Para Configurar opções de pilha, escolha Avançar.
-
Para Capabilities (Recursos), reconheça que AWS CloudFormation pode criar recursos do IAM em sua conta.
-
Selecione Enviar.
O AWS CloudFormation fornece os recursos especificados no modelo. Pode demorar alguns minutos para concluir o provisionamento de seus recursos. Quando o status da sua pilha do AWS CloudFormation for CREATE_COMPLETE, você estará pronto para passar para a próxima etapa.
Etapa 2: Criar uma API WebSocket
Você criará uma API WebSocket para lidar com conexões de clientes e rotear solicitações para as funções do Lambda que criou na Etapa 1.
Como criar uma API WebSocket
Inicie uma sessão no console do API Gateway em https://console.aws.amazon.com/apigateway
. -
Selecione Create API (Criar API). Depois, em WebSocket API (API WebSocket), escolha Build (Criar).
-
Em API name (Nome da API), insira
websocket-chat-app-tutorial
. -
Em Route selection expression (Expressão de seleção de rota), insira
request.body.action
. A expressão de seleção de rota determina qual rota o API Gateway invoca quando um cliente envia uma mensagem. -
Escolha Next (Próximo).
-
Em Predefined routes (Rotas predefinidas), escolha Add $connect (Adicionar $connect), Add $disconnect (Adicionar $disconnect) e Add $default (Adicionar $default). As rotas $connect e $disconnect são rotas especiais que o API Gateway invoca automaticamente quando um cliente se conecta ou se desconecta de uma API. O API Gateway invoca a rota
$default
quando nenhuma outra rota corresponde a uma solicitação. -
Em Custom routes (Rotas personalizadas), escolha Add custom route (Adicionar rota personalizada). Em Route key (Chave de rota), insira
sendmessage
. Essa rota personalizada lida com mensagens enviadas para clientes conectados. -
Escolha Next (Próximo).
-
Em Attach integrations (Anexar integrações), para cada rota e Integration type (Tipo de integração), escolha Lambda.
Em Lambda, escolha a função do Lambda correspondente que você criou com o AWS CloudFormation na Etapa 1. O nome de cada função corresponde a uma rota. Por exemplo, para a rota $connect, escolha a função chamada
websocket-chat-app-tutorial-ConnectHandler
. -
Revise o estágio criado pelo API Gateway para você. Por padrão, o API Gateway cria um nome de estágio
production
e implanta automaticamente sua API nesse estágio. Escolha Next (Próximo). -
Selecione Create and deploy (Criar e implantar).
Etapa 3: testar sua API
Depois, você testará sua API para verificar se ela está funcionando corretamente. Use o comando wscat
para se conectar à API.
Como obter a URL para invocar a sua API
Inicie uma sessão no console do API Gateway em https://console.aws.amazon.com/apigateway
. -
Selecione a API.
-
Escolha Stages (Estágios) e, depois, production (produção).
-
Observe o URL WebSocket da API. O URL deve ser semelhante a
wss://
.abcdef123
.execute-api.us-east-2
.amazonaws.com/production
Como se conectar à sua API
-
Use o comando a seguir para se conectar à sua API. Quando você se conecta à API, o API Gateway invoca a rota
$connect
. Quando essa rota é invocada, ela chama uma função do Lambda que armazena seu ID de conexão no DynamoDB.wscat -c wss://
abcdef123
.execute-api.us-west-2
.amazonaws.com/productionConnected (press CTRL+C to quit)
-
Abra um novo terminal e execute o comando wscat novamente com os parâmetros a seguir.
wscat -c wss://
abcdef123
.execute-api.us-west-2
.amazonaws.com/productionConnected (press CTRL+C to quit)
Isso fornece dois clientes conectados que podem trocar mensagens.
Para enviar uma mensagem
-
O API Gateway determina qual rota invocar com base na expressão de seleção de rotas da API. A expressão de seleção de rotas da sua API é
$request.body.action
. Como resultado, o API Gateway invoca a rotasendmessage
quando você envia a seguinte mensagem:{"action": "sendmessage", "message": "hello, everyone!"}
A função do Lambda associada à rota invocada coleta os IDs do cliente do DynamoDB. Depois, a função chama a API de gerenciamento do API Gateway e envia a mensagem para esses clientes. Todos os clientes conectados recebem a seguinte mensagem:
< hello, everyone!
Como invocar a rota $default da API
-
O API Gateway invocará a rota padrão da API quando um cliente envia uma mensagem que não corresponde às rotas definidas. A função do Lambda associada à rota
$default
usa a API de gerenciamento do API Gateway para enviar informações do cliente sobre sua conexão.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 se desconectar de sua API
-
Pressione
CTRL+C
para se desconectar de sua API. Quando um cliente se desconecta da sua API, o API Gateway invoca a rota$disconnect
de sua API. A integração do Lambda para a rota$disconnect
de sua API remove o ID da conexão do DynamoDB.
Etapa 4: limpar
Para evitar custos desnecessários, exclua os recursos que você criou como parte desse tutorial. As etapas a seguir excluem a API WebSocket e sua pilha do AWS CloudFormation.
Como excluir uma API WebSocket
Inicie uma sessão no console do API Gateway em https://console.aws.amazon.com/apigateway
. -
Na página APIs, selecione sua API do
websocket-chat-app-tutorial
. Escolha Ações, escolha Excluir e, em seguida, confirme sua escolha.
Para excluir uma pilha do AWS CloudFormation
Abra o console do AWS CloudFormation em https://console.aws.amazon.com/cloudformation
. -
Selecione sua pilha do AWS CloudFormation.
-
Escolha Excluir e, em seguida, confirme sua escolha.
Próximas etapas: Automatize com AWS CloudFormation
Você pode automatizar a criação e a limpeza de todos os recursos da AWS envolvidos neste tutorial. Para ver um modelo do AWS CloudFormation que crie essa API e todos os recursos relacionados, consulte ws-chat-app.yaml.