Uso de una función de Lambda para continuar con una nueva ejecución - AWS Step Functions

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de una función de Lambda para continuar con una nueva ejecución

Puede crear una máquina de estado que utilice una función de Lambda para iniciar una nueva ejecución antes de que finalice la ejecución actual. Utilizar este enfoque para continuar su trabajo en curso en una nueva ejecución le permite tener una máquina de estado que puede dividir los trabajos grandes en flujos de trabajo más pequeños o tener una máquina de estado que se ejecute de forma indefinida.

Este tutorial se basa en el concepto de utilizar una función de Lambda externa para modificar el flujo de trabajo, que se presentó en el tutorial Itera un bucle con Lambda. Se utiliza la misma función de Lambda (Iterator) para recorrer en iteración un bucle un número específico de veces. Además, se crea otra función de Lambda para comenzar una nueva ejecución del flujo de trabajo y para reducir un contador cada vez que comience una nueva ejecución. Al establecer el número de ejecuciones en la entrada, esta máquina de estado finaliza y reinicia una ejecución un número específico de veces.

La máquina de estado que creará implementa los siguientes estados.

Estado Finalidad

ConfigureCount

Un estado Pass que configura los valores de count, index y step que utiliza la función de lambda Iterator para recorrer las iteraciones de trabajo.

Iterator

Un estado Task que hace referencia a la función de Lambda Iterator.

IsCountReached

Un estado Choice que usa un valor booleano de la función Iterator para decidir si la máquina de estado debe continuar el trabajo de ejemplo o cambiar al estado ShouldRestart.

ExampleWork

Un estado Pass que representa el estado Task que realizaría el trabajo en una implementación real.

ShouldRestart

Un estado Choice que utiliza el valor executionCount para decidir si debe finalizar una ejecución y comenzar otra, o simplemente finalizar.

Restart

Un estado Task que usa una función de Lambda para comenzar una ejecución nueva de la máquina de estado. Al igual que la función Iterator, esta también disminuye un contador. El estado Restart transfiere el valor decrementado del recuento a la entrada de la nueva ejecución.

Requisitos previos

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

nota

Si ha completado el tutorial Itera un bucle con Lambda, puede omitir este paso y utilizar esa función de Lambda.

En esta sección y en el tutorial Itera un bucle con Lambda se muestra cómo puede usar una función de Lambda para realizar el seguimiento de un contador, por ejemplo, el 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 y un valor booleano denominado continue actualizados. 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 true, o cambia a ShouldRestart si continue es false.

