Resolva erros em aplicativos sem servidor

com o AWS Step Functions e o AWS Lambda

Neste tutorial, você aprenderá a usar o AWS Step Functions para resolver erros de tempo de execução do fluxo de trabalho. AWS Step Functions é um serviço de orquestração sem servidor que permite coordenar com facilidade várias funções do Lambda em fluxos de trabalho flexíveis, fáceis de depurar e alterar. AWS Lambda é um serviço de computação que permite que você execute o código sem provisionar ou gerenciar servidores. 

As funções do Lambda podem ocasionalmente falhar, como quando ocorre uma exceção não processada ou sua execução ultrapassa o tempo limite configurado ou não há memória suficiente. Desenvolver e manter a lógica de processamento de erros em cada função do Lambda, para lidar com situações como controle de utilização de API ou tempo limite de soquete, pode ser uma tarefa demorada e especialmente complexa para aplicativos distribuídos. Incorporar esse código em cada função do Lambda cria dependências entre elas. Além disso, pode ser difícil manter essas conexões em caso de mudanças.

Para evitar que isso aconteça e também reduzir o volume de código necessário para resolver erros, você pode usar o AWS Step Functions para criar um fluxo de trabalho sem servidor que lide com o processamento de erros de função. Independentemente de o erro ser uma exceção de função criada pelo desenvolvedor (por exemplo, arquivo não encontrado) ou ser imprevisível (por exemplo, memória insuficiente), você pode configurar o Step Functions permite responder com lógica condicional de acordo com o tipo de erro ocorrido. Com essa separação da lógica do fluxo de trabalho da lógica de negócios, é possível modificar a maneira como o fluxo de trabalho responde aos erros sem alterar a lógica de negócios das funções do Lambda.

Neste tutorial, você projetará e executará um fluxo de trabalho sem servidor usando o AWS Step Functions, que solucionará esses erros. Você criará uma função do AWS Lambda, que simulará chamadas para uma API RESTful e retornará vários códigos de resposta e exceções. Em seguida, você usará o AWS Step Functions para criar uma máquina de estado com recursos de Retry (Tentar novamente) e Catch (Detectar) que responde com lógica diferente dependendo da exceção gerada.

Este tutorial exige uma conta da AWS

Não há cobranças adicionais para o AWS Step Functions nem para o AWS Lambda. Os recursos criados neste tutorial estão qualificados para o nível gratuito. 

Saiba mais sobre o nível gratuito >>


Etapa 1. Criar uma função do Lambda para simular uma API

Nesta etapa, você criará uma função do Lambda que simulará algumas interações básicas da API. A função do Lambda gera exceções para simular respostas de uma API fictícia, dependendo do código de erro que você usou no parâmetro do evento.


a.  Abra o Console de Gerenciamento da AWS para poder manter este guia detalhado aberto. Quando a tela carregar, digite seu nome de usuário e senha para começar. Em seguida, digite Lambda na barra de pesquisa e selecione Lambda para abrir o console do serviço.

01a
01a

(clique para aumentar)


b. Selecione Create a function (Criar função).

01b
01b

(clique para aumentar)


c. Deixe a opção Author from scratch (Criar do zero) marcada. Em seguida, configure a função do Lambda da seguinte maneira:

Para Name (Nome), digite MockAPIFunction.
Para Runtime (Tempo de execução), selecione Python 3.6.
Para Role (Função) selecione Create custom role (Criar função personalizada).

Uma nova janela do IAM será exibida. Mantenha a opção Role name (Nome da função) como lambda_basic_execution e clique em Allow (Permitir). Você retornará automaticamente ao console do Lambda.

Clique em Create function (Criar função).

01c
01c

(clique para aumentar)


d. Na tela MockAPIFunction, role para baixo até a seção Function code (Código da função). Neste tutorial, você criará uma função que usa o modelo de programação para criação de funções do Lambda no Python. Na janela do código, substitua todo o código pelas informações abaixo e selecione Save (Salvar).

class TooManyRequestsException(Exception): pass
class ServerUnavailableException(Exception): pass
class UnknownException(Exception): pass

def lambda_handler(event, context):
    statuscode = event["statuscode"]    
    if statuscode == "429":
        raise TooManyRequestsException('429 Too Many Requests')
    elif statuscode == "503":
        raise ServerUnavailableException('503 Server Unavailable')
    elif statuscode == "200":
        return '200 OK'
    else:
        raise UnknownException('Unknown error')
