Tratamento de erros nos fluxos de trabalho do 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á.

Tratamento de erros nos fluxos de trabalho do Step Functions

Todos os estados, exceto Pass e Wait estados, podem encontrar erros de tempo de execução. Os erros podem ocorrer por vários motivos, como os seguintes:

  • Problemas de definição da máquina de estado (por exemplo, nenhuma regra de correspondência em um estado Choice)

  • Falhas na tarefa (por exemplo, uma exceção em um AWS Lambda função)

  • Problemas transitórios (por exemplo, eventos de partição de rede)

Por padrão, quando um estado relata um erro, AWS Step Functions faz com que a execução falhe completamente.

dica

Para implantar um exemplo de fluxo de trabalho que inclua tratamento de erros em seu Conta da AWS, consulte Tratamento de erros no AWS Step Functions Workshop.

Nomes de erro

O Step Functions identifica erros na Amazon States Language usando sequências de caracteres que diferenciam maiúsculas de minúsculas, conhecidas como nomes de erro. A Amazon States Language define um conjunto de sequências de caracteres incorporadas que nomeiam erros conhecidos, todos começando com o States. prefixo.

States.ALL

Um curinga que corresponde a qualquer nome de erro conhecido.

nota

Esse tipo de erro não pode capturar o tipo de erro do States.DataLimitExceeded terminal e os tipos de erro de tempo de execução. Para obter mais informações sobre esses tipos de erro, consulte States.DataLimitExceededStates.Runtimee.

States.DataLimitExceeded

Relatado devido às seguintes condições:

  • Quando a saída de um conector é maior que a cota de tamanho da carga útil.

  • Quando a saída de um estado é maior que a cota de tamanho da carga útil.

  • Quando, após o Parameters processamento, a entrada de um estado for maior que a cota de tamanho da carga útil.

Para obter mais informações sobre cotas, consulteCotas de serviço do Step Functions.

nota

Esse é um erro de terminal que não pode ser detectado pelo tipo de States.ALL erro.

States.ExceedToleratedFailureThreshold

Um Map estado falhou porque o número de itens com falha excedeu o limite especificado na definição da máquina de estado. Para obter mais informações, consulte Definindo limites de falha para estados do Distributed Map em Step Functions.

States.HeartbeatTimeout

Um Task estado falhou ao enviar uma pulsação por um período maior que o HeartbeatSeconds valor.

nota

Esse erro só está disponível nos Retry campos Catch e.

States.Http.Socket

Esse erro ocorre quando uma HTTP tarefa dura cerca de 60 segundos. Consulte Cotas relacionadas à tarefa HTTP.

States.IntrinsicFailure

Uma tentativa de invocar uma função intrínseca em um modelo de carga falhou.

States.ItemReaderFailed

Um Map estado falhou porque não foi possível ler a partir da fonte do item especificada no ItemReader campo. Para obter mais informações, consulte ItemReader (Mapa).

States.NoChoiceMatched

Um Choice estado falhou em combinar a entrada com as condições definidas na regra de escolha e uma transição padrão não foi especificada.

States.ParameterPathFailure

Uma tentativa de substituir um campo, dentro do Parameters campo de um estado, cujo nome termina em .$ usar um caminho falha.

States.Permissions

Um Task estado falhou porque não tinha privilégios suficientes para executar o código especificado.

States.ResultPathMatchFailure

Step Functions falhou ao aplicar o ResultPath campo de um estado à entrada que o estado recebeu.

States.ResultWriterFailed

Um Map estado falhou porque não conseguiu gravar os resultados no destino especificado no ResultWriter campo. Para obter mais informações, consulte ResultWriter (Mapa).

States.Runtime

Uma execução falhou devido a alguma exceção que não pôde ser processada. Geralmente, eles são causados por erros em tempo de execução, como tentativa de inscrição InputPath ou OutputPath em uma carga nulaJSON. Um States.Runtime erro não é recuperável e sempre fará com que a execução falhe. Uma nova tentativa ou catch on States.ALL não detectará States.Runtime erros.

States.TaskFailed

Um estado Task falhou durante a execução. Quando usado em uma nova tentativa ou captura, States.TaskFailed atua como um curinga que corresponde a qualquer nome de erro conhecido, exceto o. States.Timeout