Crear la función de Lambda de iteración

  1. Abra la consola Lambda y, a continuación, elija Crear una función.

  2. En la página Crear función, elija Diseñar desde cero.

  3. En la sección Información básica, configure la función de Lambda de la siguiente manera:

    1. En Nombre de la función, introduzca Iterator.

    2. En Tiempo de ejecución, elija Node.js 16.x.

    3. Mantenga todas las selecciones predeterminadas de la página y elija Crear función.

      Una vez creada la función de Lambda, tome nota de su Nombre de recurso de Amazon (ARN) que aparece en la esquina superior derecha de la página, por ejemplo:

      arn:aws:lambda:us-east-1:123456789012:function:Iterator
  4. Copie el siguiente código de la función de Lambda en la sección Código fuente de la página Iterador en la consola de Lambda.

    exports.handler = function iterator (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, index y step. Incrementa index en el valor de step y devuelve estos valores y el valor booleano de continue. El valor de continue es true si index es menor que count.

  5. Elija Implementar para implementar el código.

Probar la función de Lambda de iteración

Para ver en acción la función Iterate, ejecútela con valores numéricos. Puede proporcionar valores de entrada para la función de Lambda que imiten una iteración para ver qué resultado se obtiene con valores de entrada específicos.

Para probar su función de Lambda

  1. En el cuadro de diálogo Configurar evento de prueba, elija Crear nuevo evento de prueba y, a continuación, escriba TestIterator en Nombre del evento.

  2. 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 aumenta el índice y devuelve continue como true. Cuando el índice no sea menor que count, devuelve continue como false. Para esta prueba, el índice ya se ha incrementado a 5. Los resultados deben incrementar el valor de index a 6 y establecer continue en true.

  3. Seleccione Crear.

  4. En la página Iterator de la consola Lambda, TestIteratorasegúrese de que aparezca en la lista y, a continuación, seleccione Probar.

    Los resultados de la prueba se muestran en la parte superior de la página. Elija Detalles y examine el resultado.

    { "index": 6, "step": 1, "count": 10, "continue": true }
    nota

    Si establece index en 9 para esta prueba, index se incrementa a 10 y continue tiene el valor false.

Paso 2: Crear una función de Lambda Restart para comenzar una nueva ejecución de Step Functions

  1. Abra la consola Lambda y, a continuación, elija Crear una función.

  2. En la página Crear función, elija Diseñar desde cero.

  3. En la sección Información básica, configure la función de Lambda de la siguiente manera:

    1. En Nombre de la función, introduzca Restart.

    2. En Tiempo de ejecución, elija Node.js 16.x.

  4. Mantenga todas las selecciones predeterminadas de la página y elija Crear función.

    Una vez creada la función de Lambda, tome nota de su Nombre de recurso de Amazon (ARN) que aparece en la esquina superior derecha de la página, por ejemplo:

    arn:aws:lambda:us-east-1:123456789012:function:Iterator
  5. Copie el siguiente código de la función de Lambda en la sección Código fuente de la página Reinicio en la consola de Lambda.

    El siguiente código disminuye un contador del número de ejecuciones y comienza una nueva ejecución de la máquina de estado, incluido el valor reducido.

    var aws = require('aws-sdk'); var sfn = new aws.StepFunctions(); exports.restart = function(event, context, callback) { let StateMachineArn = event.restart.StateMachineArn; event.restart.executionCount -= 1; event = JSON.stringify(event); let params = { input: event, stateMachineArn: StateMachineArn }; sfn.startExecution(params, function(err, data) { if (err) callback(err); else callback(null,event); }); }
  6. Elija Implementar para implementar el código.

Paso 3: Crear una máquina de estado

Ahora que ha creado las dos funciones de Lambda, cree una máquina de estado. En esta máquina de estado, los estados ShouldRestart y Restart son el modo en que divide su trabajo en varias ejecuciones.

ejemplo ShouldRestart Elija el estado

El siguiente extracto muestra el estado ShouldRestartChoice. Este estado determina si se debe reiniciar o no la ejecución.

"ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 1, "Next": "Restart" } ],

El valor $.restart.executionCount se incluye en la entrada de la ejecución inicial. Se reduce en uno cada vez que se llama a la función Restart y, a continuación, se incluye en la entrada de cada ejecución posterior.

ejemplo Estado Task de Restart

El siguiente extracto muestra el estado RestartTask. Este estado usa la función de Lambda que creó antes para reiniciar la ejecución y para reducir el contador con el fin de realizar el seguimiento del número restante de ejecuciones que se iniciarán.

"Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" },
Para crear la máquina de estado de
  1. Abra la consola de Step Functions y seleccione Crear máquina de estado.

  2. En el cuadro de diálogo Elegir una plantilla, seleccione En blanco.

  3. Elija Seleccionar. Se abrirá Workflow Studio en Modo Diseño.

  4. Para este tutorial, escribirá la definición de Lenguaje de estados de Amazon (ASL) de su máquina de estado en el Editor de código. Para ello, elija Código.

  5. Elimine el código reutilizable existente y pegue el siguiente código. Recuerde reemplazar los ARN de este código por los ARN de las funciones de Lambda que creó.

    { "Comment": "Continue-as-new State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 100, "index": -1, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Iterator", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "ShouldRestart" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 0, "Next": "Restart" } ], "Default": "Done" }, "Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" }, "Done": { "Type": "Pass", "End": true } } }
  6. Especifique un nombre para la máquina de estado. Para ello, elija el icono de edición situado junto al nombre de la máquina de estado predeterminada de MyStateMachine. A continuación, en Configuración de máquina de estado, especifique un nombre en el cuadro Nombre de la máquina de estado.

    En este tutorial, ingrese el nombre ContinueAsNew.

  7. (Opcional) En Configuración de máquina de estado, especifique otros ajustes del flujo de trabajo, como el tipo de máquina de estado y su función de ejecución.

    Para este tutorial, mantenga todas las selecciones predeterminadas en Configuración de máquina de estado.

    Si ya ha creado un rol de IAM con los permisos correctos para su máquina de estado y desea utilizarlo, en Permisos, seleccione Elegir un rol existente y, a continuación, seleccione un rol de la lista. O seleccione Escribir un ARN de rol y, a continuación, proporcione un ARN para ese rol de IAM.

  8. En el cuadro de diálogo Confirmar creación de rol, elija Confirmar para continuar.

    También puede seleccionar Ver configuración de rol para volver a Configuración de máquina de estado.

    nota

    Si se elimina el rol de IAM que crea Step Functions, no se podrá volver a crear más adelante. Asimismo, si se modifica el rol (por ejemplo, eliminando Step Functions de las entidades principales de la política de IAM), Step Functions no podrá restablecer la configuración original más adelante.

  9. Guarde el nombre de recurso de Amazon (ARN) de esta máquina de estado en un archivo de texto. Deberá proporcionar el ARN y, al mismo tiempo, dar permiso a la función de Lambda para iniciar una nueva ejecución de Step Functions.

