Examinando las ejecuciones de máquinas de estado en Step Functions - 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.

Examinando las ejecuciones de máquinas de estado en Step Functions

En este tutorial, aprenderá a inspeccionar la información de ejecución que se muestra en la página Detalles de la ejecución y a ver el motivo de una ejecución con error. A continuación, aprenderá a acceder a las distintas iteraciones de una ejecución de estado Map. Por último, aprenderá a configurar las columnas en la Vista de tabla y a aplicar los filtros adecuados para ver solo la información que le interese.

En este tutorial, creará una máquina de estado de tipo estándar que obtiene el precio de un conjunto de frutas. Para ello, la máquina de estados utiliza tres AWS Lambda funciones que devuelven una lista aleatoria de cuatro frutas, el precio de cada fruta y el costo promedio de las frutas. Las funciones de Lambda están diseñadas para arrojar un error si el precio de las frutas es inferior o igual a un valor de umbral.

nota

Aunque el siguiente procedimiento contiene instrucciones sobre cómo examinar los detalles de la ejecución de un flujo de trabajo estándar, también puede examinar los detalles de las ejecuciones de flujos de trabajo rápidos. Para obtener información acerca de las diferencias entre los detalles de la ejecución para tipos de flujos de trabajo estándar y rápidos, consulte Las consolas Standard y Express experimentan diferencias.

