¿Cómo puedo resolver los errores de «permisos no válidos en la función de Lambda» de las API de REST de API Gateway?

6 minutos de lectura
0

Cuando invoco mi función de AWS Lambda con una API de REST de Amazon API Gateway aparece el error «Permisos no válidos en la función de Lambda». ¿Cuál es la causa del error y cómo lo soluciono?

Descripción breve

Si la API de REST de API Gateway intenta invocar la función de Lambda sin el permiso de invocación de Lambda, entonces API Gateway devuelve el siguiente error: «Permisos no válidos en la función de Lambda»

Si configura el registro de CloudWatch para su API de REST, API Gateway también registrará uno de los siguientes mensajes de error:

Ejemplo de mensaje de error de CloudWatch para las API de REST con integración de Lambda

«Envío de la solicitud a https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xx:function:xxx/invocations
La ejecución falló debido a un error de configuración: Permisos no válidos en la función de Lambda
Método completado con el estado: 500»

Ejemplo de mensaje de error de CloudWatch para las API de REST con un autorizador de Lambda

«Envío de la solicitud a https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xxx:function:xx/invocations
La ejecución falló debido a un error de configuración: Permisos no válidos en la función de Lambda
La ejecución falló debido a un error de configuración: Error de autorizador»

Resolución

Para resolver estos errores, lleve a cabo una de las siguientes acciones:

Añada un permiso de invocación de Lambda basado en recursos a su API de REST mediante uno de los métodos descritos en este artículo.

-o-

Configure un rol de ejecución de AWS Identity and Access Management (IAM) que otorgue permiso a su API de REST para invocar su función.

Para obtener más información, consulte Modelo de permisos de API Gateway para invocar una API.

Nota:

Añadir un permiso de invocación de Lambda a una API de REST con una integración de Lambda mediante la consola de API Gateway

1.    En la consola de API Gateway, en el panel de API, elija el nombre de su API de REST.

2.    En el panel Recursos, elija el método HTTP configurado.

3.    En el panel Ejecución de método, seleccione Solicitud de integración.

4.    Para el Tipo de integración, elija Función de Lambda.

5.    Abra la lista desplegable Región de Lambda. A continuación, elija la región de AWS en la que se encuentra su función de Lambda.

6.    Abra la lista desplegable Función de Lambda. A continuación, elija el nombre de su función de Lambda.

7.    Aparece un mensaje que le da la opción de Añadir permiso a la función de Lambda. Elija Aceptar.

8.    Seleccione Guardar. A continuación, seleccione Desplegar la API para añadir el permiso de invocación de Lambda a su API.

Añadir un permiso de invocación de Lambda a una API de REST con una integración de Lambda mediante una plantilla de CloudFormation

Añada el siguiente fragmento de código a su plantilla de CloudFormation:

Importante: Reemplace <api-id> por su apiID. Sustituya el valor FunctionName por el nombre de su función de Lambda. Reemplace el valor SourceArn por el nombre de recurso de Amazon (ARN) de origen de su API.

SampleApiPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !Ref MyLambdaFnA1
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:<api-id>/*/<method>/<resource>"

Para obtener más información sobre cómo declarar varias partes de la plantilla de CloudFormation, consulte Fragmentos de plantilla.

Añadir un permiso de invocación de Lambda a una API de REST con una integración de Lambda mediante la AWS CLI

Ejecute el siguiente comando add-permission de AWS CLI:

Importante: Sustituya el valor function-name por el nombre de su función de Lambda. Reemplace el valor source-arn por el ARN de origen de su API. Reemplace el valor statement-id por un identificador de instrucción que la diferencie de otras de la misma política.

aws lambda add-permission   \
--function-name "$FUNCTION_NAME"   \
--source-arn "arn:aws:execute-api:$API_GW_REGION:$YOUR_ACCOUNT:$API_GW_ID/*/$METHOD/$RESOURCE"   \
--principal apigateway.amazonaws.com   \
--statement-id $STATEMENT_ID   \
--action lambda:InvokeFunction

Añadir un permiso de invocación de Lambda a una API de REST con un autorizador de Lambda mediante la consola de API Gateway

1.    Cree un rol de IAM para API Gateway que permita la acción «lambda:InvokeFunction». A continuación, copie el ARN del rol de IAM al portapapeles.

2.    En la consola de API Gateway, en el panel de API, elija el nombre de su API de REST.

3.    En el panel Autorizadores, elija el autorizador de Lambda configurado. A continuación, seleccione Editar.

4.    Para Rol de invocación de Lambda, introduzca el ARN del rol de IAM que copió al portapapeles.

5.    Seleccione Guardar. A continuación, seleccione Desplegar la API.

Añadir un permiso de invocación de Lambda a una API de REST con un autorizador de Lambda mediante una plantilla de CloudFormation

Añada el siguiente fragmento de código a su plantilla de CloudFormation:

Importante: Reemplace <api-id> por su apiID. Sustituya el valor FunctionName por el nombre de su función de Lambda. Reemplace <auth-id> por el authorizerId de su autorizador de Lambda.

SampleApiAuthPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !Ref MyLambdaFnA1
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:<api-id>/authorizers/<auth-id>"

Para obtener más información sobre cómo declarar varias partes de la plantilla de CloudFormation, consulte Fragmentos de plantilla.

Añadir un permiso de invocación de Lambda a una API de REST con un autorizador de Lambda mediante la AWS CLI

Ejecute el siguiente comando add-permission de AWS CLI:

Importante: Sustituya el valor function-name por el nombre de su función de Lambda. Reemplace el valor source-arn por el ARN de origen de su API. Reemplace el valor statement-id por un identificador de instrucción que la diferencie de otras de la misma política.

aws lambda add-permission   \
--function-name "$FUNCTION_NAME"   \
--source-arn "arn:aws:execute-api:$API_GW_REGION:$YOUR_ACCOUNT:$API_GW_ID/authorizers/$AUTHORIZER_ID"   \
--principal apigateway.amazonaws.com   \
--statement-id $STATEMENT_ID   \
--action lambda:InvokeFunction

Información relacionada

Uso de políticas basadas en recursos para Lambda

¿Cómo puedo configurar el registro de acceso para API Gateway?