SQS 101: Separando el problema en partes

SQS 101: Separando el problema en partes

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:

image.png

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

Referencias