¿Por qué aparecen errores de «error de ejecución debido a la configuración» de API Gateway después de utilizar una plantilla de CloudFormation o una definición de OpenAPI para crear una API de REST con una integración de Lambda?

6 minutos de lectura
0

Utilicé una plantilla de AWS CloudFormation (o definición de OpenAPI) para crear una API de REST de Amazon API Gateway con la integración de AWS Lambda. Cuando intento invocar mi función de Lambda mediante el método de la API, aparece el siguiente mensaje de error y un código de estado 500: «La ejecución falló debido a un error de configuración». ¿Cuál es la causa del error y cómo puedo solucionarlo?

Descripción breve

Si tiene una API de REST de API Gateway con integración de Lambda, la API debe invocar la función de Lambda backend mediante el método HTTP, POST. Si utiliza cualquier otro método HTTP (por ejemplo, ANY o GET) para la solicitud de integración del backend, se produce un error en la invocación. A continuación, API Gateway devuelve un mensaje de error similar al siguiente ejemplo en sus Registros de Amazon CloudWatch:

Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 ms
Mon 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 puede configurar cualquier método HTTP para el frontend de su API de REST.

Debe especificar el método POST para la solicitud de integración de backend si crea una API de REST con integración de Lambda mediante alguna de las siguientes opciones:

Nota: Si utiliza 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

La práctica recomendada de CloudFormation consiste en 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. Por ejemplo, el proceso es diferente entre actualizar una API Gateway desplegada con CloudFormation y una API Gateway creada con OpenAPI o AWS CLI.

Para cambiar el método de solicitud de la integración a POST para las puertas de enlace de API creadas con CloudFormation

Para obtener instrucciones, consulte Modificación de una plantilla de pila.

A. Si su método se creó con la definición del recurso AWS::ApiGateway::Method en su plantilla de CloudFormation, actualice la propiedad HttpMethod a POST. Para obtener instrucciones, consulte la sección de ejemplos de la documentación de AWS::ApiGateway::Method.

B. Si su método incluía una definición de OpenAPI como valor de la propiedad del cuerpo del recurso AWS::ApiGateway::RestAPI: Defina el valor de la propiedad httpMethod en su archivo de definición de API en POST.  Para obtener instrucciones, consulte el objeto x-amazon-apigateway-integration y el ejemplo de plantilla Swagger en el repositorio de GitHub de aws-samples.

Para actualizar su API, ejecute lasactualizaciones de pila de AWS CloudFormation con la plantilla editada:

"x-amazon-apigateway-integration" : {
    "type" : "aws",

    "httpMethod" : "POST"

Para cambiar el método HTTP de la integración del backend a POST para las puertas de enlace de API creadas fuera de CloudFormation

Método de actualización mediante la consola

  1. En la consola de API Gateway, seleccione su API.
  2. En el panel Recursos, elija el método HTTP que tenga la integración de Lambda.
  3. En el panel Ejecución de método, seleccione Solicitud de integración.
  4. En el panel Solicitud de integración, para el método HTTP, edite el nombre de la función de Lambda. Para ello, haga clic en el icono del lápiz situado a la derecha del nombre de la función y, a continuación, en el icono de marca de verificación que aparece a la derecha.
  5. Cuando se le pida añadir permiso a la función de Lambda, seleccione Aceptar.
  6. Despliegue su API.
  7. (Opcional) Pruebe el método HTTP que incluye la integración de Lambda.

Nota: La consola añade una nueva instrucción a la política de recursos de la función de Lambda cada vez que se selecciona Aceptar en el mensaje Añadir permiso a la función de Lambda. Tenga en cuenta el tamaño de la política de recursos de su función para asegurarse de que no alcance el límite de tamaño de la política de recursos. Consulte: Configuración, despliegue y ejecución de funciones.

Para obtener más información, consulte Introducción a API Gateway y Configuración de una solicitud de integración de la API mediante la consola de API Gateway.

Actualice el método mediante AWS CLI

  1. Ejecute el método put-integration para actualizar el método http de integración a POST:
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
  1. Despliegue los recursos configurados para una API en una etapa existente:
aws apigateway create-deployment \
--rest-api-id 1234123412 \
--stage-name dev \
--description 'Deployment to an existing dev stage'

Nota: Si le aparecen errores al ejecutar los comandos de AWS CLI, asegúrese de utilizar la versión más reciente de AWS CLI.

Actualice el método mediante la importación de definiciones de OpenAPI

  1. Defina el valor de la propiedad httpMethod en su archivo de definición de API en POST. Para obtener instrucciones, consulte el objeto x-amazon-apigateway-integration y el ejemplo de plantilla Swagger en el repositorio de GitHub de aws-samples.
  2. Importe el archivo de definición de API editado en API Gateway para actualizar la API. Consulte 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 Calc con dos integraciones de servicios de AWS y una integración de Lambda sin proxy

Definí mi integración de Lambda en Amazon 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 resolver los errores HTTP 502 de «Respuesta de proxy de Lambda incorrecta» de las API de REST de API Gateway?

¿Cómo resuelvo los errores «Se especificó una expresión de asignación no válida» de API Gateway?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años