States.Timeout

Um estado Task que executou por um tempo mais longo que o valor TimeoutSeconds ou não conseguiu enviar uma pulsação por um período maior que o valor HeartbeatSeconds.

Além disso, se uma máquina de estado for executada por mais tempo do que o TimeoutSeconds valor especificado, a execução falhará com um States.Timeout erro.

Os estados podem relatar erros com outros nomes. No entanto, esses nomes de erro não podem começar com o States. prefixo.

Como prática recomendada, garanta que o código de produção possa lidar com AWS Lambda exceções de serviço (Lambda.ServiceExceptioneLambda.SdkClientException). Para obter mais informações, consulte Lidar com exceções transitórias do serviço Lambda.

nota

Os erros não tratados no Lambda são relatados como Lambda.Unknown na saída do erro. Isso inclui out-of-memory erros e tempos limite de função. Você pode combinar com Lambda.Unknown, States.ALL ou States.TaskFailed para lidar com esses erros. Quando o Lambda atinge o número máximo de invocações, o erro é Lambda.TooManyRequestsException. Para obter mais informações sobre Lambda Handled e Unhandled erros, consulte FunctionError no AWS Lambda Guia do desenvolvedor.

Tentando novamente após um erro

Task,Parallel, e Map os estados podem ter um campo chamadoRetry, cujo valor deve ser uma matriz de objetos conhecidos como retriers. Um retrier individual representa determinado número de novas tentativas, geralmente em intervalos de tempo crescentes.

Quando um desses estados relata um erro e há um Retry campo, o Step Functions examina os recuperadores na ordem listada na matriz. Quando o nome do erro aparece no valor do ErrorEquals campo de um recuperador, a máquina de estado faz novas tentativas conforme definido no Retry campo.

Se suas receitas redriven a execução executa novamente um estado Estado do fluxo de trabalho da tarefaEstado do fluxo de trabalho paralelo,, ou Inline Map, para o qual você definiu novas tentativas. A contagem de tentativas para esses estados é redefinida para 0 para permitir o número máximo de tentativas em redrive. Para um redriven execução, você pode rastrear tentativas individuais desses estados usando o console. Para obter mais informações, consulte Repetir o comportamento do redriven execuções em Reiniciando as execuções da máquina de estado com redrive em Step Functions.

Um retrier contém os seguintes campos:

nota

As novas tentativas são tratadas como transições de estado. Para ver informações sobre como as transições de estado afetam o faturamento, consulte Preços do Step Functions.

ErrorEquals (obrigatório)

Uma matriz não vazia de strings que correspondem a Nomes de erro. Quando um estado relata um erro, o Step Functions examina os retriers. Quando o nome do erro é exibido na matriz, ele implementa a política de novas tentativas descrita nesse retrier.

IntervalSeconds (opcional)

Um inteiro positivo que representa o número de segundos antes da primeira tentativa nova (por padrão, 1). IntervalSeconds tem um valor máximo de 99999999.

MaxAttempts (opcional)

Um inteiro positivo que representa o número máximo de tentativas novas (por padrão, 3). Se o erro voltar a ocorrer mais vezes do que o especificado, as novas tentativas são interrompidas e o tratamento de erro normal é retomado. Um valor de 0 especifica que o erro nunca será repetido. MaxAttempts tem um valor máximo de 99999999.

BackoffRate (opcional)

O multiplicador pelo qual o intervalo de repetição indicado por IntervalSeconds aumenta após cada tentativa de nova tentativa. Por padrão, o BackoffRate valor aumenta em2.0.

Por exemplo, digamos que você IntervalSeconds é 3, MaxAttempts é 3 e BackoffRate é 2. A primeira tentativa de repetição ocorre três segundos após a ocorrência do erro. A segunda tentativa ocorre seis segundos após a primeira tentativa. Enquanto a terceira tentativa ocorre 12 segundos após a segunda tentativa.

MaxDelaySeconds (opcional)

