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
-
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
. -
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
es el nombre de la función Lambda (en este caso,nombre de la función
GetListOfFruits
):arn:aws:lambda:us-east-1:123456789012:function:
function-name
-
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); };
-
Seleccione Implementar y luego Probar para implementar los cambios y ver el resultado de la función de Lambda.
-
Cree dos funciones de Lambda adicionales, denominadas
GetFruitPrice
yCalculateAverage
respectivamente, siguiendo estos pasos:-
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; };
-
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); };
-
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 FunctionsMap
. 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
.
-
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.
-
En Tipo, mantenga la selección predeterminada de Estándar.
-
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 } } } -
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.
-
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.
-
(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.
-
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 deMap
estado 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:
-
Seleccione el estado
Map
para el que desea ver los datos de iteración. -
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 deMap
estado principal y secundaria en dos listas desplegables independientes que representan los datos de iteración de los estados anidados. -
(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:
-
Seleccione el estado
Map
para el que desea ver los distintos datos de iteración. -
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:
-
Seleccione Filtrar por propiedades o buscar por palabra clave y, a continuación, Estado en Propiedades.
-
En Operadores, seleccione Estado =.
-
Seleccione Estado = Con error.
-
(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:
-
Seleccione Filtrar por propiedades o buscar por palabra clave y, a continuación, Tipo en Propiedades.
-
En Operadores, seleccione Tipo =.
-
Seleccione Tipo = TaskFailed.
-
(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.