

# Solución de problemas con las API de HTTP en API Gateway
<a name="http-api-troubleshooting"></a>

Los siguientes temas le proporcionan consejos para solucionar errores y problemas que puedan surgir al utilizar API HTTP.

**Topics**
+ [Solución de problemas con las integraciones de Lambda para API HTTP](http-api-troubleshooting-lambda.md)
+ [Solución de problemas con los autorizadores JWT de la API HTTP](http-api-troubleshooting-jwt.md)

# Solución de problemas con las integraciones de Lambda para API HTTP
<a name="http-api-troubleshooting-lambda"></a>

A continuación se proporcionan consejos para solucionar errores y problemas que puedan surgir al utilizar [AWS LambdaIntegraciones de ](http-api-develop-integrations-lambda.md) con API HTTP.

## Problema: mi API con una integración de Lambda devuelve `{"message":"Internal Server Error"}`
<a name="http-api-troubleshooting-lambda-internal-server-error"></a>

Para solucionar el error interno del servidor, agregue la [variable de registro](http-api-logging-variables.md) `$context.integrationErrorMessage` al formato de registro y vea sus registros de API HTTP. Para ello, haga lo siguiente:

**Para crear un grupo de registros a través de la Consola de administración de AWS**

1. Abra la consola de CloudWatch en [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. Elija **Log groups (Grupos de registros)**.

1. Elija **Create log group (Crear grupo de registros)**.

1. Escriba un nombre de grupo de registros y, a continuación, elija **Create (Crear)**.

1. Anote el nombre de recurso de Amazon (ARN) de su grupo de registros. El formato ARN es arn:aws:logs: *region*: *account-id*:log-group:*log-group-name*. Necesita el ARN del grupo de registros para habilitar el registro de acceso a su API HTTP.

**Para agregar la variable de registro `$context.integrationErrorMessage`**

1. Inicie sesión en la consola de API Gateway, en [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Elija su API HTTP.

1. En **Monitorización**, elija **Registro**.

1. Seleccione una etapa de su API.

1. Elija **Edit (Editar)** y, a continuación, habilite el registro de acceso.

1. En **Log destination (Destino del registro)**, introduzca el ARN del grupo de registros que creó en el paso anterior.

1. En **Formato de registro**, elija **CLF**. API Gateway crea un formato de registro de ejemplo. 

1. Agregue `$context.integrationErrorMessage` al final del formato de registro.

1. Seleccione **Guardar**.

**Para ver los registros de la API**

1. Generación de registros. Utilice un navegador o `curl` para invocar su API.

   ```
   $curl https://api-id.execute-api.us-west-2.amazonaws.com/route
   ```

1. Inicie sesión en la consola de API Gateway, en [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Elija su API HTTP.

1. En **Monitorización**, elija **Registro**.

1. Seleccione la etapa de la API para la cual habilitó el registro.

1. Elija **View logs in CloudWatch (Ver registros en CloudWatch)**.

1. Elija la última secuencia de registro para ver sus registros de API HTTP.

1. Su entrada de registro debe tener un aspecto similar a este:  
![\[Entrada de registro de CloudWatch Logs que muestra el mensaje de error de integración de Lambda.\]](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/troubleshoot-http-api-logs.png)

Dado que agregamos `$context.integrationErrorMessage` al formato de registro, vemos un mensaje de error en nuestros registros que resume el problema. 

Los registros pueden incluir un mensaje de error diferente que indica que hay un problema con el código de función de Lambda. En ese caso, verifique su código de función de Lambda y compruebe que su función de Lambda devuelva una respuesta en el [formato necesario](http-api-develop-integrations-lambda.md#http-api-develop-integrations-lambda.response). Si los registros no incluyen un mensaje de error, agregue `$context.error.message` y `$context.error.responseType` al formato de registro para obtener más información que le ayude a solucionar problemas.

En este caso, los registros muestran que API Gateway no tenía los permisos necesarios para invocar la función de Lambda.

Cuando crea una integración de Lambda en la consola de API Gateway, API Gateway configura automáticamente los permisos para invocar la función de Lambda. Cuando crea una integración de Lambda mediante la AWS CLI, CloudFormation o un SDK, debe conceder permisos para que API Gateway pueda invocar la función. Los siguientes comandos [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) conceden permiso para diferentes rutas de API HTTP para invocar una función de Lambda.

**Example Ejemplo: para la etapa `$default` y la ruta `$default` de una 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 Ejemplo: para la etapa `prod` y la ruta `test` de una 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 la política de la función](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) en la pestaña **Permisos** de la consola de Lambda.

Intente volver a invocar su API. Debería ver la respuesta de su función de Lambda.

# Solución de problemas con los autorizadores JWT de la API HTTP
<a name="http-api-troubleshooting-jwt"></a>

A continuación se le proporcionan consejos para solucionar errores y problemas que puedan surgir al utilizar los autorizadores de JSON Web Token (JWT) con API HTTP.

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

Compruebe el encabezado `www-authenticate` en la respuesta de la API.

El siguiente comando utiliza `curl` para enviar una solicitud a una API con un autorizador de JWT que utiliza `$request.header.Authorization` como su origen de identidad.

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

La respuesta de la API incluye un encabezado `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"}}
```

En este caso, el encabezado `www-authenticate` muestra que el token no se emitió para un destinatario válido. Para que API Gateway autorice una solicitud, la reclamación `aud` o `client_id` de JWT debe coincidir con una de las entradas de destinatario configuradas para el autorizador. API Gateway valida `client_id` solo si `aud` no está presente. Cuando `aud` y `client_id` están presentes, API Gateway evalúa `aud`. 

También puede decodificar un JWT y comprobar que coincida con el emisor, el destinatario y los ámbitos que requiere su API. El sitio web [jwt.io](https://jwt.io/) puede depurar JWT en el navegador. OpenID Foundation mantiene una [lista de bibliotecas para trabajar con JWT](https://openid.net/developers/jwt-jws-jwe-jwk-and-jwa-implementations/). 

Para obtener más información acerca de los autorizadores de JWT, consulte [Control del acceso a API HTTP con autorizadores de JWT en API Gateway](http-api-jwt-authorizer.md).