Examinar execuções de máquinas de estado no Step Functions
Neste tutorial, você aprenderá como inspecionar as informações de execução exibidas na página Detalhes da execução e ver o motivo de uma falha na execução. Em seguida, você vai aprender como acessar diferentes iterações de uma execução de estado Map
. Por fim, você aprenderá como configurar as colunas na Visualização em tabela e aplicar filtros adequados para visualizar somente as informações de seu interesse.
Neste tutorial, você cria uma máquina de estado do tipo Padrão, que obtém o preço de um conjunto de frutas. Para fazer isso, a máquina de estado usa três funções AWS Lambda que retornam uma lista aleatória de quatro frutas, o preço de cada fruta e o custo médio das frutas. As funções do Lambda foram projetadas para gerar um erro se o preço das frutas for menor ou igual a um valor limite.
nota
Embora o procedimento a seguir contenha instruções sobre como examinar os detalhes da execução de um fluxo de trabalho Padrão, você também pode examinar os detalhes das execuções do Fluxo de trabalho expresso. Para obter informações sobre as diferenças entre os detalhes de execução dos tipos de fluxo de trabalho Padrão e Expresso, consulte Diferenças na experiência do console padrão e expresso.
Etapa 1: criar e testar as funções do Lambda necessárias
-
Abra o console do Lambda
e execute as etapas de 1 a 4 na seção Etapa 1: criar uma função do Lambda. Certifique-se de nomear a função do Lambda GetListOfFruits
. -
Depois de criar a função do Lambda, copie o nome do recurso da Amazon (ARN) da função exibido no canto superior direito da página. Para copiar o ARN, clique no ícone de cópia para copiar o nome do recurso da Amazon da função do Lambda. Veja a seguir um exemplo de ARN, em que
é o nome da função do Lambda (nesse caso,function-name
GetListOfFruits
):arn:aws:lambda:us-east-1:123456789012:function:
function-name
-
Copie o seguinte código para a função do Lambda na área de Origem do código da página GetListOfFruits.
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); };
-
Escolha Implantar e, em seguida, escolha Testar, para implantar as alterações e ver a saída da função do Lambda.
-
Crie duas funções do Lambda adicionais, nomeadas
GetFruitPrice
eCalculateAverage
respectivamente, com as seguintes etapas:-
Copie o seguinte código na área de Origem do código da função do Lambda GetFruitPrice:
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 o seguinte código na área de Origem do código da função do Lambda CalculateAverage:
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); };
-
Certifique-se de copiar os ARNs dessas duas funções do Lambda e, em seguida, Implante-os e Teste-os.
-
Etapa 2: criar e executar a máquina de estado
Use o console do Step FunctionsMap
são definidos. Cada um desses estados Map
contém um estado Task
que invoca uma das funções do Lambda. Além disso, um campo Retry
é definido em cada estado Task
com várias tentativas definidas para cada estado. Se um estado Task
encontrar um erro de runtime, ele será executado novamente até o número de novas tentativas definido para esse Task
.
-
Abra o console do Step Functions
e escolha Gravar o fluxo de trabalho no código. Importante
Certifique-se de que a máquina de estado esteja na mesma conta e região da AWS da função do Lambda que você criou anteriormente.
-
Para Tipo, mantenha a seleção padrão de Padrão.
-
Copie a seguinte definição de Amazon States Language e cole-a em Definição. Substitua os ARNs mostrados pelos das funções do Lambda que você criou 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 } } } -
Insira um nome para a máquina de estado. Mantenha as seleções padrão para outras opções desta página e escolha Criar máquina de estado.
-
Abra a página intitulada com o nome da máquina de estado. Execute as etapas de 1 a 4 na seção Etapa 4: Executar a máquina de estado, mas use os seguintes dados como entrada de execução:
{ "stores": [ "Store A", "Store B", "Store C", "Store D" ] }
Etapa 3: visualizar os detalhes da execução da máquina de estado
Na página intitulada com o ID de execução, você pode revisar os resultados da execução e depurar quaisquer erros.
-
(Opcional) Escolha entre as guias exibidas na página Detalhes da execução para ver as informações presentes em cada uma delas. Por exemplo, para visualizar a entrada da máquina de estado e a saída de execução, escolha Entrada e saída da execução na seção Resumo de execução.
-
Se a execução da máquina de estado falhar, escolha Causa ou Mostrar detalhes da etapa na mensagem de erro. Detalhes sobre o erro são exibidos na seção Detalhes da etapa. Observe que a etapa que causou o erro, que é um estado
Task
chamado GetListofFruits, está destacada na Exibição em gráfico e na Visualização de tabela.nota
Como a etapa GetListOfFruits está definida dentro de um estado
Map
, e a etapa não foi executada com êxito, o Status do estadoMap
é exibido como Falha.
Etapa 4: explorar os diferentes Modos de visualização
Você pode escolher um modo preferido para visualizar o fluxo de trabalho da máquina de estado ou o histórico de eventos de execução. Algumas das tarefas que você pode executar nesses Modos de visualização são as seguintes:
Se o estado Mapa tiver cinco iterações, e você quiser visualizar os dados de execução da terceira e quarta iterações, faça o seguinte:
-
Escolha o estado
Map
cujos dados de iteração você deseja visualizar. -
No Visualizador de iteração do mapa, escolha a iteração que você deseja visualizar. As iterações são contadas a partir de zero. Para escolher a terceira iteração entre cinco, escolha nº 2 na lista suspensa ao lado do nome do estado Mapa.
nota
Se a máquina de estado contiver estados
Map
aninhados, o Step Functions exibirá as iterações de estadoMap
principal e secundário como duas listas suspensas separadas que representam os dados de iteração para os estados aninhados. -
(Opcional) Se uma ou mais de suas iterações de estado
Map
falharam na execução ou foram interrompidas em um estado interrompido, você poderá ver detalhes sobre a iteração com falha. Para ver esses detalhes, escolha os números de iteração afetados em Falha ou Interrompido na lista suspensa.
Se o estado Mapa tiver cinco iterações, e você quiser visualizar os detalhes de execução da terceira e quarta iterações, faça o seguinte:
-
Escolha o estado
Map
cujos dados de iteração diferentes você deseja visualizar. -
Na exibição em árvore das iterações de estado
Map
, escolha a linha da iteração chamada nº 2 para a iteração número três. Da mesma forma, escolha a linha chamada nº 3 para a iteração número quatro.
Escolha o ícone de configurações. Em seguida, na caixa de diálogo Preferências, escolha as colunas que você deseja exibir em Selecionar colunas visíveis.
Por padrão, esse modo exibe as colunas Nome, Tipo, Status, Recurso e Iniciado depois.
Limite a quantidade de informações exibidas aplicando um ou mais filtros com base em uma propriedade, como Status, ou em um intervalo de data e hora. Por exemplo, para visualizar as etapas que falharam na execução, aplique o seguinte filtro:
-
Escolha Filtrar por propriedades ou pesquisar por palavra-chave e escolha Status em Propriedades.
-
Em Operadores, escolha Status =.
-
Escolha Status = Falha.
-
(Opcional) Escolha Limpar filtros para remover os filtros aplicados.
Limite a quantidade de informações exibidas aplicando um ou mais filtros com base em uma propriedade, como Tipo, ou em um intervalo de data e hora. Por exemplo, para visualizar as etapas do estado Task
que falharam na execução, aplique o seguinte filtro:
-
Escolha Filtrar por propriedades ou pesquisar por palavra-chave e escolha Tipo em Propriedades.
-
Em Operadores, escolha Tipo =.
-
Escolha Tipo = TaskFailed.
-
(Opcional) Escolha Limpar filtros para remover os filtros aplicados.
Escolha o ícone de seta ao lado do ID de um evento TaskFailed para inspecionar os detalhes, bem como entrada, saída e invocação de recursos que aparecem em uma caixa suspensa.