Table of contents
Hasta el momento, a lo largo de esta serie, hemos utilizado una sola Lambda. A medida que nuestro sistema se hace mas grande y va tomando complejidad vamos a querer separar responsabilidades y desacoplar el funcionamiento.
Desde que se han popularizado los micro servicios y las arquitecturas orientadas a eventos, los sistemas de colas, gestión de mensajes ó colas de eventos, acompañan a la evolución de estos paradigmas. En el ecosistema de AWS una de las herramientas que nos permite este desacople son las colas SQS.
Que es SQS? Simple Queue Service , por sus siglas en ingles, es un sistema de colas de mensajería completamente administrado por AWS, ha y es serveless …
Para dar un dar un vistazo de como podemos utilizarlo, sigamos con el ejemplo de nuestra librería tesserat, en entradas anteriores integramos tesserat dentro de la lambda para realizar un OCR sobre una imagen que le pasamos como referencia y al procesar esta imagen, el resultado es dejado en un log de CloudWatch. EL siguiente paso será , dejar este mensaje en una cola SQS y que este mensaje dispare un evento que disparare una lambda de "clasificación" que tomara este mensaje y realizara una acción.
A continuación un diagrama de la solución propuesta:
Para esta prueba trabajamos en la siguiente rama feature/add-sqs.
Primero creamos la cola SQS agregando al serverless.yml:
resources:
Resources:
ProcessText:
Type: AWS::SQS::Queue
Properties:
QueueName: ${opt:stage}-process-text
Publicamos el proyecto con los cambios, para que se cree el SQS en el entorno de dev de nuestra cuenta de AWS.
AWS_PROFILE=olcortesb sls deploy --stage dev
Verificamos que se la SQS este creado utilizando AWS-CLI
aws sqs list-queues --region us-east-1
La respuesta al comando que lista las SQS en una region, tendrá una salida como esta:
{
"QueueUrls": [
"https://sqs.us-east-1.amazonaws.com/XXXXXXXXXXXX/dev-process-text"
]
}
en la misma lambda Hello necesitamos escribir el mensaje resultado del procesamiento del ORC esto lo realizamos con la siguiente Linea. (Linea 45 archivos handler.js)
await sqsClient.send(new SendMessageCommand(params));
Para poder escribir el mensaje en la SQS necesitamos agregar el cliente de AWS al pakage.json.
npm install @aws-sdk/client-sqs
Ahora la segunda parte, en el mismo serverless.yml vamos a crear una nueva lambda(Listen), esta Lambda tendrá como entrada un evento.
listen:
handler: handler.listen
events:
- sqs:
arn:
Fn::GetAtt:
- ProcessText
- Arn
Agregamos un código simple que lea el mensaje y lo escriba en la consola pero ahora de manera asíncrona desde la lambda listen
module.exports.listen = async (event)=>{
event.Records.forEach(record => {
const { body } = record;
console.log(body);
});
return {};
}
Ahora solo nos queda invocar la lambda hello y esperar que se envíe el mensaje a la SQS y a su ves la lambda listen capture el mensaje y lo escriba en el CloudWatch.
Nota: Revisar el serverless.yml para verificar las variables de entorno necesarias ...
Cualquier dudas o comentarios:
Oscar Cortes