Como posso resolver os erros que recebo ao integrar o API Gateway com uma função do Lambda?

7 minuto de leitura
0

Quero resolver os erros que recebo quando integro o Amazon API Gateway com uma função do AWS Lambda.

Resolução

Ative o log para sua API e estágio

1.    No console do API Gateway, encontre o Editor de estágio para sua API.

2.    No painel Editor de estágio, escolha a guia Logs/Rastreamento.

3.    Na guia Logs/Rastreamento, em Configurações do CloudWatch, faça o seguinte para ativar o log:
Escolha a caixa de seleção Ativar logs do CloudWatch.
Em Nível de log, escolha INFO para gerar logs para todas as solicitações. Ou escolha ERROR para gerar logs somente para solicitações à sua API que resultam em um erro.
Para APIs REST, escolha a caixa de seleção Registrar dados completos de solicitações/respostas. Ou, para APIs de WebSocket, escolha a caixa de seleção Registrar dados completos da mensagem.

4.    Em Log de acesso personalizado, faça o seguinte para ativar o log de acesso:
Escolha a caixa de seleção Ativar log de acesso.
Em ARN de destino do log de acesso, insira o nome do recurso da Amazon (ARN) de um grupo de logs do CloudWatch ou um fluxo do Amazon Kinesis Data Firehose.
Insira um Formato de log. Para diretrizes, escolha CLF, JSON, XML ou CSV para ver um exemplo nesse formato.

5.    Escolha Salvar alterações.
Observação: o console não confirma que as configurações foram salvas.

Para obter mais informações, consulte Configurar o log da API do CloudWatch usando o console do API Gateway.

Determine os tipos de integração, verifique os erros e dê os próximos passos

1.    Determine se uma integração de proxy do Lambda ou uma integração personalizada do Lambda está configurada no API Gateway. Você pode verificar o tipo de integração verificando a saída da função do Lambda ou executando o comando get-integration.

2.    Verifique se os erros no API Gateway correspondem aos erros no Lambda. Execute a seguinte consulta do CloudWatch Logs Insights para encontrar um código de status de erro durante um período especificado:

parse @message '(*) *' as reqId, message
    | filter message like /Method completed with status: \d\d\d/
    | parse message 'Method completed with status: *' as status
    | filter status != 200
    | sort @timestamp asc
    | limit 50

Em seguida, execute a seguinte consulta do CloudWatch Logs Insights para pesquisar logs de erros do Lambda durante o mesmo período:

fields @timestamp, @message
    | filter @message like /(?i)(Exception|error|fail)/
    | sort @timestamp desc
    | limit 20

3.    Com base no tipo de erro que você identifica em seus logs, escolha uma das seguintes opções:

Se você receber o erro a seguir, conclua as etapas na seção Resolver problemas de simultaneidade.

(XXXXX) Lambda invocation failed with status: 429. Lambda request id: XXXXXXXXXX
(XXXXX) Execution failed due to configuration error: Rate Exceeded.
(XXXXX) Method completed with status: 500

Se você receber um dos seguintes erros, conclua as etapas na seção Resolver problemas de tempo limite.

Para uma integração personalizada com o Lambda:

