Ir para o conteúdo

Como resolvo erros “Invalid permissions on Lambda function” das APIs REST do API Gateway?

5 minuto de leitura
0

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:

  1. Abra o console do API Gateway.
  2. No painel de navegação, escolha APIs e selecione sua API REST.
  3. Escolha Recursos e, em seguida, selecione o método HTTP.
  4. Escolha Execução do método e, em seguida, Solicitação de integração.
  5. Em Tipo de integração, escolha Função do Lambda.
  6. 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á.
  7. Escolha a lista suspensa de Funções do Lambda e selecione sua função do Lambda.
  8. Escolha Salvar.
  9. 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:

  1. 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.
  2. Abra o console do API Gateway.
  3. No painel de navegação, escolha APIs e selecione sua API REST.
  4. Escolha Autorizadores e, em seguida, selecione o autorizador do Lambda.
  5. Escolha Editar.
  6. Em Função Invocar do Lambda, insira o ARN do perfil do IAM.
  7. Escolha Salvar.
  8. 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?