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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-diagram

Es necesario contar con una cuenta de AWS para realizar este tutorial

Cree una cuenta gratuita

No hay cargos adicionales para AWS Step Functions o Amazon SQS. Los recursos creados con el tutorial se pueden utilizar dentro de la capa gratuita.

Consulte los detalles de la capa gratuita de AWS »

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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1a

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1a

b. Si se muestra la página de inicio de la consola de SQS, como se muestra en la captura de pantalla, haga clic en Comenzar ahora. Si no aparece esta página, continúe con el siguiente paso.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1b

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1b

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.


a. En primer lugar, crearemos una cola simple que almacene los pedidos realizados en la tienda. Escriba Pedidos en el campo Nombre de la cola.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2a

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2a

b. Para este tutorial, no se requiere una ordenación estricta, por lo que no realizaremos ningún cambio en el tipo de cola. Deje la cola estándar seleccionada.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2b

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2b

c. Puede configurar su cola para modificar la configuración, como el periodo de retención, el tamaño máximo de mensaje y demoras en entregas. Para este tutorial, mantendremos los parámetros predeterminados. Seleccione Creación rápida de cola.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2c

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2c

d. La nueva cola está creada y seleccionada en la lista de colas.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2d

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2d

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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3c

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3c

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
    }
  }
}
tmt-orchestrate-microservices-with-message-queues-on-step-functions-3d

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3d

c. Copie la URL de su cola de SQS desde la consola de SQS y péguela en la definición de la máquina de estado.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3e

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3e

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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3f

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3f

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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3g

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3g

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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4a

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4a

b. Haga clic en Roles y, luego, en Crear rol.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4b

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4b

c. En la pantalla Crear rol, deje seleccionado Servicio de AWS, seleccione Lambda y, luego, haga clic en Siguiente: Permisos.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4c

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4c

d. En la pantalla Crear rol, asocie
las políticas AmazonSQSFullAccess y AWSStepFunctionsFullAccess. Haga clic en Siguiente: Etiquetas y, luego, en Siguiente: Revisión.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4d

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4d

e. Escriba inventory-lambda-role como nombre del rol y haga clic en Crear rol.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4e

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4e

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.


a. Haga clic en Servicios, escriba Lambda en la barra de búsqueda y, luego, seleccione Lambda para abrir la consola del servicio.

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5a

b. Seleccione Crear función.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5b

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5b

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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5c

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5c

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);
                  });
              }
          };
tmt-orchestrate-microservices-with-message-queues-on-step-functions-5d

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5d

e. Seleccione el desencadenador de SQS. Defina el desencadenador en Activar para la cola Pedidos. Haga clic en Agregar y, luego, en Guardar.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5e

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5e

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.


a. Haga clic en Servicios, escriba Step en la barra de búsqueda y seleccione Step Functions para abrir la consola del servicio.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6a

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6a

b. En la pantalla Máquinas de estado, haga clic en InventoryStateMachine.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6b

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6b

c. Haga clic en Iniciar ejecución.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6c

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6c

d. Aparecerá un nuevo cuadro de diálogo de ejecución, donde puede ingresar la entrada para su máquina de estado. Esta máquina de estado no depende de la entrada. Puede usar los valores de entrada predeterminados. Haga clic en Iniciar ejecución.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6d

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6d

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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6e

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6e

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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6f

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6f

g. Desplácese hacia abajo hasta la sección Historial de eventos de ejecución. Haga clic en cada paso de la ejecución para ver cómo Step Functions realizó llamadas a SQS y envió las cargas entre los pasos.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6g

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6g

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ó.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6h

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6h

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.


a. En la parte superior de la ventana de la consola de AWS Step Functions, haga clic en Máquinas de estado.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7a

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7a

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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7b

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7b

c. A continuación, eliminará sus funciones Lambda. En el menú de la consola de administración de AWS, haga clic en Servicios y, a continuación, seleccione Lambda.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7c

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7c

d. En la pantalla Funciones, haga clic en la función Inventario que creó para este tutorial, seleccione Acciones y, luego, seleccione Eliminar. Confirme la eliminación haciendo clic nuevamente en Eliminar.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7d

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7d

e. Por último, eliminará sus roles de IAM. En el menú de la consola de administración de AWS, haga clic en Servicios y, a continuación, seleccione IAM.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7e

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7e

f. Seleccione los roles de IAM que creó para este tutorial y, luego, haga clic en Eliminar rol. Confirme la eliminación haciendo clic en Sí, eliminar en el cuadro de diálogo.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7f

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7f

g. En la lista de colas, seleccione la cola Pedidos. Luego, en Acciones de cola, seleccione Eliminar cola.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7g

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7g

h. Se mostrará el cuadro de diálogo Eliminar colas. Puede eliminar la cola incluso si aún tiene mensajes en ella. Seleccione Sí, eliminar cola. Se eliminó la cola.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7h

(Haga clic para ampliar).

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7h

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.