Iteración de un bucle con una función de Lambda en Step Functions
En este tutorial, implementará un patrón de diseño que utiliza una maquina de estado y una función de AWS Lambda para recorrer en iteración un bucle un número específico de veces.
Utilice este patrón de diseño cada vez que necesite realizar un seguimiento del número de bucles en una máquina de estado. Esta implementación puede ayudarle a desglosar tareas grandes o ejecuciones de ejecución prolongada en trozos más pequeños o finalizar una ejecución después de un número específico de eventos. Puede utilizar una implementación similar para finalizar y reiniciar de forma periódica una ejecución de larga duración para evitar superar las cuotas de servicio para AWS Step Functions, AWS Lambda u otros servicios de AWS.
Antes de empezar, consulte el tutorial Creación de una máquina de estado de Step Functions que utilice Lambda para asegurarse de que está familiarizado con el uso conjunto de Lambda y Step Functions.
Paso 1: Crear una función de Lambda para iterar un recuento
Al utilizar una función de Lambda puede realizar un seguimiento del número de iteraciones de un bucle en su máquina de estado. La función de Lambda siguiente recibe valores de entrada de count, index y step. Devuelve estos valores con un valor de index actualizado y un valor booleano denominado continue. La función de Lambda establece continue en true si index es menor que count.
A continuación, la máquina de estado implementa un estado Choice que ejecuta una lógica de aplicación si continue es trueo finaliza si es false.
Para crear la función de Lambda
-
Inicie sesión en la consola de Lambda
y, a continuación, elija Crear función. -
En la página Crear función, elija Diseñar desde cero.
-
En la sección Información básica, configure la función de Lambda de la siguiente manera:
-
En Nombre de la función, introduzca
Iterator. -
En Runtime (Tiempo de ejecución), elija Node.js.
-
En Cambiar el rol de ejecución predeterminado, elija Crear un nuevo rol con permisos básicos de Lambda.
-
Seleccione Creación de función.
-
-
Copie el siguiente código para la función de Lambda en el origen del código.
export const handler = function (event, context, callback) { let index = event.iterator.index let step = event.iterator.step let count = event.iterator.count index = index + step callback(null, { index, step, count, continue: index < count }) }Este código acepta los valores de entrada de
count,indexystep. Incrementaindexen el valor destepy devuelve estos valores y el valor booleano decontinue. El valor decontinueestruesiindexes menor quecount. -
Elija Implementar.
Paso 2: Probar la función de Lambda
Ejecute su función de Lambda con valores numéricos para verla en acción. Puede proporcionar valores de entrada para su función de Lambda que simulen una iteración.
Para probar su función de Lambda
-
Seleccione Probar.
-
En el cuadro de diálogo Configurar un evento de prueba, introduzca
TestIteratoren el cuadro Nombre del evento. -
Sustituya los datos de ejemplo por lo siguiente.
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }Estos valores imitan los que procederían de la máquina de estado durante una iteración. La función de Lambda incrementará el índice
truey devolverácontinuecuando el índice sea inferior acount. Para esta prueba, el índice ya se ha incrementado a5. La prueba incrementaráindexa6y establecerácontinuecomotrue. -
Seleccione Crear.
-
Seleccione Probar para probar su función de Lambda.
Los resultados de la prueba se muestran en la pestaña Resultados de la ejecución.
-
Para ver los resultados de la ejecución, elija la pestaña Salida.
{ "index": 6, "step": 1, "count": 10, "continue": true }nota
Si configura
indexcomo9y vuelve a realizar la prueba, los incrementos deindexseránfalsey los de10seráncontinue.
Paso 3: Crear una máquina de estado
Antes de salir de la consola Lambda...
Copie el ARN de la función de Lambda. Péguelo en una nota. Lo necesitará en el siguiente paso.
A continuación, creará una máquina de estado con los siguientes estados:
-
ConfigureCount: establece los valores predeterminados decount,indexystep. -
Iterator: hace referencia a la función de Lambda creada anteriormente, transfiriendo los valores configurados enConfigureCount. -
IsCountReached: un estado de elección que continúa el ciclo o pasa al estadoDone, en función del valor devuelto por la funciónIterator. -
ExampleWork: un resumen del trabajo que hay que hacer. En este ejemplo, el flujo de trabajo tiene un estadoPass, pero en una solución real, lo más probable es que utiliceTask. -
Done: estado final de su flujo de trabajo.
Para crear la máquina de estado en la consola:
-
Abra la consola de Step Functions
y elija Crear una máquina de estado. importante
La máquina de estado debe estar en la misma cuenta de AWS y región que la función de Lambda.
-
Seleccione la plantilla en blanco.
-
En el panel Código, pegue el siguiente JSON que define la máquina de estado.
Para obtener más información acerca del Amazon States Language, consulte Estructura de las máquinas de estado.
{ "Comment": "Iterator State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 10, "index": 0, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "arn:aws:lambda:", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "Done" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "Done": { "Type": "Pass", "End": true } } }region:123456789012:function:Iterate -
Asegúrese de reemplazar el campo
Iterator Resourcepor el ARN de la función de LambdaIteratorque creó anteriormente. -
Seleccione Configuración e indique un Nombre para su máquina de estado, como por ejemplo,
.IterateCountnota
Los nombres de máquinas de estado, ejecuciones y tareas de actividad no deben superar los 80 caracteres. Estos nombres deben ser exclusivos para su cuenta y región de AWS, y no deben contener ninguno de los siguientes elementos:
-
Espacios en blanco
-
Caracteres comodín (
? *) -
Caracteres entre corchetes (
< > { } [ ]) -
Caracteres especiales (
" # % \ ^ | ~ ` $ & , ; : /) -
Caracteres de control (
\\u0000-\\u001fo\\u007f-\\u009f).
Step Functions acepta nombres para máquinas de estado, ejecuciones, actividades y etiquetas que contengan caracteres no ASCII. Dado que estos caracteres impedirán que Amazon CloudWatch registre datos, le recomendamos que utilice únicamente caracteres ASCII para poder realizar un seguimiento de las métricas en Step Functions.
-
-
En Tipo, acepte el valor predeterminado de Estándar. Para Permisos, seleccione Crear nuevo rol.
-
Seleccione Crear y, a continuación, confirme la creación de los roles.
Paso 4: Iniciar una nueva ejecución
Después de crear la máquina de estado, puede iniciar una ejecución.
-
En la página IterateCount, seleccione Iniciar ejecución.
-
(Opcional) Introduzca un nombre de ejecución personalizado para anular el valor predeterminado generado.
Nombres y registros con caracteres no ASCII
Step Functions acepta nombres para máquinas de estado, ejecuciones, actividades y etiquetas que contengan caracteres no ASCII. Dado que estos caracteres impedirán que Amazon CloudWatch registre datos, le recomendamos que utilice únicamente caracteres ASCII para poder realizar un seguimiento de las métricas en Step Functions.
-
Seleccione Iniciar ejecución.
Se inicia una nueva ejecución de la máquina de estado, mostrando la ejecución en funcionamiento.
La ejecución se incrementa por pasos y realiza el seguimiento del contador mediante la función de Lambda. En cada iteración, realiza el trabajo de ejemplo al que se hace referencia en el estado
ExampleWorkde la máquina de estado.Cuando el recuento alcanza el número especificado en el estado
ConfigureCountde la máquina de estado, la ejecución termina las iteraciones y finaliza.