AWS Lambda
Guia do desenvolvedor

Erros da função do AWS Lambda em C#

Quando ocorrer uma exceção em sua função do Lambda, o Lambda reportará as informações da exceção de volta para você. As exceções pode ocorrer em dois locais diferentes:

  • Inicialização (carregamento de seu código pelo Lambda, validação da string do manipulador e criação de uma instância de sua classe se ela não for estática).

  • Invocação da função do Lambda.

As informações da exceção serializada são retornadas como a carga na forma de um objeto JSON modelado e emitidas para os logs do CloudWatch.

Na fase de inicialização, exceções podem ser geradas para strings de manipulador inválidas, um tipo ou método de violação de regra (consulte Restrições do manipulador de função do Lambda ) ou qualquer outro método de validação (como ignorar o atributo do serializador e ter um POCO como seu tipo de entrada ou saída). Essas exceções são do tipo LambdaException. Por exemplo:

{ "errorType": "LambdaException", "errorMessage": "Invalid lambda function handler: 'http://this.is.not.a.valid.handler/'. The valid format is 'ASSEMBLY::TYPE::METHOD'." }

Se o seu construtor gerar uma exceção, o tipo de erro também será do tipo LambdaException, mas a exceção gerada durante a construção é fornecida na propriedade cause, que é em si um objeto de exceção modelado:

{ "errorType": "LambdaException", "errorMessage": "An exception was thrown when the constructor for type 'LambdaExceptionTestFunction.ThrowExceptionInConstructor' was invoked. Check inner exception for more details.", "cause": { "errorType": "TargetInvocationException", "errorMessage": "Exception has been thrown by the target of an invocation.", "stackTrace": [ "at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean&canBeCached, RuntimeMethodHandleInternal&ctor, Boolean& bNeedSecurityCheck)", "at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)", "at System.Activator.CreateInstance(Type type, Boolean nonPublic)", "at System.Activator.CreateInstance(Type type)" ], "cause": { "errorType": "ArithmeticException", "errorMessage": "Sorry, 2 + 2 = 5", "stackTrace": [ "at LambdaExceptionTestFunction.ThrowExceptionInConstructor..ctor()" ] } } }

Como mostra o exemplo, as exceções internas são sempre preservadas (como a propriedade cause) e podem ser profundamente aninhadas.

Exceções também podem ocorrer durante a invocação. Neste caso, o tipo de exceção é preservado e a exceção é retornada diretamente como a carga e nos logs do CloudWatch. Por exemplo:

{ "errorType": "AggregateException", "errorMessage": "One or more errors occurred. (An unknown web exception occurred!)", "stackTrace": [ "at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)", "at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)", "at lambda_method(Closure , Stream , Stream , ContextInfo )" ], "cause": { "errorType": "UnknownWebException", "errorMessage": "An unknown web exception occurred!", "stackTrace": [ "at LambdaDemo107.LambdaEntryPoint.<GetUriResponse>d__1.MoveNext()", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()", "at LambdaDemo107.LambdaEntryPoint.<CheckWebsiteStatus>d__0.MoveNext()" ], "cause": { "errorType": "WebException", "errorMessage": "An error occurred while sending the request. SSL peer certificate or SSH remote key was not OK", "stackTrace": [ "at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)", "at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()", "at LambdaDemo107.LambdaEntryPoint.<GetUriResponse>d__1.MoveNext()" ], "cause": { "errorType": "HttpRequestException", "errorMessage": "An error occurred while sending the request.", "stackTrace": [ "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Net.Http.HttpClient.<FinishSendAsync>d__58.MoveNext()", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Net.HttpWebRequest.<SendRequest>d__63.MoveNext()", "--- End of stack trace from previous location where exception was thrown ---", "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)", "at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)", "at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)" ], "cause": { "errorType": "CurlException", "errorMessage": "SSL peer certificate or SSH remote key was not OK", "stackTrace": [ "at System.Net.Http.CurlHandler.ThrowIfCURLEError(CURLcode error)", "at System.Net.Http.CurlHandler.MultiAgent.FinishRequest(StrongToWeakReference`1 easyWrapper, CURLcode messageResult)" ] } } } } }

O método no qual as informações de erro são transmitidas depende do tipo de invocação:

  • Tipo de invocação RequestResponse (ou seja, execução síncrona): nesse caso, você recebe uma mensagem de erro de volta.

    Por exemplo, se você invocar uma função do Lambda usando o console do Lambda, a RequestResponse será sempre o tipo de invocação e o console exibirá as informações de erro retornadas pelo AWS Lambda na seção Resultado da execução do console.

  • Tipo de invocação Event (ou seja, execução assíncrona): nesse caso, o AWS Lambda não retorna nada. Em vez disso, ele registra as informações de erro em métricas do CloudWatch Logs e do CloudWatch.

Dependendo da origem do evento, o AWS Lambda pode executar novamente a função do Lambda que falhou. Para obter mais informações, consulte Lidar com erros e novas tentativas automáticas no AWS Lambda.

Tratamento de erros de funções

Você pode criar um tratamento de erros personalizado para gerar uma exceção diretamente de sua função do Lambda e lidar com ela diretamente (tentar novamente ou capturar) em uma máquina de estado do AWS Step Functions. Para obter mais informações, consulte Tratamento de condições de erro usando uma máquina de estado.

Considere o estado CreateAccount como uma tarefa que grava os detalhes de um cliente no banco de dados usando uma função do Lambda.

  • Se a tarefa for bem-sucedida, uma conta será criada e um e-mail de boas-vindas será enviado.

  • Se um usuário tenta criar uma conta com um nome de usuário que já existe, a função do Lambda gera um erro, fazendo com que a máquina de estado sugira um nome de usuário diferente e tente novamente o processo de criação da conta.

O exemplo de código a seguir demonstra como fazer isso. Observe que erros personalizados em C# devem estender a classe Exception.

namespace Example { public class AccountAlreadyExistsException : Exception { public AccountAlreadyExistsException(String message) : base(message) { } } } namespace Example { public class Handler { public static void CreateAccount() { throw new AccountAlreadyExistsException("Account is in use!"); } } }

Você pode configurar o Step Functions para capturar o erro usando uma regra Catch. O Lambda define automaticamente o nome do erro como o nome de classe simples da exceção em tempo de execução:

{ "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:CreateAccount", "Next": "SendWelcomeEmail", "Catch": [ { "ErrorEquals": ["AccountAlreadyExistsException"], "Next": "SuggestAccountName" } ] }, … } }

Durante o tempo de execução, o AWS Step Functions captura o erro, mudando para o estado SuggestAccountName como especifica a transição Next.

O tratamento de erros personalizado facilita a criação de aplicativos sem servidor. Esse recurso é integrado a todas as linguagens compatíveis com o modelo de programação do Lambda, permitindo que você crie seus aplicativos nas linguagens de programação da sua escolha, misturando e combinando ao longo do processo.

Para saber mais sobre a criação de seus próprios aplicativos sem servidor usando o AWS Step Functions e o AWS Lambda, consulte AWS Step Functions.