Paso 1: Crear y probar las funciones de Lambda requerida

  1. Abra la consola de Lambda y, a continuación, realice los pasos 1 a 4 de la sección Paso 1: Crear una función de Lambda. Asegúrese de asignar un nombre a la función de Lambda GetListOfFruits.

  2. Tras crear la función Lambda, copie el nombre del recurso de Amazon (ARN) de la función que aparece en la esquina superior derecha de la página. Para copiarloARN, haga clic en el icono de copia para copiar el nombre del recurso de Amazon de la función Lambda. A continuación se muestra un ejemplo en ARN el que nombre de la función es el nombre de la función Lambda (en este caso,GetListOfFruits):

    arn:aws:lambda:us-east-1:123456789012:function:function-name
  3. Copie el siguiente código de la función Lambda en el área Código fuente de la GetListOfFruitspágina.

    function getRandomSubarray(arr, size) { var shuffled = arr.slice(0), i = arr.length, temp, index; while (i--) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(0, size); } exports.handler = async function(event, context) { const fruits = ['Abiu','Açaí','Acerola','Ackee','African cucumber','Apple','Apricot','Avocado','Banana','Bilberry','Blackberry','Blackcurrant','Jostaberry']; const errorChance = 45; const waitTime = Math.floor( 100 * Math.random() ); await new Promise( r => setTimeout(() => r(), waitTime)); const num = Math.floor( 100 * Math.random() ); // const num = 51; if (num <= errorChance) { throw(new Error('Error')); } return getRandomSubarray(fruits, 4); };
  4. Seleccione Implementar y luego Probar para implementar los cambios y ver el resultado de la función de Lambda.

  5. Cree dos funciones de Lambda adicionales, denominadas GetFruitPrice y CalculateAverage respectivamente, siguiendo estos pasos:

    1. Copie el siguiente código en el área Código fuente de la función GetFruitPriceLambda:

      exports.handler = async function(event, context) { const errorChance = 0; const waitTime = Math.floor( 100 * Math.random() ); await new Promise( r => setTimeout(() => r(), waitTime)); const num = Math.floor( 100 * Math.random() ); if (num <= errorChance) { throw(new Error('Error')); } return Math.floor(Math.random()*100)/10; };
    2. Copie el siguiente código en el área Código fuente de la función CalculateAverageLambda:

      function getRandomSubarray(arr, size) { var shuffled = arr.slice(0), i = arr.length, temp, index; while (i--) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(0, size); } const average = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length; exports.handler = async function(event, context) { const errors = [ "Error getting data from DynamoDB", "Error connecting to DynamoDB", "Network error", "MemoryError - Low memory" ] const errorChance = 0; const waitTime = Math.floor( 100 * Math.random() ); await new Promise( r => setTimeout(() => r(), waitTime)); const num = Math.floor( 100 * Math.random() ); if (num <= errorChance) { throw(new Error(getRandomSubarray(errors, 1)[0])); } return average(event); };
    3. Asegúrese de copiar estas dos funciones ARNs de Lambda y, a continuación, impleméntelas y pruébelas.

Paso 2: Crear y ejecutar la máquina de estado

Use la consola de Step Functions para crear una máquina de estado que invoque las funciones de Lambda que creó en el paso 1. En esta máquina de estado, se definen tres estados Map. Cada uno de estos estados Map contiene un estado Task que invoca una de las funciones de Lambda. Además, se define un campo Retry en cada estado Task con un número de reintentos definidos para cada estado. Si un estado Task detecta un error de tiempo de ejecución, se vuelve a ejecutar hasta el número de reintentos definido para ese estado Task.

  1. Abra la consola de Step Functions y seleccione Escribir el flujo de trabajo en código.

    importante

    Asegúrese de que su máquina de estados esté debajo de la misma AWS cuenta y región como la función Lambda que creó anteriormente.

  2. En Tipo, mantenga la selección predeterminada de Estándar.

  3. Copie la siguiente definición de Amazon States Language y péguela en Definición. Asegúrese de reemplazar las funciones que ARNs se muestran por las de las funciones Lambda que creó anteriormente.

    { "StartAt": "LoopOverStores", "States": { "LoopOverStores": { "Type": "Map", "Iterator": { "StartAt": "GetListOfFruits", "States": { "GetListOfFruits": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:GetListofFruits:$LATEST", "Payload": { "storeName.$": "$" } }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 2, "MaxAttempts": 1, "BackoffRate": 1.3 } ], "Next": "LoopOverFruits" }, "LoopOverFruits": { "Type": "Map", "Iterator": { "StartAt": "GetFruitPrice", "States": { "GetFruitPrice": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:GetFruitPrice:$LATEST", "Payload": { "fruitName.$": "$" } }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 2, "MaxAttempts": 3, "BackoffRate": 1.3 } ], "End": true } } }, "ItemsPath": "$", "End": true } } }, "ItemsPath": "$.stores", "Next": "LoopOverStoreFruitsPrice", "ResultPath": "$.storesFruitsPrice" }, "LoopOverStoreFruitsPrice": { "Type": "Map", "End": true, "Iterator": { "StartAt": "CalculateAverage", "States": { "CalculateAverage": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:Calculate-average:$LATEST", "Payload.$": "$" }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 2, "MaxAttempts": 2, "BackoffRate": 1.3 } ], "End": true } } }, "ItemsPath": "$.storesFruitsPrice", "ResultPath": "$.storesPriceAverage", "MaxConcurrency": 1 } } }
  4. Introduzca un nombre para la máquina de estado. Mantenga las selecciones predeterminadas para el resto de opciones de esta página y elija Crear máquina de estados.

  5. Abra la página cuyo título es el nombre de su máquina de estado. Realice los pasos 1 a 4 de la sección Paso 4: Ejecutar la máquina de estado, pero use los siguientes datos como entrada de ejecución:

    { "stores": [ "Store A", "Store B", "Store C", "Store D" ] }

Paso 3: Visualizar los detalles de la ejecución de la máquina de estado

En la página cuyo título es su ID de ejecución, puede revisar los resultados de la ejecución y depurar cualquier error.

  1. (Opcional) Seleccione una de las pestañas que aparecen en la página Detalles de la ejecución para ver la información presente en cada una de ellas. Por ejemplo, para ver la entrada de la máquina de estado y su salida de ejecución, seleccione Entrada y salida de ejecución en la sección Resumen de ejecución.

  2. Si la ejecución de la máquina de estado produce un error, seleccione Causa o Mostrar detalles del paso en el mensaje de error. Los detalles acerca del error aparecen en la sección Detalles del paso. Observe que el paso que provocó el error, que es un Task estado denominado GetListofFruits, aparece resaltado en la vista de gráfico y en la vista de tabla.

    nota

    Como el GetListofFruitspaso está definido dentro de un Map estado y no se ha podido ejecutar correctamente, el paso de Mapestado se muestra como Fallido.

Paso 4: Explorar los diferentes modos de visualización

Puede elegir el modo que prefiera para ver el flujo de trabajo de la máquina de estado o el historial de eventos de ejecución. A continuación se indican algunas de las tareas que puede realizar en estos modos de visualización:

Si el estado Map tiene cinco iteraciones y desea ver los detalles de la ejecución de la tercera y la cuarta iteraciones, haga lo siguiente:

  1. Seleccione el estado Map para el que desea ver los datos de iteración.

  2. En el visor de iteraciones de Map, seleccione la iteración que desee ver. Las iteraciones se cuentan desde cero. Para elegir la tercera iteración de cinco, seleccione #2 en la lista desplegable que aparece junto al nombre del estado Map.

    nota

    Si su máquina de estados contiene Map estados anidados, Step Functions muestra las iteraciones de Map estado principal y secundaria en dos listas desplegables independientes que representan los datos de iteración de los estados anidados.

  3. (Opcional) Si una o varias de las iteraciones de estado Map no se pudieron ejecutar o se detuvieron en un estado interrumpido, puede ver los detalles de la iteración con error. Para ver estos detalles, seleccione los números de iteración afectados en Con error o Interrumpido en la lista desplegable.

Si el estado Map tiene cinco iteraciones y desea ver los detalles de la ejecución de las iteraciones número tres y cuatro, haga lo siguiente:

  1. Seleccione el estado Map para el que desea ver los distintos datos de iteración.

  2. En la vista en árbol de las iteraciones de estado Map, seleccione la fila de la iteración denominada #2 para la iteración número tres. Del mismo modo, elija la fila denominada #3 para la iteración número cuatro.

Seleccione el icono de configuración. A continuación, en el cuadro de diálogo Preferencias, escoja las columnas que desee mostrar en Seleccionar las columnas visibles.

De forma predeterminada, este modo muestra las columnas Nombre, Tipo, Estado, Recurso e Iniciado después de.

Limite la cantidad de información que se muestra aplicando uno o varios filtros basados en una propiedad, como Estado, o un intervalo de fechas y horas. Por ejemplo, para ver los pasos que no se ejecutaron correctamente, aplique el siguiente filtro:

  1. Seleccione Filtrar por propiedades o buscar por palabra clave y, a continuación, Estado en Propiedades.

  2. En Operadores, seleccione Estado =.

  3. Seleccione Estado = Con error.

  4. (Opcional) Seleccione Borrar filtros para eliminar los filtros aplicados.

Limite la cantidad de información que se muestra aplicando uno o varios filtros basados en una propiedad, como Tipo, o un intervalo de fechas y horas. Por ejemplo, para ver los pasos del estado Task que no se ejecutaron correctamente, aplique el siguiente filtro:

  1. Seleccione Filtrar por propiedades o buscar por palabra clave y, a continuación, Tipo en Propiedades.

  2. En Operadores, seleccione Tipo =.

  3. Seleccione Tipo = TaskFailed.

  4. (Opcional) Seleccione Borrar filtros para eliminar los filtros aplicados.

Seleccione el icono de flecha situado junto al ID de un TaskFailedevento para inspeccionar sus detalles, incluidas la entrada, la salida y la invocación de recursos, que aparecen en un cuadro desplegable.