Solução de problemas com integrações do Lambda para APIs HTTP - Amazon API Gateway

Solução de problemas com integrações do Lambda para APIs HTTP

O tópico a seguir fornece orientações para a solução de erros e problemas que podem ser encontrados durante o uso de AWS LambdaIntegrações do com APIs HTTP.

Problema: minha API com uma integração do Lambda retorna {"message":"Internal Server Error"}

Para solucionar o erro interno do servidor, adicione a $context.integrationErrorMessage variável de registro em log ao formato de log e visualize os logs da API HTTP. Para conseguir isso, faça o seguinte:

Como criar um grupo de logs usando o AWS Management Console
  1. Abra o console do CloudWatch em https://console.aws.amazon.com/cloudwatch/.

  2. Escolha Grupos de logs.

  3. Escolha Criar grupo de logs.

  4. Insira um nome para o grupo de logs e escolha Criar.

  5. Anote o nome de recurso da Amazon (ARN) do grupo de logs. O formato do ARN é arn:aws:logs:region: account-id:log-group:log-group-name. O ARN do grupo de logs é necessário para habilitar o registro de acesso em logs para a API HTTP.

Como adicionar a variável de registro em log $context.integrationErrorMessage
  1. Inicie uma sessão no console do API Gateway em https://console.aws.amazon.com/apigateway.

  2. Escolha sua API HTTP.

  3. Em Monitor, escolha Registro em log.

  4. Selecione um estágio da API.

  5. Escolha Editar e habilite o registro de acesso em logs.

  6. Para o destino do log, insira o ARN do grupo de log que você criou na etapa anterior.

  7. Em Formato de log, escolha CLF. O API Gateway cria um exemplo de formato de log.

  8. Adicione $context.integrationErrorMessage ao final do formato de log.

  9. Escolha Save (Salvar).

Como visualizar os logs da API
  1. Gere os logs. Use um navegador ou curl para invocar a API.

    $curl https://api-id.execute-api.us-west-2.amazonaws.com/route
  2. Inicie uma sessão no console do API Gateway em https://console.aws.amazon.com/apigateway.

  3. Escolha sua API HTTP.

  4. Em Monitor, escolha Registro em log.

  5. Selecione o estágio da API para o qual você habilitou o registro em log.

  6. Escolha View logs in CloudWatch (Exibir logs no CloudWatch).

  7. Escolha o stream de logs mais recente para visualizar os logs da API HTTP.

  8. A entrada de log deve ser semelhante à seguinte:

    Entrada de log do CloudWatch Logs mostrando a mensagem de erro de integração do Lambda.

Como adicionamos $context.integrationErrorMessage ao formato de log, vemos uma mensagem de erro nos logs que resume o problema.

Os logs podem incluir uma mensagem de erro diferente que indica que há um problema com o código de função do Lambda. Nesse caso, confira o código de função do Lambda e verifique se a função do Lambda retorna uma resposta no formato necessário. Se os logs não incluírem uma mensagem de erro, adicione $context.error.message e $context.error.responseType ao seu formato de log para obter mais informações para ajudar a solucionar problemas.

Nesse caso, os logs mostram que o API Gateway não tinham as permissões necessárias para invocar a função do Lambda.

Quando você cria uma integração do Lambda no console do API Gateway, este configura automaticamente as permissões para invocar a função do Lambda. Ao criar uma integração do Lambda usando a AWS CLI, AWS CloudFormation ou um SDK, você deve conceder permissões para o API Gateway invocar a função. Os comandos de exemplo da AWS CLI a seguir concedem permissões para diferentes rotas da API HTTP invocarem uma função do Lambda.

exemplo Exemplo: para o estágio $default e a rota $default de uma API HTTP
aws lambda add-permission \ --function-name my-function \ --statement-id apigateway-invoke-permissions \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:us-west-2:123456789012:api-id/\$default/\$default"
exemplo Exemplo: para o estágio prod e a rota test de uma API HTTP
aws lambda add-permission \ --function-name my-function \ --statement-id apigateway-invoke-permissions \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:us-west-2:123456789012:api-id/prod/*/test"

Confirme a política de função na guia Permissions (Permissões) do console do Lambda.

Tente invocar a API novamente. Você deverá ver a resposta da função do Lambda.