01d
01d

(clique para aumentar)


e. Depois que a função do Lambda for criada, role a tela até a parte superior da janela e veja o nome de recurso da Amazon (ARN) no canto superior direito da página. Os nomes de recurso da Amazon (ARNs) identificam com exclusividade os recursos da AWS e ajudam você a monitorar e usar itens e políticas da AWS nos serviços da AWS e nas chamadas de API. Um ARN é necessário quando precisamos fazer referência a um recurso específico do Step Functions.

01e
01e

(clique para aumentar)


Etapa 2. Criar uma função de AWS Identity and Access Management (IAM)

O AWS Step Functions pode executar código e acessar outros recursos da AWS (por exemplo, dados armazenados em buckets do Amazon S3). Para manter a segurança, é preciso conceder acesso do Step Functions a esses recursos usando o AWS Identity and Access Management (IAM).


a. Em outra janela do navegador, acesse o Console de Gerenciamento da AWS e digite IAM na barra de pesquisa. Clique no IAM para abrir o console do serviço.

02a
02a

(clique para aumentar)


b. Clique em Roles (Funções) e escolha Create Role (Criar função).

02b
02b

(clique para aumentar)


c. Na página Select type of trusted entity (Selecionar tipo de entidade de confiança), em AWS service (Serviço da AWS), selecione Step Functions na lista e, em seguida, Next: Permissions (Próximo: Permissões).

02c
02c

(clique para aumentar)


d. Na página Attach permissions policy (Anexar política de permissões), escolha Next: Review (Próximo: Revisar).

 

02d
02d

(clique para aumentar)


e. Na página Review (Revisar), digite step_functions_basic_execution para Role name (Nome da função) e clique em Create role (Criar função).

02e
02e

(clique para aumentar)


f. Sua nova função do IAM foi criada e aparece na lista abaixo da função do IAM da sua função do Lambda.

02f
02f

(clique para aumentar)


Etapa 3. Criar uma máquina de estado do Step Functions

Agora que está criada a sua função simples do Lambda que simula uma resposta de API, você pode criar uma máquina de estado do Step Functions para chamar a API e solucionar as exceções.

Nesta etapa, você usará o console do Step Functions para criar uma máquina de estado que usa um estado de tarefa com um campo de Retry (Tentar novamente) e Catch (Detectar) para lidar com os vários códigos de resposta da API. Você usará um estado de Tarefa para chamar sua função do Lambda da API simulada, que retornará o código de status da API informado na máquina de estado.


a. Abra o console do AWS Step Functions. Na página Create a state machine (Criar uma máquina de estado), selecione Author from scratch (Criar do zero). Na seção Details (Detalhes), nomeie sua máquina de estado como MyAPIStateMachine e selecione I will use an existing role (Usarei uma função existente).

03c
03c

(clique para aumentar)


b. Em seguida, você projetará uma máquina de estado que executará diversas ações de acordo com a resposta da API simulada. Se a API não for acessada, o fluxo de trabalho tentará novamente. Novas tentativas são um meio útil de lidar com erros momentâneos. O fluxo de trabalho também detecta diversas exceções lançadas pela API simulada.

Substitua o conteúdo da seção State machine definition (Definição de máquina de estado) pelo seguinte código:

{
  "Comment": "An example of using retry and catch to handle API responses",
  "StartAt": "Call API",
  "States": {
    "Call API": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next" : "OK",
      "Comment": "Catch a 429 (Too many requests) API exception, and resubmit the failed request in a rate-limiting fashion.",
      "Retry" : [ {
        "ErrorEquals": [ "TooManyRequestsException" ],
        "IntervalSeconds": 1,
        "MaxAttempts": 2
      } ],
      "Catch": [ 
        {
          "ErrorEquals": ["TooManyRequestsException"],
          "Next": "Wait and Try Later"
        }, {
          "ErrorEquals": ["ServerUnavailableException"],
          "Next": "Server Unavailable"
        }, {
          "ErrorEquals": ["States.ALL"],
          "Next": "Catch All"
        }
      ]
    },
    "Wait and Try Later": {
      "Type": "Wait",
      "Seconds" : 1,
      "Next" : "Change to 200"
    },
    "Server Unavailable": {
      "Type": "Fail",
      "Error":"ServerUnavailable",
      "Cause": "The server is currently unable to handle the request."
    },
    "Catch All": {
      "Type": "Fail",
      "Cause": "Unknown error!",
      "Error": "An error of unknown type occurred"
    },
    "Change to 200": {
      "Type": "Pass",
      "Result": {"statuscode" :"200"} ,
      "Next": "Call API"
    },
    "OK": {
      "Type": "Pass",
      "Result": "The request has succeeded.",
      "End": true
    }
  }
}
03d
03d