Um número inteiro positivo que define o valor máximo, em segundos, até o qual um intervalo de repetição pode aumentar. É útil usar esse campo com o BackoffRate campo. O valor especificado nesse campo limita os tempos de espera exponenciais resultantes do multiplicador da taxa de recuo aplicado a cada tentativa consecutiva de repetição. Você deve especificar um valor maior que 0 e menor que 31622401 para. MaxDelaySeconds

Se você não especificar esse valor, o Step Functions não limitará os tempos de espera entre as tentativas de repetição.

JitterStrategy (opcional)

Uma sequência de caracteres que determina se deve ou não incluir instabilidade nos tempos de espera entre tentativas consecutivas de repetição. O Jitter reduz as tentativas simultâneas de repetição distribuindo-as em um intervalo de atraso aleatório. Essa string aceita FULL ou NONE como seus valores. O valor padrão é NONE.

Por exemplo, digamos que você tenha definido MaxAttempts como 3, IntervalSeconds como 2 e BackoffRate como 2. A primeira tentativa de repetição ocorre dois segundos após a ocorrência do erro. A segunda tentativa ocorre quatro segundos após a primeira tentativa e a terceira ocorre oito segundos após a segunda tentativa. Se você definir JitterStrategy comoFULL, o primeiro intervalo de repetição será aleatório entre 0 e 2 segundos, o segundo intervalo de repetição será aleatório entre 0 e 4 segundos e o terceiro intervalo de repetição será aleatório entre 0 e 8 segundos.

Tente novamente exemplos de campo

Esta seção inclui os seguintes exemplos de Retry campo.

dica

Para implantar um exemplo de fluxo de trabalho de tratamento de erros em seu Conta da AWS, consulte o módulo de tratamento de erros do The AWS Step Functions Workshop.

Exemplo 1 — Tente novamente com BackoffRate

O exemplo a seguir de a Retry faz duas tentativas de repetição, com a primeira tentativa ocorrendo depois de esperar por três segundos. Com base no BackoffRate que você especifica, o Step Functions aumenta o intervalo entre cada nova tentativa até que o número máximo de tentativas seja atingido. No exemplo a seguir, a segunda tentativa começa depois de esperar por três segundos após a primeira tentativa.

"Retry": [ { "ErrorEquals": [ "States.Timeout" ], "IntervalSeconds": 3, "MaxAttempts": 2, "BackoffRate": 1 } ]
Exemplo 2 — Tente novamente com MaxDelaySeconds

O exemplo a seguir faz três tentativas de repetição e limita o tempo de espera resultante BackoffRate em 5 segundos. A primeira tentativa ocorre depois de esperar por três segundos. A segunda e a terceira tentativas de repetição ocorrem após a espera de cinco segundos após a tentativa anterior, devido ao limite máximo de tempo de espera definido por. MaxDelaySeconds

"Retry": [ { "ErrorEquals": [ "States.Timeout" ], "IntervalSeconds": 3, "MaxAttempts": 3, "BackoffRate":2, "MaxDelaySeconds": 5, "JitterStrategy": "FULL" } ]

Sem issoMaxDelaySeconds, a segunda tentativa ocorreria seis segundos após a primeira tentativa, e a terceira tentativa ocorreria 12 segundos após a segunda tentativa.

Exemplo 3 — Tente novamente todos os erros, exceto States.Timeout

O nome reservado States.ALL que aparece no campo ErrorEquals de um retrier é um curinga que corresponde a qualquer nome de erro. Ele deve aparecer sozinho na matriz ErrorEquals e também no último retrier na matriz Retry. O nome States.TaskFailed também atua como um curinga e corresponde a qualquer erro, exceto o. States.Timeout

O exemplo a seguir de um Retry campo repete qualquer erro, excetoStates.Timeout.

"Retry": [ { "ErrorEquals": [ "States.Timeout" ], "MaxAttempts": 0 }, { "ErrorEquals": [ "States.ALL" ] } ]
Exemplo 4 — Cenário complexo de nova tentativa

Parâmetros de um retrier em todas as visitas ao retrier no contexto de uma única execução de estado.

Considere o seguinte estado Task.

"X": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:task:X", "Next": "Y", "Retry": [ { "ErrorEquals": [ "ErrorA", "ErrorB" ], "IntervalSeconds": 1, "BackoffRate": 2.0, "MaxAttempts": 2 }, { "ErrorEquals": [ "ErrorC" ], "IntervalSeconds": 5 } ], "Catch": [ { "ErrorEquals": [ "States.ALL" ], "Next": "Z" } ] }

