

# Solução de problemas com APIs HTTP no API Gateway
<a name="http-api-troubleshooting"></a>

Os tópicos a seguir fornecem orientações para a solução de erros e problemas que podem ser encontrados durante o uso de APIs HTTP.

**Topics**
+ [Solução de problemas com integrações do Lambda para APIs HTTP](http-api-troubleshooting-lambda.md)
+ [Solução de problemas com os autorizadores JWT da API HTTP](http-api-troubleshooting-jwt.md)

# Solução de problemas com integrações do Lambda para APIs HTTP
<a name="http-api-troubleshooting-lambda"></a>

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 ](http-api-develop-integrations-lambda.md) com APIs HTTP.

## Problema: minha API com uma integração do Lambda retorna `{"message":"Internal Server Error"}`
<a name="http-api-troubleshooting-lambda-internal-server-error"></a>

Para solucionar o erro interno do servidor, adicione a `$context.integrationErrorMessage` [variável de registro em log](http-api-logging-variables.md) 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 Console de gerenciamento da AWS**

1. Abra o console do CloudWatch em [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. Escolha **Grupos de logs**.

1. Escolha **Criar grupo de logs**.

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

1. 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](https://console.aws.amazon.com/apigateway).

1. Escolha sua API HTTP.

1. Em **Monitor**, escolha **Registro em log**.

1. Selecione um estágio da API.

1. Escolha **Editar** e habilite o registro de acesso em logs.

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

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

1. Adicione `$context.integrationErrorMessage` ao final do formato de log.

1. 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
   ```

1. Inicie uma sessão no console do API Gateway em [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Escolha sua API HTTP.

1. Em **Monitor**, escolha **Registro em log**.

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

1. Escolha **View logs in CloudWatch (Exibir logs no CloudWatch)**.

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

1. A entrada de log deve ser semelhante à seguinte:  
![\[Entrada de log do CloudWatch Logs mostrando a mensagem de erro de integração do Lambda.\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/troubleshoot-http-api-logs.png)

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](http-api-develop-integrations-lambda.md#http-api-develop-integrations-lambda.response). 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, CloudFormation ou um SDK, você deve conceder permissões para o API Gateway invocar a função. Os comandos [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) indicados abaixo concedem permissões para possibilitar que diferentes rotas da API HTTP invoquem uma função do Lambda.

**Example 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"
```

**Example 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](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) na guia **Permissions (Permissões)** do console do Lambda.

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

# Solução de problemas com os autorizadores JWT da API HTTP
<a name="http-api-troubleshooting-jwt"></a>

O tópico a seguir fornece orientações para a solução de erros e problemas que podem ser encontrados durante o uso dos autorizadores JSON Web Token (JWT) com APIs HTTP.

## Problema: minha API retorna `401 {"message":"Unauthorized"}`
<a name="http-api-troubleshooting-jwt.unauthorized"></a>

Verifique o cabeçalho `www-authenticate` na resposta da API.

O comando a seguir usa `curl` para enviar uma solicitação para uma API com um autorizador de JWT que usa `$request.header.Authorization` como sua origem de identidade.

```
$curl -v -H "Authorization: token" https://api-id.execute-api.us-west-2.amazonaws.com/route
```

A resposta da API inclui um cabeçalho `www-authenticate`.

```
...
< HTTP/1.1 401 Unauthorized
< Date: Wed, 13 May 2020 04:07:30 GMT
< Content-Length: 26
< Connection: keep-alive
< www-authenticate: Bearer scope="" error="invalid_token" error_description="the token does not have a valid audience"
< apigw-requestid: Mc7UVioPPHcEKPA=
<
* Connection #0 to host api-id.execute-api.us-west-2.amazonaws.com left intact
{"message":"Unauthorized"}}
```

Nesse caso, o cabeçalho `www-authenticate` mostra que o token não foi emitido para um público válido. Para o API Gateway autorizar uma solicitação, a declaração `aud` ou `client_id` do JWT deve corresponder a uma das entradas de público configuradas para o autorizador. O API Gateway valida `client_id` somente se `aud` não estiver presente. Quando `aud` e `client_id` estão presentes, o API Gateway avalia `aud`. 

Também é possível decodificar um JWT e verificar se ele corresponde ao emissor, ao público e aos escopos que a API exige. O site [jwt.io](https://jwt.io/) pode depurar JWTs no navegador. A OpenID Foundation mantém uma [lista de bibliotecas para trabalhar com JWTs](https://openid.net/developers/jwt-jws-jwe-jwk-and-jwa-implementations/). 

Para saber mais sobre os autorizadores JWT, consulte [Controlar o acesso a APIs HTTP com autorizadores JWT no API Gateway](http-api-jwt-authorizer.md).