con AWS Step Functions y Amazon SQS
Nivel: intermedio
Duración: 10 minutos
En este tutorial, aprenderá a utilizar AWS Step Functions y Amazon SQS para diseñar y ejecutar un flujo de trabajo sin servidor que organice un microservicio basado en colas de mensajes. Step Functions es un servicio de organización sin servidor que le permite coordinar con facilidad múltiples servicios de AWS en flujos de trabajo flexibles que sean fáciles de depurar y de cambiar. Amazon SQS es el servicio de AWS que permite a los componentes de las aplicaciones comunicarse en la nube.
Este tutorial simulará las solicitudes de verificación de inventarios provenientes de los pedidos entrantes de una aplicación de comercio electrónico como parte de un flujo de trabajo de procesamiento de pedidos. Step Functions enviará solicitudes de verificación de inventarios a una cola de SQS. Una función de AWS Lambda actuará como su microservicio de inventario que utiliza una cola para almacenar solicitudes. Cuando recupere una solicitud, verificará el inventario y, luego, devolverá el resultado a Step Functions. Cuando una tarea de Step Functions se configura de este modo, se denomina una tarea con un patrón de devolución de llamada. Los patrones de devolución de llamada le permiten integrar tareas asíncronas en su flujo de trabajo, tal como el microservicio de verificación de inventarios de este tutorial.