Essa tarefa falha quatro vezes consecutivas, gerando os seguintes nomes de erro:ErrorA,, ErrorBErrorC, e. ErrorB O seguinte ocorre em consequência disso:

  • Os dois primeiros erros coincidem com o primeiro recuperador e causam esperas de um e dois segundos.

  • O terceiro erro corresponde ao segundo recuperador e causa uma espera de cinco segundos.

  • O quarto erro também corresponde ao primeiro recuperador. No entanto, ele já atingiu o máximo de duas tentativas (MaxAttempts) para esse erro específico. Portanto, esse recuperador falha e a execução redireciona o fluxo de trabalho para o Z estado por meio do campo. Catch

Estados alternativos

Task, Map e cada Parallel estado pode ter um campo chamadoCatch. O valor desse campo deve ser uma matriz de objetos, conhecidos como catchers.

Um catcher contém os campos a seguir.

ErrorEquals (obrigatório)

Uma matriz não vazia de strings que correspondem a nomes de erros, especificados exatamente como aparecem no campo do retrier de mesmo nome.

Next (obrigatório)

Uma string que deve corresponder exatamente a um dos nomes de estado da máquina de estado.

ResultPath (opcional)

Um caminho que determina qual entrada o coletor envia para o estado especificado no Next campo.

Quando um estado relata um erro e não há Retry campo ou se as novas tentativas falham em resolver o erro, o Step Functions examina os coletores na ordem listada na matriz. Quando o nome do erro é exibido no valor do campo ErrorEquals de um catcher, a máquina de estado muda para o estado denominado no campo Next.

O nome reservado States.ALL que aparece em um campo ErrorEquals do catcher é um curinga que corresponde a qualquer nome de erro. Ele deve aparecer sozinho na matriz ErrorEquals e também no último catcher na matriz Catch. O nome States.TaskFailed também atua como um curinga e corresponde a qualquer erro, exceto o. States.Timeout

O exemplo a seguir de um Catch campo faz a transição para o estado nomeado RecoveryState quando uma função Lambda gera uma exceção Java não tratada. Do contrário, o campo muda para o estado EndState.

"Catch": [ { "ErrorEquals": [ "java.lang.Exception" ], "ResultPath": "$.error-info", "Next": "RecoveryState" }, { "ErrorEquals": [ "States.ALL" ], "Next": "EndState" } ]
nota

Todo catcher pode especificar vários erros para tratamento.

Error output (Saída de erro)

Quando Step Functions faz a transição para o estado especificado em um nome catch, o objeto geralmente contém o campoCause. O valor desse campo é uma descrição de erro humanamente. Esse objeto é conhecido como saída de erro.

Neste exemplo, o primeiro catcher contém um campo ResultPath. Ele funciona de modo semelhante a um campo ResultPath em um nível superior do estado, o que resulta em duas possibilidades:

  • Ele pega os resultados da execução desse estado e substitui toda ou parte da entrada do estado.

  • Ele leva os resultados e os adiciona à entrada. No caso de um erro tratado por um coletor, o resultado da execução do estado é a saída do erro.

Assim, para o primeiro coletor no exemplo, o coletor adiciona a saída de erro à entrada como um campo nomeado error-info se ainda não houver um campo com esse nome na entrada. Em seguida, o coletor envia toda a entrada paraRecoveryState. Para o segundo coletor, a saída de erro sobrescreve a entrada e o coletor envia apenas a saída de erro para. EndState

nota

Se você não especificar o campo ResultPath, ele usará como padrão $, que seleciona e substitui a entrada completa.

Quando um estado tem Catch campos Retry e, o Step Functions usa primeiro qualquer recuperador apropriado. Se a política de repetição não solucionar o erro, o Step Functions aplicará a transição correspondente do coletor.

Cause cargas úteis e integrações de serviços

Um coletor retorna uma carga de string como saída. Ao trabalhar com integrações de serviços, como Amazon Athena ou AWS CodeBuild, talvez você queira converter a Cause string emJSON. O exemplo a seguir de um Pass estado com funções intrínsecas mostra como converter uma Cause string em. JSON