Paso 4: Actualizar la política de IAM

Para asegurarse de que la función de Lambda tiene permisos para iniciar una nueva ejecución de , asocie una política insertada al rol de IAM que utilice para la función de Lambda Restart. Para obtener más información, consulte Para integrar una política insertada en la Guía del usuario de IAM.

nota

Puede actualizar la línea Resource en el ejemplo anterior para hacer referencia al ARN de su máquina de estado ContinueAsNew. De este modo se restringe la política de modo que solo comience una ejecución de esa máquina de estado específica.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": "arn:aws:states:us-east-2:123456789012stateMachine:ContinueAsNew" } ] }

Paso 5: Ejecutar la máquina de estado

Para comenzar una ejecución, proporcione una entrada que incluya el ARN de la máquina de estado y un valor executionCount correspondiente al número de veces que debe comenzar una nueva ejecución.

  1. En la ContinueAsNewpágina, elija Iniciar ejecución.

    Aparece el cuadro de diálogo Iniciar ejecución.

  2. En el cuadro de diálogo Iniciar ejecución, haga lo siguiente:

    1. (Opcional) Para identificar la ejecución, puede especificar un nombre en el cuadro Nombre. De forma predeterminada, Step Functions genera automáticamente un nombre de ejecución único.

      nota

      Step Functions le permite crear nombres para máquinas de estados, ejecuciones y actividades, así como etiquetas que contienen caracteres no ASCII. Estos nombres que no son ASCII no funcionan con Amazon. CloudWatch Para asegurarse de que puede realizar un seguimiento de CloudWatch las métricas, elija un nombre que utilice únicamente caracteres ASCII.

    2. En el cuadro Entrada, introduzca la siguiente entrada de JSON para ejecutar el flujo de trabajo.

      { "restart": { "StateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew", "executionCount": 4 } }
    3. Actualice el campo StateMachineArn con el ARN de la máquina de estado ContinueAsNew.

    4. Seleccione Iniciar ejecución.

    5. La consola de Step Functions le dirige a una página cuyo título es su ID de ejecución. Esta página se conoce como Detalles de la ejecución. En esta página, puede revisar los resultados de la ejecución a medida que avanza la ejecución o una vez finalizada.

      Para revisar los resultados de la ejecución, elija los estados individuales en la Vista de gráfico y, a continuación, elija las pestañas individuales del panel Detalles del paso para ver los detalles de cada estado, incluidas la entrada, la salida y la definición, respectivamente. Para obtener más información sobre la ejecución que puede ver en la página Detalles de la ejecución, consulte Página de detalles de ejecución: información general de la interfaz.

      En el gráfico Vista gráfica se muestra la primera de las cuatro ejecuciones. Antes de que finalice, pasará el estado Restart y comenzará una nueva ejecución.

      Primera ejecución de cuatro.

      Una vez que se completa esta ejecución, puede examinar la siguiente ejecución que se esté ejecutando. Seleccione el ContinueAsNewenlace de la parte superior para ver la lista de ejecuciones. Debe verse la ejecución cerrada recientemente y una ejecución en curso que inició la función de Lambda Restart.

      Una ejecución completa, la siguiente en ejecución.

      Cuando estén completas todas las ejecuciones, debe ver cuatro ejecuciones correctas en la lista. La primera ejecución que se inició muestra el nombre que eligió y las posteriores tienen un nombre generado.

      Todas las ejecuciones completas.