Es necesario contar con una cuenta de AWS para realizar este tutorial
Cree una cuenta gratuitaNo hay cargos adicionales para AWS Step Functions o Amazon SQS. Los recursos creados con el tutorial se pueden utilizar dentro de la capa gratuita.
a. Abra la consola de administración de AWS para poder mantener abierta esta guía paso a paso. Cuando la pantalla se cargue, escriba su nombre de usuario y contraseña para comenzar. En el cuadro de texto de búsqueda, escriba SQS y seleccione Simple Queue Service para abrir la consola del servicio.
En este paso, creará y configurará una cola de Amazon SQS. Una cola es un búfer alojado, fiable y altamente escalable que almacena los mensajes mientras viajan entre aplicaciones distribuidas o microservicios. Las colas ayudan a desacoplar las aplicaciones, conectar los microservicios, procesar las tareas o almacenar las notificaciones.
Nuestro caso de uso para SQS de este tutorial simulará el almacenamiento de las solicitudes de verificación de inventarios provenientes de los pedidos entrantes de una aplicación de comercio electrónico.
El próximo paso es diseñar un flujo de trabajo que describa cómo desea que se procesen los pedidos de comercio electrónico. Los flujos de trabajo describen un proceso como una serie de tareas específicas que se pueden repetir una y otra vez.
Podrá diseñar el flujo de trabajo en AWS Step Functions. Su flujo de trabajo solicitará la verificación del inventario desde un microservicio. Muchos microservicios utilizan una cola para recibir las solicitudes. En este tutorial, utilizará una función de AWS Lambda para representar el microservicio.
a. Abra la consola de AWS Step Functions. Seleccione Crear con fragmentos de código y, luego, asigne el nombre InventoryStateMachine a su máquina de estado.
b. Sustituya el contenido de la ventana de definición de la máquina de estado con la definición de la máquina de estado del lenguaje de estados de Amazon (ASL) que se encuentra a continuación. El lenguaje de estados de Amazon es un lenguaje estructurado basado en JSON que se utiliza para definir su máquina de estado.
Esta máquina de estado utiliza un estado Task para colocar mensajes en una cola de SQS. Este estado Task se configura para un patrón de devolución de llamada. Cuando agregue.waitForTaskToken a su recurso, Step Functions agregará un token de Task a la carga JSON y esperará por una devolución de llamada. El microservicio puede devolver un resultado a Step Functions llamando a la API de Step Functions.
{ "Comment": "An example of the Amazon States Language for starting a callback task.", "StartAt": "Check Inventory", "States": { "Check Inventory": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken", "Parameters": { "QueueUrl": "<INSERT SQS QUEUE URL HERE>", "MessageBody": { "MessageTitle": "Callback Task started by Step Functions", "TaskToken.$": "$$.Task.Token" } }, "Next": "Notify Success", "Catch": [ { "ErrorEquals": [ "States.ALL" ], "Next": "Notify Failure" } ] }, "Notify Success": { "Type": "Pass", "Result": "Callback Task started by Step Functions succeeded", "End": true }, "Notify Failure": { "Type": "Pass", "Result": "Callback Task started by Step Functions failed", "End": true } } }
d. Haga clic en el botón Actualizar para que Step Functions traduzca la definición de la máquina de estado del ASL en un flujo de trabajo visual. Puede verificar con facilidad que el proceso se haya descrito correctamente revisando el flujo de trabajo visual. Cuando el microservicio regrese un resultado, la máquina de estado avanzará por la ramificación correcta. Si algo sale mal, puede detectar la excepción y volver a la ramificación correcta para tomar acciones correctivas.
Haga clic en Siguiente.
e. A continuación, agregará un rol de IAM a su flujo de trabajo. Seleccione Crear un rol de IAM para mí y nómbrelo inventory-state-machine-role. Step Functions analizará su flujo de trabajo y generará una política de IAM que incluya los recursos que utilice su flujo de trabajo. Haga clic en Crear máquina de estado. Verá un cartel verde que indique que la máquina de estado se creó correctamente.
AWS IAM es un servicio web que lo ayuda a controlar el acceso a los recursos de AWS de forma segura. En este paso, creará un rol de IAM que permita que Step Functions acceda a SQS.
a. En otra ventana del navegador, abra la consola de administración de AWS. Cuando se haya cargado la pantalla, escriba IAM en la barra de búsqueda y, luego, seleccione IAM para abrir la consola del servicio.
En este paso, creará una función de Lambda que imitará un microservicio de inventario. La función de Lambda recuperará los mensajes desde SQS y enviará un mensaje a Step Functions que represente el resultado de la solicitud.
c. Deje seleccionado Crear desde cero. Luego, configure su primera función de Lambda de la siguiente manera:
En Nombre, escriba Inventario.
En Tiempo de ejecución, elija Node.js 8.10.
En Rol, seleccione Usar un rol existente.
Elija el rol inventory-lambda-role de la lista.
Haga clic en Crear función.
d. Remplace el contenido de la ventana Código de la función por el siguiente código y, luego, haga clic en Guardar.
console.log('Loading function'); const aws = require('aws-sdk'); exports.handler = (event, context, callback) => { const stepfunctions = new aws.StepFunctions(); for (const record of event.Records) { const messageBody = JSON.parse(record.body); const taskToken = messageBody.TaskToken; const params = { output: "\"Callback task completed successfully.\"", taskToken: taskToken }; console.log(`Calling Step Functions to complete callback task with params ${JSON.stringify(params)}`); stepfunctions.sendTaskSuccess(params, (err, data) => { if (err) { console.error(err.message); callback(err.message); return; } console.log(data); callback(null); }); } };
El flujo de trabajo sin servidor ya está listo para ejecutarse. La ejecución de máquina de estado es una instancia de su flujo de trabajo que tiene lugar cada vez que una máquina de estado de Step Functions se ejecuta y realiza sus tareas. Cada máquina de estado de Step Functions puede tener múltiples ejecuciones simultáneas, que puede iniciar desde la consola de Step Functions (que es lo que hará a continuación) o por medio de los SDK de AWS, las acciones de la API de Step Functions o la CLI de AWS. Las ejecuciones reciben contenido de entrada en JSON y producen contenido de salida también en JSON.
e. A medida que se ejecute su flujo de trabajo, cada paso en el panel Flujo de trabajo visual cambiará de color. Espere unos segundos a que termine la ejecución. Luego, en el panel Detalles de la ejecución, haga clic en Entrada y Salida para ver las entradas y los resultados del flujo de trabajo.
f. Step Functions le permite inspeccionar cada paso de la ejecución de su flujo de trabajo, como las entradas y las salidas de cada estado. Haga clic en cada tarea de su flujo de trabajo y amplíe los campos Entrada y Salida que se encuentran en Detalles del paso. Se puede observar que la carga de entrada que ingresó a su máquina de estado avanza de un paso al siguiente y que la carga se actualiza a medida que cada paso se completa.
h. En función del resultado de InventoryStateMachine, el flujo de trabajo puede haber finalizado correctamente o con errores.
En una situación real, es posible que tuviese que decidir entre volver a probar la tarea o realizar otras acciones, en función del mensaje de error que recibió.
En este paso, terminará los recursos relacionados con AWS Step Functions y AWS Lambda.
Importante: Terminar los recursos que no se están utilizando de forma activa reduce los costos y es una práctica recomendada. No terminar los recursos puede conllevar cargos.
b. En la ventana Máquinas de estado, haga clic en InventoryStateMachine y seleccione Eliminar. Confirme la acción seleccionando Eliminar máquina de estado en el cuadro de diálogo. Su máquina de estado se eliminará en uno o dos minutos una vez que Step Functions haya confirmado que se han completado las ejecuciones en proceso.
Organizó un microservicio en la nube con una cola de mensajes con AWS Step Functions y Amazon SQS. Step Functions se adapta perfectamente cuando necesita coordinar los recursos de aplicaciones en los que la productividad y la agilidad son consideraciones clave.
Ahora que ha aprendido a organizar microservicios basados en colas, puede avanzar al próximo tutorial, en el cual aprenderá a usar Step Functions para manejar los errores. Creará una máquina de estado que contenga los campos Retry y Catch que respondan a códigos de respuesta que provengan de una API simulada con base en el tipo de mensaje de error, método que se denomina manejo de errores de funciones.
Más información
Ampliar conocimientos
Explorar AWS Step Functions