"Handle escaped JSON with JSONtoString": { "Type": "Pass", "Parameters": { "Cause.$": "States.StringToJson($.Cause)" }, "Next": "Pass State with Pass Processing" },

Exemplos de máquinas de estado usando Retry e usando Catch

As máquinas de estado definidas nos exemplos a seguir pressupõem a existência de duas funções Lambda: uma que sempre falha e outra que espera o tempo limite definido na máquina de estado.

Essa é uma definição de função do Lambda Node.js que sempre falha, retornando a mensagem error. Nos exemplos de máquina de estado a seguir, essa função Lambda é nomeada. FailFunction Para obter informações sobre a criação de uma função Lambda, consulte Etapa 1: criar uma função do Lambda a seção.

exports.handler = (event, context, callback) => { callback("error"); };

Essa é uma definição de uma função Lambda do Node.js que dorme por 10 segundos. Nos exemplos de máquina de estado a seguir, essa função Lambda é nomeada. sleep10

nota

Ao criar essa função Lambda no console Lambda, lembre-se de alterar o valor do tempo limite na seção Configurações avançadas de 3 segundos (padrão) para 11 segundos.

exports.handler = (event, context, callback) => { setTimeout(function(){ }, 11000); };

Lidando com uma falha usando Retry

Essa máquina de estado usa um campo Retry para tentar novamente uma função que falha e gera o nome de erro HandledError. Ele repete essa função duas vezes com um recuo exponencial entre as novas tentativas.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Retry": [ { "ErrorEquals": ["HandledError"], "IntervalSeconds": 1, "MaxAttempts": 2, "BackoffRate": 2.0 } ], "End": true } } }

Essa variante usa o código de erro predefinidoStates.TaskFailed, que corresponde a qualquer erro gerado por uma função Lambda.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Retry": [ { "ErrorEquals": ["States.TaskFailed"], "IntervalSeconds": 1, "MaxAttempts": 2, "BackoffRate": 2.0 } ], "End": true } } }
nota

Como prática recomendada, as tarefas que fazem referência a uma função do Lambda devem lidar com as exceções do serviço do Lambda. Para obter mais informações, consulte Lidar com exceções transitórias do serviço Lambda.

Lidando com uma falha usando Catch

Este exemplo usa um campo Catch. Quando uma função Lambda gera um erro, ela detecta o erro e a máquina de estado faz a transição para o estado. fallback

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Catch": [ { "ErrorEquals": ["HandledError"], "Next": "fallback" } ], "End": true }, "fallback": { "Type": "Pass", "Result": "Hello, AWS Step Functions!", "End": true } } }

Essa variante usa o código de erro predefinidoStates.TaskFailed, que corresponde a qualquer erro gerado por uma função Lambda.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FailFunction", "Catch": [ { "ErrorEquals": ["States.TaskFailed"], "Next": "fallback" } ], "End": true }, "fallback": { "Type": "Pass", "Result": "Hello, AWS Step Functions!", "End": true } } }

Lidando com um tempo limite usando Retry

Essa máquina de estado usa um Retry campo para repetir um Task estado que atinge o tempo limite, com base no valor de tempo limite especificado em. TimeoutSeconds Step Functions tenta novamente a invocação da função Lambda Task nesse estado duas vezes, com um recuo exponencial entre as novas tentativas.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:sleep10", "TimeoutSeconds": 2, "Retry": [ { "ErrorEquals": ["States.Timeout"], "IntervalSeconds": 1, "MaxAttempts": 2, "BackoffRate": 2.0 } ], "End": true } } }

Lidando com um tempo limite usando Catch

Este exemplo usa um campo Catch. Quando ocorre um tempo limite, a máquina de estado muda para o estado fallback.

{ "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:sleep10", "TimeoutSeconds": 2, "Catch": [ { "ErrorEquals": ["States.Timeout"], "Next": "fallback" } ], "End": true }, "fallback": { "Type": "Pass", "Result": "Hello, AWS Step Functions!", "End": true } } }
nota

Você pode preservar a entrada de estado e o erro usando ResultPath. Consulte Use ResultPath para incluir erro e entrada em um Catch.