Quiero resolver el error «Invalid permissions on Lambda function» cuando invoco mi función de AWS Lambda desde una API de REST de Amazon API Gateway.
Descripción breve
Cuando la API de REST de API Gateway invoca la función de Lambda sin permiso, aparece el error «Invalid permissions on Lambda function».
Si configuras el registro de CloudWatch para tu API de REST, API Gateway también registra el siguiente mensaje de error para las API de REST con una integración de Lambda:
«Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
Execution failed due to configuration error: Invalid permissions on Lambda function
Method completed with status: 500».
En el caso de las API de REST con un autorizador de Lambda, recibirás el siguiente mensaje de error:
«Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
Execution failed due to configuration error: Invalid permissions on Lambda function
Execution failed due to configuration error: Authorizer error».
Para resolver este problema, debes agregar el permiso de invocación de Lambda a tu API de REST.
Nota: Si recibes un error «401 Unauthorized», consulta ¿Por qué aparecen errores «401 Unauthorized» de API Gateway después de crear un autorizador de Lambda?
Resolución
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Adición de un permiso de invocación de Lambda a una API de REST con una integración de Lambda
Puedes usar la consola de API Gateway, una plantilla de AWS CloudFormation o la AWS CLI para agregar el permiso de invocación.
Nota: También puede aparecer el mensaje de error «Execution failed due to configuration error: Invalid permissions on Lambda function Method completed with status: 500» en los siguientes escenarios:
- Intentas invocar la API Gateway desde la consola de prueba de API Gateway.
- Invocas la API Gateway desde una etapa diferente a la que nombraste en la URL de invocación.
Para evitar este problema, utiliza un comodín (*) para el nombre de la etapa en la plantilla de CloudFormation y en el comando de la AWS CLI.
Uso de la consola de API Gateway
Sigue estos pasos:
- Abre la consola de API Gateway.
- En el panel de navegación, selecciona API y, a continuación, elige tu API de REST.
- Elige Recursos y, a continuación, selecciona el método HTTP.
- Selecciona Ejecución del método y, a continuación, selecciona Solicitud de integración.
- Para Tipo de integración, selecciona Función de Lambda.
- Amplía la lista desplegable de regiones de Lambda y, a continuación, elige la región de AWS en la que se encuentra tu función de Lambda.
- Elige la lista desplegable de funciones de Lambda y, a continuación, selecciona tu función de Lambda.
- Selecciona Guardar.
- Selecciona Desplegar la API.
Uso de una plantilla de CloudFormation
Agrega el siguiente fragmento de código a tu plantilla de CloudFormation:
SampleApiPermission: Type: AWS::Lambda::Permission
Properties:
Action: "lambda:InvokeFunction"
FunctionName: !Ref ExampleLambdaFunction
Principal: "apigateway.amazonaws.com"
SourceArn: !Sub "arn:aws:execute-api:{AWS::Region}:{AWS::AccountId}:example-api-id/*/example-method/example-resource"
Nota: Sustituye FunctionName por el nombre de tu función de Lambda, SourceArn por el nombre de recurso de Amazon (ARN) de tu API y example-api-id por tu ID de API.
Para obtener más información, consulta Fragmentos de plantillas de CloudFormation.
Uso de AWS CLI
Ejecuta el siguiente comando add-permission:
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
Nota: Sustituye FUNCITON_NAME por el nombre de la función de Lambda, el ARN de origen del ejemplo por el ARN de tu API y STATEMENT_ID por un identificador de instrucción que identifique de forma exclusiva la instrucción.
Para conceder permisos solo para una etapa específica, ejecuta el siguiente comando:
--source-arn "arn:aws:execute-api:API_GW_REGION:YOUR_ACCOUNT:API_GW_ID/STAGE_NAME/METHOD/RESOURCE"
Nota: Sustituye el ARN de origen de ejemplo por el ARN de tu API y STAGE_NAME por el nombre de tu etapa.
Adición de un permiso de invocación de Lambda a una API de REST con un autorizador de Lambda
Puedes usar la consola de API Gateway, una plantilla de CloudFormation o un comando de la AWS CLI para agregar el permiso de invocación.
Uso de la consola de API Gateway
Sigue estos pasos:
- Crea un rol de IAM para API Gateway y, a continuación, crea una política que permita la acción lambda:InvokeFunction.
Nota: Anota el ARN del rol de IAM para usarlo en un paso posterior. Para ver un ejemplo de política, consulta Modelo de permisos de API Gateway para invocar una API.
- Abre la consola de API Gateway.
- En el panel de navegación, selecciona API y, a continuación, elige tu API de REST.
- Elige Autorizadores y, a continuación, selecciona el autorizador de Lambda.
- Selecciona Editar.
- Para el rol de invocación de Lambda, introduce el ARN del rol de IAM.
- Selecciona Guardar.
- Selecciona Desplegar la API.
Uso de una plantilla de CloudFormation
Agrega el siguiente fragmento de código a tu plantilla de CloudFormation:
SampleApiAuthPermission: Type: AWS::Lambda::Permission
Properties:
Action: "lambda:InvokeFunction"
FunctionName: !Ref ExampleLambdaFunction
Principal: "apigateway.amazonaws.com"
SourceArn: !Sub "arn:aws:execute-api:{AWS::Region}:{AWS::AccountId}:example-api-id/authorizers/example-auth-id"
Nota: Sustituye FunctionName por el nombre de tu función de Lambda, example-api-id por tu ID de API y example-auth-id por tu ID de autorizador de Lambda.
Uso de AWS CLI
Ejecuta el siguiente comando add-permission:
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
Nota: Sustituye FUNCITON_NAME por el nombre de la función de Lambda, el ARN de origen del ejemplo por el ARN de tu API y STATEMENT_ID por un identificador de instrucción que identifique de forma exclusiva la instrucción.
Información relacionada
Visualización de políticas de IAM basadas en recursos en Lambda
¿Cómo puedo configurar el registro de acceso para API Gateway?