An Interest In:
Web News this Week
- April 19, 2024
- April 18, 2024
- April 17, 2024
- April 16, 2024
- April 15, 2024
- April 14, 2024
- April 13, 2024
WebSockets con Api Gateway
Alguna vez has querido que tu app hable con tus usuarios en tiempo real, como por arte de magia? Pues bien, hoy es tu da de suerte! En este post vamos a meternos de lleno en cmo darle sper poderes a tus proyectos usando WebSockets con AWS. Vamos a usar dos herramientas muy conocidas dentro del Cloud de AWS: API Gateway y Lambda. Te voy a llevar paso a paso para que crees tu propio websocket en menos de 10 minutos.
Crear el proyecto con cdk
Vamos a crear el proyecto con cdk y vamos a implementarlo con python, para ello vamos a crear nuestro directorio del proyecto y crearemos el proyecto con cdk
mkdir websocket-poccd websocket-poccdk init app --language python
Ahora activamos el entorno virtual
source .venv/bin/activate
Y por ltimo instalamos las dependencias necesarias:
pip install -r requirements.txt
Este sera el contenido de nuestro requirements.txt
aws-cdk-lib==2.114.1constructs>=10.0.0,<11.0.0
Creacin de lambda
Usaremos una lambda para enviar un mensaje a travs de nuestro websocket, para ello en nuestro proyecto cdk, y dentro de nuestro stack creamos la lambda con el siguiente cdigo:
lambda_function = lambda_.Function( self, 'WebSocketHandler', runtime=lambda_.Runtime.PYTHON_3_8, handler='ws_function.handler', code=lambda_.Code.from_asset('./lambda'), timeout=core.Duration.seconds(10) )lambda_function.add_to_role_policy(iam.PolicyStatement( actions=["execute-api:ManageConnections"], resources=["arn:aws:execute-api:REGION:ACCOUNT-ID:API-ID/STAGE-NAME/*"], effect=iam.Effect.ALLOW ))
execute-api:ManageConnections permite a funciones autorizadas gestionar conexiones de clientes en API Gateway WebSockets.
Y este sera el cdigo de la lambda, bastante sencillo, simplemente recibimos los parmetros de conexin y la url del websocket, esto podra ser fijo, pero en caso que tengamos mas de un websocket podramos re-utilzar el cdigo de la lambda, y por ltimo, enviamos el mensaje "Hello, WebSocket!"
import boto3def handler(event, context): connection_id = event['requestContext']['connectionId'] gatewayapi = boto3.client("apigatewaymanagementapi", endpoint_url = "https://" + event["requestContext"]["domainName"] + "/" + event["requestContext"]["stage"]) post_data = "Hello, WebSocket!" gatewayapi.post_to_connection(ConnectionId=connection_id, Data=post_data.encode('utf-8')) return { 'statusCode': 200, 'body': 'Message sent' }
Creacin de la API
Ahora vamos a crear nuestra API que permitir el envo de mensajes por websocket.
api = apigw.WebSocketApi(self, "WebsocketApi")
Luego creamos un stage dentro de nuestra api:
stage = apigw.WebSocketStage( self, 'DevStage', web_socket_api=api, stage_name='dev', auto_deploy=True )
Y por ltimo aadimos una ruta especfica (sendMessage" al websocket de la api y lo vinculamos a la funcin lambda que hemos creado previamente.
api.add_route("sendMessage", integration=WebSocketLambdaIntegration("SendMessageIntegration", lambda_function))
Outputs
Necesitamos conocer la url de nuestro websocket para poder establecer una comunicacin con el, por lo que hacemos que nos la muestre en el terminal cuando complete el despliegue de la api
core.CfnOutput(self, "WebSocketURL", value=stage.url)
WebScocket client
Ahora vamos a usar una herramienta para simular nuestro cliente de websocket, podramos crear una web o una app para probarlo, pero esta herramienta nos permite probar nuestro websocket mucho mas rpido y de una forma mas sencilla.
La herramienta es websocketking (https://websocketking.com/) y es muy fcil de usar.
Lo primero que debemos hacer es aadir la url de nuestro websocket que nos ha devuelto el deploy de nuestro proyecto cdk. En nuestro caso sera wss://kiyi70kcll.execute-api.eu-west-1.amazonaws.com/dev
y le damos a conectar
una vez conectados enviaremos un mensaje (puede estar vacio),simplemente es la forma mas sencilla de conocer nuestro connectionId que lo necesitaremos luego en el test de la lambda para poder enviar un mensaje a travs del websocket.
{ "message": "Forbidden", "connectionId": "WbqM9csoDoECF9w=", "requestId": "WbqUVE-OjoEFwjw="}
ahora copiamos nuestro connectionId y creamos un test en la lambda
y ahora enviaremos un mensaje a nuestro websocket con este JSON
{ "requestContext": { "connectionId": "WbqM9csoDoECF9w=", "domainName": "kiyi70kcll.execute-api.eu-west-1.amazonaws.com", "stage": "dev" }}
donde tenemos:
connectionId: obtenido previamente
domainName: url de nuestro websocket
stage: stage de nuestra api
y realizamos nuestro test ....
comprobamos que nuestra lambda se ha ejecutado correctamente
y comprobamos nuestra aplicacin cliente de websocket
Como se puede comprobar en la imagen, nuestra comunicacin a travs de websocket a funcionado perfectamente :)
Precios
Ahora viene el dato delicado, si, muy bonito, pero cuanto me va a costar. Ya sabemos que el coste en AWS (y en el resto de Clouds) es de pago por uso, por lo que antes de implementar te aconsejo que vayas a la web de AWS para consultar los precios:
O bien tambin puedes ir a la calculadora de AWS y calcularlo en funcin de tus mtricas
Te pongo un ejemplo de costes calculados con la calculadora:
- 800 Messages/minutes
- 80 (kb) Average message size
- 20 (seconds) Average connection duration)
- 300 Average connection rate / minute
Y esto hace un total de 121,11 UDS / Mes
Cabe destacar que existe una capa gratuita los 12 primeros meses:
En el caso de las API WebSocket, la capa gratuita de API Gateway incluye un milln de mensajes (enviados o recibidos) y 750 000 minutos de conexin durante un mximo de doce meses.
Dependiendo de cada proyecto puede compensar o no pagar este tipo de soluciones frente a otras que necesiten mas desarrollo.
Github
El proyecto lo podis encontrar en mi repositorio de Github
Original Link: https://dev.to/aws-espanol/websockets-con-api-gateway-2329
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To