Uso de Amazon Simple Queue Service para invocar una función Lambda en LocalStack
Podemos utilizar una función de AWS Lambda para procesar mensajes en una cola de Amazon Simple Queue Service (Amazon SQS). Las asignaciones de orígenes de eventos de Lambda admiten colas estándar y colas FIFO (primero en entrar, primero en salir). Con Amazon SQS, podemos descargar tareas de un componente de su aplicación enviándolas a una cola y procesándolas de forma asíncrona.
Lambda sondea la cola e invoca nuestra función Lambda sincrónicamente con un evento que contiene mensajes de la cola. Lambda lee mensajes en lotes e invoca nuestra función una vez para cada lote. Cuando nuestra función procesa correctamente un lote, Lambda elimina sus mensajes de la cola.
LocalStack proporciona una forma sencilla de desarrollar aplicaciones en la nube de AWS directamente desde nuestro host local. Activa un entorno de prueba en nuestra máquina local que proporciona casi la misma funcionalidad de paridad y API que el entorno de nube de AWS real.
Empecemos
Debemos tener Docker instalado en nuestro sistema.
Docker-Compose.YML
version: '2.1'services: localstack: container_name: "localstack-image" image: localstack/localstack-full network_mode: bridge ports: - "4566:4566" - "4571:4571" - "8082:8082" environment: - USE_LIGHT_IMAGE=0 - DEBUG=1 - PORT_WEB_UI=8082 - LAMBDA_EXECUTOR=local - DOCKER_HOST=unix:///var/run/docker.sock - HOST_TMP_FOLDER=${TMPDIR} - START_WEB=1 volumes: - "${TMPDIR:-/tmp/localstack}:/tmp/localstack" - "/var/run/docker.sock:/var/run/docker.sock"
Ejecute el siguiente comando:
docker-compose up
Veremos que el contenedor LocalStack se está ejecutando correctamente.
Crear el rol de ejecución
Una política basada en recursos de IAM controla los permisos para invocar la función.
aws iam create-role --role-name lambda-ex --assume-role-policy-document "{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}" --endpoint-url http://localhost:4566
Crear la política de IAM
La política de IAM define los permisos para la función de Lambda.
aws iam create-policy --policy-name my-policy --policy-document file://policy.txt --endpoint-url http://localhost:4566
Adjuntar la política de IAM a un rol de IAM
Un rol de ejecución de IAM define los permisos que controlan lo que la función puede hacer cuando interactúa con otros servicios de AWS.
aws iam attach-role-policy --policy-arn arn:aws:iam::000000000000:policy/my-policy --role-name lambda-ex --endpoint-url http://localhost:4566
Crear el código de función
Copie el siguiente código de ejemplo en un archivo denominado Handler.java
.
Crear el paquete de implementación
El paquete de implementación es un archivo comprimido .zip que contiene su código de función de Lambda y sus dependencias.
Ejecute el siguiente comando:
mvn package
Crear la función Lambda
El comando create-function especifica el controlador de función como example.handler
. La función puede usar el formato de controlador abreviado de package.Class
porque la función implementa una interfaz de controlador.
aws lambda create-function --function-name my-math-function --zip-file fileb://blank-java-1.0-SNAPSHOT.jar --handler example.Handler::handleRequest --runtime java8 --role arn:aws:iam::000000000000:role/lambda-ex --endpoint-url http://localhost:4566
Crear una cola de Amazon SQS
Cree una cola de Amazon SQS que la función Lambda pueda utilizar como origen de eventos.
aws sqs create-queue --queue-name MyQueue --endpoint-url http://localhost:4566
Después de crear la cola, registre su nombre de recurso de Amazon (ARN). Necesitará esto en el próximo paso cuando asocie la cola con su función de Lambda.
aws sqs get-queue-attributes --queue-url http://localhost:4566/000000000000/MyQueue --attribute-names All --endpoint-url http://localhost:4566
Configurar el origen del evento
Para crear una asignación entre su cola de Amazon SQS y su función de Lambda, ejecute el siguiente comando de la CLI de AWS create-event-source-mapping.
aws lambda create-event-source-mapping --function-name my-math-function --batch-size 5 --maximum-batching-window-in-seconds 60 --event-source-arn arn:aws:sqs:us-east-1:000000000000:MyQueue --endpoint-url http://localhost:4566
Probar la configuración
aws sqs send-message --queue-url http://localhost:4566/000000000000/MyQueue --message-body "Successfull!!" --endpoint-url http://localhost:4566
Lambda sondea la cola en busca de actualizaciones. Cuando hay un mensaje nuevo, Lambda invoca su función con estos nuevos datos de eventos de la cola.
¡Felicidades!
Ahora tiene un Amazon SQS configurado correctamente para publicar eventos y activar Lambda. ¡Es hora de ponerlo en uso!