Quero resolver o erro “Invalid permissions on Lambda function” ao invocar minha função do AWS Lambda a partir de uma API REST do Amazon API Gateway.
Breve descrição
Quando sua API REST do API Gateway invoca sua função do Lambda sem permissão, você recebe o erro “Invalid permissions on Lambda function”.
Se você configurar o registro em log do CloudWatch para sua API REST, o API Gateway também registrará em log a seguinte mensagem de erro para APIs REST com uma integração com o 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”.
Para APIs REST com um autorizador do Lambda, você recebe a seguinte mensagem de erro:
“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 esse problema, você deve adicionar a permissão Invocar do Lambda à sua API REST.
Observação: se você receber um erro “401 Unauthorized”, consulte Por que estou recebendo erros “401 Unauthorized” do API Gateway depois de criar um autorizador do Lambda?
Resolução
Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Adicionar uma permissão Invocar do Lambda a uma API REST com uma integração do Lambda
É possível usar o console do API Gateway, um modelo do AWS CloudFormation ou a AWS CLI para adicionar a permissão Invocar.
Observação: você também pode receber a mensagem de erro “Execution failed due to configuration error: Invalid permissions on Lambda function Method completed with status: 500” nos seguintes cenários:
- Você tenta invocar o API Gateway a partir do console de teste do API Gateway.
- Você invoca o API Gateway a partir de um estágio diferente do estágio que nomeou no URL de invocação.
Para evitar esse problema, use um curinga (*) para o nome do estágio em seu modelo do CloudFormation e no comando da AWS CLI.
Usar o console do API Gateway
Conclua as seguintes etapas:
- Abra o console do API Gateway.
- No painel de navegação, escolha APIs e selecione sua API REST.
- Escolha Recursos e, em seguida, selecione o método HTTP.
- Escolha Execução do método e, em seguida, Solicitação de integração.
- Em Tipo de integração, escolha Função do Lambda.
- Expanda a lista suspensa da Região do Lambda e, em seguida, escolha a região da AWS em que sua função do Lambda está.
- Escolha a lista suspensa de Funções do Lambda e selecione sua função do Lambda.
- Escolha Salvar.
- Escolha Implantar a API.
Usar um modelo do CloudFormation
Adicione o seguinte trecho de código ao seu modelo do 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"
Observação: substitua FunctionName pelo nome da sua função do Lambda, SourceArn pelo nome do recurso da Amazon (ARN) da API e example-api-id pelo ID da API.
Para mais informações, consulte Trechos de modelo do CloudFormation.
Use a AWS CLI
Execute o seguinte 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
Observação: substitua FUNCITON_NAME pelo nome da sua função do Lambda, o exemplo de ARN de origem pelo ARN da API e STATEMENT_ID por um identificador de declaração que identifica a declaração de forma exclusiva.
Para fornecer permissão somente para um estágio específico, execute o seguinte comando:
--source-arn "arn:aws:execute-api:API_GW_REGION:YOUR_ACCOUNT:API_GW_ID/STAGE_NAME/METHOD/RESOURCE"
Observação: substitua o exemplo de ARN de origem pelo ARN da API e STAGE_NAME pelo nome do estágio.
Adicionar uma permissão de invocação do Lambda a uma API REST com um autorizador do Lambda
É possível usar o console do API Gateway, um modelo do CloudFormation ou um comando da AWS CLI para adicionar a permissão Invocar.
Usar o console do API Gateway
Conclua as seguintes etapas:
- Crie um perfil do IAM para o API Gateway e, em seguida, crie uma política que permita a ação lambda:InvokeFunction.
Observação: anote o ARN do perfil do IAM para usar em uma etapa posterior. Para ver um exemplo de política, consulte Modelo de permissões do API Gateway para criar e gerenciar uma API.
- Abra o console do API Gateway.
- No painel de navegação, escolha APIs e selecione sua API REST.
- Escolha Autorizadores e, em seguida, selecione o autorizador do Lambda.
- Escolha Editar.
- Em Função Invocar do Lambda, insira o ARN do perfil do IAM.
- Escolha Salvar.
- Escolha Implantar a API.
Usar um modelo do CloudFormation
Adicione o seguinte trecho de código ao seu modelo do 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"
Observação: substitua FunctionName pelo nome da sua função do Lambda, example-api-id pelo ID da API e example-auth-id pelo ID do autorizador do Lambda.
Use a AWS CLI
Execute o seguinte 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
Observação: substitua FUNCITON_NAME pelo nome da sua função do Lambda, o exemplo de ARN de origem pelo ARN da API e STATEMENT_ID por um identificador de declaração que identifica a declaração de forma exclusiva.
Informações relacionadas
Visualizar políticas do IAM baseadas em recurso no Lambda
Como posso configurar o log de acesso para o API Gateway?