He utilizado una plantilla de AWS CloudFormation para crear una API de REST de Amazon API Gateway con la integración de AWS Lambda. Cuando uso el método de la API para invocar mi función de Lambda, recibo un mensaje de error y un código de estado 500.
Descripción corta
Si tienes una API de REST de API Gateway con integración de Lambda, la API debe usar el método HTTP POST para invocar la función de Lambda backend. Si utilizas cualquier otro método HTTP para la solicitud de integración del backend (por ejemplo, ANY o GET), se produce un error en la invocación. A continuación, API Gateway devuelve un mensaje de error similar al siguiente ejemplo en Registros de Amazon CloudWatch:
Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 msMon Oct 14 14:08:49 UTC 2019 : Endpoint response headers: {Date=Mon, 14 Oct 2019 14:08:49 GMT, Content-Length=130, Connection=keep-alive, x-amzn-RequestId=abc1d2ef-34ab-56c7-de8f-90123a456789}
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response body before transformations: <AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
Mon Oct 14 14:08:49 UTC 2019 : Lambda invocation failed with status: 403. Lambda request id: abc1d2ef-34ab-56c7-de8f-90123a456789
Mon Oct 14 14:08:49 UTC 2019 : Execution failed due to configuration error:
Mon Oct 14 14:08:49 UTC 2019 : Method completed with status: 500
Nota: Aún puedes configurar cualquier método HTTP para el frontend de la API de REST.
Si creas una API de REST con integración de Lambda, usa uno de los siguientes métodos para especificar POST para la solicitud de integración de backend:
Nota: Si utilizas la consola de API Gateway para configurar una integración de Lambda, la solicitud de integración de backend se establece automáticamente en POST.
Resolución
Nota: Si se muestran errores al poner en marcha comandos de AWS CLI, consulta Solución de errores de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Se recomienda administrar todos los recursos de pila a través de AWS CloudFormation y no hacer cambios en los recursos de pila fuera de CloudFormation.
El método utilizado para cambiar el método HTTP a POST para la solicitud de integración del backend depende de la definición de la plantilla original. El proceso para actualizar una API Gateway desplegada por CloudFormation es diferente al proceso para actualizar una API Gateway creada por OpenAPI.
Puertas de enlace de API creadas en CloudFormation
Para las puertas de enlace de API que creó CloudFormation, debes actualizar la plantilla de pila. Si has definido el recurso AWS::ApiGateway::Method en la plantilla de CloudFormation para crear el método, actualiza la propiedad HttpMethod a POST. Para obtener instrucciones, consulta Ejemplos.
Si tu método usa una definición de OpenAPI para la propiedad Body del recurso AWS::ApiGateway::RestAPI, define httpMethod en tu archivo de definición de API como POST. Para obtener instrucciones, consulta el objeto x-amazon-apigateway-integration. Consulta también el ejemplo de plantilla Swagger en el repositorio de GitHub de aws-samples.
Para actualizar la API, ejecuta lasactualizaciones de pila de AWS CloudFormation con la plantilla editada:
"x-amazon-apigateway-integration" : { "type" : "aws",
"httpMethod" : "POST"
Puertas de enlace de API creadas fuera de CloudFormation
Uso de la consola para actualizar el método
Sigue estos pasos:
- Abre la consola de API Gateway.
- Elige tu API.
- En Recursos, elige el método HTTP que está integrado con Lambda.
- En Ejecución de métodos, elige Solicitud de integración.
- En Solicitud de integración, para el método HTTP, edita el nombre de la función de Lambda.
- Cuando se te pida agregar permiso a la función de Lambda, selecciona Aceptar.
- Despliega la API.
- (Opcional) Prueba el método HTTP que está integrado con Lambda.
Nota: Cada vez que se selecciona Aceptar en el mensaje Agregar permiso a la función de Lambda, la consola agrega una nueva instrucción a la política de recursos de la función de Lambda. Asegúrate de no superar el límite de tamaño de la política de recursos. Para obtener más información, consulta Configuración, despliegue y ejecución de funciones y Configuración de una solicitud de integración de API mediante la consola de API Gateway.
Uso de la AWS CLI para actualizar el método
Sigue estos pasos:
-
Para actualizar el método HTTP de integración a POST, ejecuta el comando put-integration:
aws apigateway put-integration \--rest-api-id 1234123412 \
--resource-id a1b2c3 \
--http-method ANY \
--type AWS \
--integration-http-method POST \
--uri 'arn:aws:apigateway:us-west-2:lambda:path//2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:function_name/invocations
-
Para desplegar los recursos configurados para una API en una etapa existente, ejecuta el comando create-deployment:
aws apigateway create-deployment \--rest-api-id 1234123412 \
--stage-name dev \
--description 'Deployment to an existing dev stage'
Uso de una importación de definiciones de OpenAPI para actualizar el método
Sigue estos pasos:
- En el archivo de definición de API, define el valor de la propiedad httpMethod en POST. Para obtener instrucciones, consulta el objeto x-amazon-apigateway-integration y el ejemplo de plantilla Swagger en el repositorio de GitHub de aws-samples.
- Para actualizar la API, importa el archivo de definición de API editado en API Gateway. Consulta Importación de un archivo de OpenAPI para actualizar una definición de la API existente.
Información relacionada
Integración de AWS::ApiGateway::Method
Tutorial: creación de una API de REST de calculadora con dos integraciones de servicios de AWS y una integración de Lambda sin proxy
He definido mi integración de Lambda en API Gateway mediante una variable de etapa. ¿Por qué aparece un «error de servidor interno» y un código de estado 500 cuando invoco el método de la API?
¿Cómo puedo solucionar los errores HTTP 502 de las API de REST de API Gateway con la integración de proxy de Lambda?
¿Cómo resuelvo los errores «Invalid mapping expression specified» de API Gateway?