(clique para aumentar)


c. Localize a linha “Resource” (Recurso) no estado de tarefa “Call API” (Chamar API) (linha 7). Para atualizar esse ARN com o ARN da função do Lambda da API simulada recém-criada, clique no texto do ARN e selecione o ARN na lista.

03e
03e

(clique para aumentar)


d. Clique no botão de atualização ao lado do painel de fluxo de trabalho visual para que o Step Functions crie um diagrama da máquina de estado que corresponda ao fluxo de trabalho recém-projetado. Depois de revisar o fluxo de trabalho visual, clique em Create state machine (Criar máquina de estado).

03f
03f

(clique para aumentar)


Etapa 4. Testar o fluxo de trabalho de resolução de erros

Para testar seu fluxo de trabalho de solução de erros, você usará o código de erro para invocar a máquina de estado para chamar a API simulada.


a. Clique em Start execution (Iniciar execução).

04a
04a

(clique para aumentar)


b. Uma nova caixa de diálogo de execução é exibida, onde é possível inserir informações para a máquina de estado. Você executará a parte da API e informará o código de erro que desejamos que a API simulada retorne. Substitua o texto existente pelo código abaixo e escolha Start execution (Iniciar execução):

{
    "statuscode": "200"
}
04b
04b

(clique para aumentar)


c. Na telaExecution details (Detalhes de execução), clique em Input (Entrada) para ver as informações fornecidas à máquina de estado. Em seguida, clique em Output (Saída) para visualizar o resultado da execução da máquina de estado. Você pode ver que o fluxo de trabalho interpretou o código de status 200 como uma chamada de API bem-sucedida.

04c
04c

(clique para aumentar)


d. Em Visual workflow (Fluxo de trabalho visual), você pode ver o caminho de execução, exibido em verde no fluxo de trabalho. Clique no estado de tarefa "Call API" (Chamar API) e expanda os campos Input (Entrada) e Output (Saída) na tela Step details (Detalhes da etapa).

Você pode ver que esse estado de tarefa invocou com êxito a função do Lambda da API simulada com as informações fornecidas e capturou a saída da função do Lambda, “200 OK”.

04d
04d

(clique para aumentar)


e. Clique no estado de tarefa "OK" no fluxo de trabalho visual. Em Step details (Detalhes da etapa), você pode ver que a saída da etapa anterior (o estado de tarefa Chamar API) foi passada como entrada para esta etapa. O estado OK é um estado de passagem, ou seja, a entrada passou para a saída, sem executar qualquer trabalho. Os estados de passagem são úteis na construção e depuração de máquinas de estado.

04e
04e

(clique para aumentar)


Etapa 5. Inspecionar a execução da máquina de estado


a. Role até a parte superior da tela Execution details (Detalhes de execução) e clique em MyAPIStateMachine.

05a
05a

(clique para aumentar)


b. Clique novamente em Start execution (Iniciar execução) e, desta vez, forneça as seguintes informações e clique em Start execution (Iniciar execução).

{
    "statuscode": "503"
}
05b
05b

(clique para aumentar)


c. Na seção Execution event history (Histórico de eventos de execução), expanda cada etapa de execução para confirmar se o fluxo de trabalho se comportou como esperado. Esperávamos que esta execução falhasse, não se preocupe! Você perceberá o seguinte:

  1. O Step Functions capturou sua entrada de informações
  2. Essas informações passaram para o estado de tarefa Chamar API
  3. O estado de tarefa Chamar API chamou MockAPIFunction usando essas informações
  4. MockAPIFunction foi executada
  5. MockAPIFunction falhou com ServerUnavailableException
  6. A instrução de detecção do estado de tarefa Chamar API detectou essa exceção
  7. A instrução de detecção falhou no fluxo de trabalho
  8. A máquina de estado concluiu sua execução
