AWS lambda 101 - Parte 2

AWS lambda 101 - Parte 2

¿Qué es AWS Lambda en la practica?

AWS lambda 101 - Parte 2

En la entrada anterior AWS Lambda 101 - Parte 1 realizamos una configuración completa de un ambiente de desarrollo(AWS, Serverless), ahora que tenemos todo configurado, nos centramos en la pregunta ¿Qué es AWS Lambda en la practica?

Entrada, procesamiento y salida sigue siendo el modelo sobre el que se ha construido la gestión de la información desde los orígenes de las ciencias de la computación; sin embargo, ¿Qué pasa si pensamos en individualizar al mínimo posible las unidades de procesamiento que tenemos en una pieza de software?

Al intentar responder esta pregunta, llegaremos rápidamente a que en la mayoría de los paradigmas de programación la unidad minina de procesamiento(lógico) que podemos tener es aislar una función/método; si logramos que cada función/método con una responsabilidad definida, pueda ser aislado en una unidad de computo en base Cloud y "sin servidor", con su propio ciclo de vida desde el proceso de desarrollo: test, deploy, fix, deploy, ... ese elemento aislado con una entrada, una responsabilidad(procesamiento) y una salida, es una AWS lambda, Google Cloud Functions o Azure functions dependiendo del vendor(y existen mas) ...

Con esta aparente simple definición de lo que es una Lambda y para realizar nuestras primeras pruebas acotemos al vendor AWS, AWS Lambda function, y realicemos algunas pruebas de como funciona esto.

Problematica:

Supongamos que necesitamos realizar OCR(Optical Character Recognition) sobre una imagen con texto, la librería mas usada para este propósito es Tesseract

EL objetivo es integrar esta librería en una lambda y realizar una demo con el código que propone la librería en su repositorio de Github, esto para validar que es posible la implementación, en posteriores artículos afinaremos esta implementación mientras navegamos mas recursos del mundo Serverless.

Como aquí nos gusta el código sobre toda las cosas, en el siguiente repositorio

esta el código y la configuración que nos permite realizar un deploy de una lambda con el tesseract configurado.

Revisemos las partes mas importantes del repositorio:

EL serverless.yml

En la configuración lo mas importante y a lo que se llega después de varias pruebas es a la configuración del time-out y del uso de memoria por parte de la lambda, dos de variables mas importantes de ajustes que tienen valores por defecto y tendremos que ir ajustando a la medida de nuestras necesidades.

functions:
  hello:
    handler: handler.hello
    memorySize: 3008
    timeout: 500

La entrada:

Para la demo la entrada es una imagen de prueba que esta configurada en la url que se pasa al worker mediante el código, los invitamos a cambiar la url por otra y revisar el resultado

  const { data: { text } } = await worker.recognize('https://tesseract.projectnaptha.com/img/eng_bw.png');

Procesamiento:

El procesamiento lo realiza el core de la librería Tesseract

async function run(worker) {
  await worker.load();
  await worker.loadLanguage('eng');
  await worker.initialize('eng');
  const { data: { text } } = await worker.recognize('https://tesseract.projectnaptha.com/img/eng_bw.png');
  console.log(text);
  await worker.terminate();  
  return text;
}

Salida:

Una ves invocar la función lambda desde aws cli tendríamos la siguiente respuesta:

# Invocar la funcion
aws lambda invoke --function-name serverless-aws-ocr-tesseract-demo-dev-hello  --region us-east-1 \
out --log-type \
Tail --query 'LogResult' --output text |  base64 -d

# Respuesta
START RequestId: 9c400d64-6ed4-402a-a977-87479f801f2a Version: $LATEST
2022-09-01T21:55:58.295Z    9c400d64-6ed4-402a-a977-87479f801f2a    INFO    Mild Splendour of the various-vested Night!
Mother of wildly-working visions! haill
I watch thy gliding, while with watery light
Thy weak eye glimmers through a fleecy veil;
And when thou lovest thy pale orb to shroud
Behind the gather’d blackness lost on high;
And when thou dartest from the wind-rent cloud
Thy placid lightning o’er the awaken’d sky.

END RequestId: 9c400d64-6ed4-402a-a977-87479f801f2a
REPORT RequestId: 9c400d64-6ed4-402a-a977-87479f801f2a    Duration: 6348.00 ms    Billed Duration: 6348 ms    Memory Size: 3008 MB    Max Memory Used: 326 MB    Init Duration: 228.51 ms

Este texto es el que se obtiene al realizar el OCR con la librería Tesseract de la imagen que se paso como entrada(https://tesseract.projectnaptha.com/img/eng_bw.png)

Conclusiones

Hemos configurado una librería de OCR dentro de una AWS lambda, hemos ajustado los parámetros de time-out y memoria para que la lambda pueda ejecutarse correctamente y validamos la salida de la demo que propone; como siguientes pasos los invitamos a modificar los valores de time out y memoria disminuyendo y observando el comportamiento de la lambda al igual que modificar la imagen que se le pasa por referencia como entrada y revisar los resultados.

Oscar Cortes