Tutorial: Examinando execuções de máquinas de estado em Step Functions - AWS Step Functions

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Tutorial: Examinando execuções de máquinas de estado em 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 estadual usa três AWS Lambda funções 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 Visualizando detalhes da execução do fluxo de trabalho em Step Functions.

Etapa 1: criar e testar as funções do Lambda necessárias

  1. 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.

  2. Depois de criar sua função Lambda, copie o Amazon Resource Name (ARN) da função exibido no canto superior direito da página. Para copiar oARN, clique no ícone de cópia para copiar o Amazon Resource Name da função Lambda. A seguir está um exemploARN, onde nome da função é o nome da função Lambda (nesse caso,GetListOfFruits):

    arn:aws:lambda:us-east-1:123456789012:function:function-name
  3. Copie o código a seguir para a função Lambda na área de código-fonte da 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. Escolha Implantar e, em seguida, escolha Testar, para implantar as alterações e ver a saída da função do Lambda.

  5. Crie duas funções do Lambda adicionais, nomeadas GetFruitPrice e CalculateAverage respectivamente, com as seguintes etapas:

    1. Copie o código a seguir na área de origem do código da função 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 o código a seguir na área de origem do código da função 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. Certifique-se de copiar essas duas funções ARNs do Lambda e, em seguida, implantá-las e testá-las.

Etapa 2: criar e executar a máquina de estado

Use o console do Step Functions para criar uma máquina de estado que invoca as funções do Lambda que você criou na Etapa 1. Nessa máquina de estado, três estados Map 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.

  1. Abra o console do Step Functions e escolha Gravar o fluxo de trabalho no código.

    Importante

    Certifique-se de que sua máquina de estado esteja na mesma AWS conta e região da função Lambda que você criou anteriormente.

  2. Para Tipo, mantenha a seleção padrão de Padrão.

  3. Copie a seguinte definição de Amazon States Language e cole-a em Definição. Certifique-se de substituir as ARNs mostradas pelas 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 } } }
  4. 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.

  5. 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.

  1. (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.

  2. 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 Task estado chamado GetListofFruits, está destacada na visualização em gráfico e na exibição em tabela.

    nota

    Como a GetListofFruitsetapa está definida dentro de um Map estado e a etapa não foi executada com êxito, a etapa Status do Map estado é exibida 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:

  1. Escolha o estado Map cujos dados de iteração você deseja visualizar.

  2. 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 sua máquina de estado contiver Map estados aninhados, o Step Functions exibirá as iterações de Map estado pai e filho como duas listas suspensas separadas representando os dados de iteração dos estados aninhados.

  3. (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:

  1. Escolha o estado Map cujos dados de iteração diferentes você deseja visualizar.

  2. 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:

  1. Escolha Filtrar por propriedades ou pesquisar por palavra-chave e escolha Status em Propriedades.

  2. Em Operadores, escolha Status =.

  3. Escolha Status = Falha.

  4. (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:

  1. Escolha Filtrar por propriedades ou pesquisar por palavra-chave e escolha Tipo em Propriedades.

  2. Em Operadores, escolha Tipo =.

  3. Escolha Tipo = TaskFailed.

  4. (Opcional) Escolha Limpar filtros para remover os filtros aplicados.

Escolha o ícone de seta ao lado da ID de um TaskFailedevento para inspecionar seus detalhes, incluindo entrada, saída e invocação de recursos que aparecem em uma caixa suspensa.