05c
05c

(clique para aumentar)


d. Em seguida, você simulará uma exceção 429. Role até a parte superior da tela Execution details (Detalhes de execução) e clique em MyAPIStateMachine. Clique em Start execution (Iniciar execução) e forneça as seguintes informações e clique em Start execution (Iniciar execução):

{
    "statuscode": "429"
}
05d
05d

(clique para aumentar)


e. Agora você inspecionará o comportamento de novas tentativas do fluxo de trabalho. Na seção Execution event history (Histórico de eventos de execução), expanda cada etapa de execução mais uma vez para confirmar que o Step Functions tentou chamar a função MockAPILambda mais duas vezes, e ambas falharam. Nesse momento, o fluxo de trabalho passou para o estado Aguardar e tentar mais tarde (indicado na imagem à direita), na esperança de que a indiferença da API fosse apenas temporária.

Em seguida, o estado Aguardar usou a força bruta para mudar o código de resposta para 200, e o fluxo de trabalho concluiu a execução com êxito. Provavelmente você não agiria dessa forma com uma exceção 429 em um aplicativo real, mas estamos tentando simplificar neste tutorial.

05e
05e

(clique para aumentar)


f. Execute uma ou mais instâncias do fluxo de trabalho e, desta vez, forneça uma resposta da API aleatória que não seja processada por sua máquina de estado:

{
    "statuscode": "999"
}

Inspecione novamente a execução usando o Histórico de eventos de execução. Ao terminar, clique em MyAPIStateMachine mais uma vez. No painel Executions (Execuções), você pode ver o histórico de todas as execuções do fluxo de trabalho e acessar cada uma individualmente se quiser.

05f
05f

(clique para aumentar)


Etapa 6. Encerrar seus recursos

Nesta etapa, você encerrará os recursos relacionados ao AWS Step Functions e ao AWS Lambda.

Importante: é recomendável encerrar os recursos que não estão em uso, pois isso reduz custos. Pode haver cobranças caso os recursos não sejam encerrados.


a. Na parte superior da janela do console do AWS Step Functions, clique em State machines (Máquinas de estado).

06a
06a

(clique para aumentar)


b. Na janela State machines (Máquinas de estado), clique em MyAPIStateMachine e selecione Delete (Excluir). Confirme a ação selecionando Delete state machine (Excluir máquina de estado) na caixa de diálogo. Sua máquina de estado será excluída em um ou dois minutos assim que o Step Functions confirmar as execuções em andamento estão concluídas.

06b
06b

(clique para aumentar)


c. Em seguida, você excluirá as funções do Lambda. Clique em Services (Serviços) no menu do Console de Gerenciamento da AWS e selecione Lambda.

06c
06c

(clique para aumentar)


d. Na tela Functions (Funções), clique em MockAPIFunction, selecione Actions (Ações) e Delete (Excluir). Confirme a exclusão clicando novamente em Delete (Excluir).

06d
06d

(clique para aumentar)


e. Por último, você excluirá todas as funções do IAM. Clique em Services (Serviços) no menu do Console de Gerenciamento da AWS e selecione IAM.

06e
06e

(clique para aumentar)


f. Selecione as duas funções do IAM que você criou para este tutorial e clique em Delete role (Excluir função). Confirme a exclusão clicando em Yes, Delete (Sim, excluir) na caixa de diálogo.


Agora você pode fazer logout no Console de Gerenciamento da AWS.

06f
06f

(clique para aumentar)


Parabéns!

Você usou o AWS Step Functions e o AWS Lambda para criar um fluxo de trabalho de solução de erros para uma API de rede. Com o AWS Lambda, você pode executar código para praticamente qualquer tipo de aplicativo ou serviço de back-end. Tudo isso sem necessidade de administração. Basta fazer upload do código que o Lambda se encarrega de todos os itens necessários para executar e alterar a escala do código com alta disponibilidade.

A combinação do AWS Step Functions com o AWS Lambda simplifica a orquestração das funções do AWS Lambda para aplicativos sem servidor. Com o Step Functions, você pode controlar fluxos de trabalho complexos usando funções do Lambda sem gerenciamento do aplicativo subjacente e orquestração do estado. Você pode usar o Step Functions para orquestração de microsserviços usando recursos de computação como Amazon EC2 e Amazon ECS.