< 29 sec:
(XXXXX) Method response body after transformations: {"errorMessage":"2019-08-14T02:45:14.133Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

Para uma integração de proxy com o Lambda:

< 29 sec:
(XXXXX) Endpoint response body before transformations: {"errorMessage":"2019-08-14T02:50:25.865Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

Se você receber o erro a seguir, conclua as etapas na seção Resolver erros de função.

(XXXXX) Execution failed due to configuration error: Malformed Lambda proxy response
(XXXXX) Method response body after transformations: {"errorMessage": "Syntax error in module 'lambda_function'"}

Resolver problemas de simultaneidade

Você recebe 429 erros de controle de utilização ou 500 erros quando solicitações adicionais chegam do API Gateway mais rápido do que sua função do Lambda pode escalar.

Para resolver esses erros, analise as métricas Count (API Gateway), Throttles (Lambda) e ConcurrentExecutions (Lambda) no CloudWatch. Considere o seguinte:

  • Count (API Gateway) é o número total de solicitações de API em um determinado período.
  • Throttles (Lambda) são o número de solicitações de invocação que têm controle de utilização. Quando todas as instâncias da função estão processando solicitações e nenhuma simultaneidade está disponível para aumentar a escala verticalmente, o Lambda rejeita solicitações adicionais com o erro TooManyRequestsException. Solicitações com controle de utilização e outros erros de invocação não contam como invocações ou erros.
  • ConcurrentExecutions (Lambda) é o número de instâncias da função que estão processando eventos. Se esse número atingir sua cota de execuções simultâneas para a região da AWS, as solicitações de invocação adicionais serão controladas. As solicitações de invocação também são controladas quando o número de instâncias da função atinge o limite de simultaneidade reservado que você configurou na função.

Observação: para obter mais informações, consulte Métricas do API Gateway e Trabalhar com métricas da função do Lambda.

Se você definir a simultaneidade de reserva em sua função do Lambda, defina um valor de simultaneidade de reserva maior para a função do Lambda. Ou remova o valor de simultaneidade de reserva da função do Lambda. Em seguida, a função acessa o conjunto de execuções simultâneas sem reservas.

Se você não definir a simultaneidade de reserva na função do Lambda, verifique a métrica ConcurrentExecutions para descobrir o uso. Para obter mais informações, consulte Cotas do Lambda.

Resolver problemas de tempo limite

O tempo limite de integração é de 29 segundos, sem exceção, para todas as integrações do API Gateway. Você pode encontrar dois cenários ao criar uma API do API Gateway com integração com o Lambda. Os cenários são quando o tempo limite é menor que 29 segundos ou maior que 29 segundos.

Se o tempo limite da função do Lambda for menor que 29 segundos, verifique seus logs do Lambda para investigar esse problema. Se sua função do Lambda precisar ser executada após 29 segundos, considere invocar a função do Lambda de maneira assíncrona.

Para a integração personalizada do Lambda, conclua as seguintes etapas:

1.    Abra o console do API Gateway.

2.    No painel de navegação, escolha APIs e, em seguida, escolha sua API.

3.    Escolha Recursos e, em seguida, escolha seu método.

4.    Escolha Solicitação de integração.

5.    Escolha Método de solicitação.

6.    Expanda Cabeçalhos de solicitação HTTP.

7.    Escolha Adicionar cabeçalho.

8.    Em Nome, insira um nome para o cabeçalho. Por exemplo: X-Amz-Invocation-Type

Importante: você deve mapear seu cabeçalho a partir de 'Evento' (aspas simples são obrigatórias).

Para integração de proxy com o Lambda:

Use duas funções do Lambda: função A e função B. O API Gateway primeiro invoca a função A de maneira síncrona. Em seguida, a função A invoca a função B de maneira assíncrona. A função A pode retornar uma resposta bem-sucedida ao API Gateway quando a função B é invocada de maneira assíncrona.

Se você estiver usando a integração de proxy com o Lambda, considere alterá-la para uma integração personalizada. No entanto, você deve configurar os modelos de mapeamento para transformar a solicitação/resposta no formato desejado. Para obter mais informações, consulte Configurar a invocação assíncrona da função do Lambda de back-end.

Observação: como uma função do Lambda assíncrona é executada em segundo plano, seu cliente não pode receber dados diretamente de uma função do Lambda. Você deve ter um banco de dados intermediário para armazenar todos os dados persistentes.

Resolver erros de função

Se você receber um erro de função ao invocar sua API, verifique se há algum erro de sintaxe na função do Lambda. Esse erro também aparece se sua função do Lambda não está retornando um objeto JSON válido que o API Gateway espera para integrações de proxy.

Para resolver esse erro, conclua as etapas na seção Ativar log para sua API e estágio.


Informações relacionadas

Lidar com erros padrão do Lambda no API Gateway

Lidar com erros personalizados do Lambda no API Gateway