Como resolvo erros de “Permissões inválidas na função do Lambda” das APIs REST do API Gateway?

5 minuto de leitura
0

Quando invoco minha função do AWS Lambda usando uma API REST do Amazon API Gateway, recebo o erro “Permissões inválidas na função do Lambda”. O que está causando o erro e como resolvê-lo?

Breve descrição

Se sua API REST do API Gateway tentar invocar sua função do Lambda sem a permissão de invocação do Lambda, o API Gateway retornará o seguinte erro: “Permissões inválidas na função do Lambda”

Se você configurar o log do CloudWatch para sua API REST, o API Gateway também registrará uma das seguintes mensagens de erro:

**Exemplo de mensagem de erro do CloudWatch para APIs REST com uma integração do Lambda **

“Enviando solicitação para https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xx:function:xxx/invocations
Falha na execução devido a um erro de configuração: Permissões inválidas na função do Lambda
Método concluído com o status: 500”

**Exemplo de mensagem de erro do CloudWatch para APIs REST com um autorizador do Lambda **

“Enviando solicitação para https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xxx:function:xx/invocations
Falha na execução devido a um erro de configuração: Permissões inválidas na função do Lambda
Falha na execução devido a um erro de configuração: Erro do autorizador”

Resolução

Para resolver esses erros, faça o seguinte:

Adicione uma permissão de invocação do Lambda baseada em recursos à sua API REST usando um dos métodos descritos neste artigo.

-ou-

Configure um perfil de execução do AWS Identity and Access Management (IAM) que conceda permissão à sua API REST para invocar sua função.

Para obter mais informações, consulte Modelo de permissões do API Gateway para invocar uma API.

Observação:

Para adicionar permissão de invocação do Lambda a uma API REST com uma integração do Lambda usando o console do API Gateway

1.    No console do API Gateway, no painel APIs, escolha o nome da sua API REST.

2.    No painel Recursos, escolha o método HTTP configurado.

3.    No painel Execução do método, escolha Solicitação de integração.

4.    Em Tipo de integração, escolha Função do Lambda.

5.    Expanda a lista suspensa Região do Lambda. Em seguida, escolha a região da AWS em que sua função do Lambda está.

6.    Escolha a lista suspensa Função do Lambda. Em seguida, escolha o nome da sua função do Lambda.

7.    É exibido um prompt que oferece a opção de Adicionar permissão à função do Lambda. Escolha OK.

8.    Escolha Salvar. Em seguida, escolha Implantar a API para adicionar a permissão de invocação do Lambda à sua API.

Para adicionar permissão de invocação do Lambda a uma API REST com uma integração do Lambda usando um modelo do CloudFormation

Adicione o seguinte trecho de código ao seu modelo do CloudFormation:

Importante: substitua <api-id> pela sua apiID. Substitua o valor de FunctionName pelo nome da sua função do Lambda. Substitua o valor de SourceArn pelo nome do recurso da Amazon (ARN) de origem da sua 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 obter mais informações sobre como declarar várias partes do modelo do CloudFormation, consulte Trechos de modelo.

Para adicionar a permissão de invocação do Lambda a uma API REST com uma integração do Lambda usando a AWS CLI

Execute o seguinte comando add-permission da AWS CLI:

Importante: substitua o valor de function-name pelo nome da sua função do Lambda. Substitua o valor de source-arn pelo ARN de origem da sua API. Substitua o valor de statement-id por um identificador de instrução que diferencia a instrução de outras na mesma 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

Para adicionar permissão de invocação do Lambda a uma API REST com um autorizador do Lambda usando o console do API Gateway

1.    Crie um perfil do IAM para o API Gateway que permita a ação“lambda:InvokeFunction”. Em seguida, copie o ARN do perfil do IAM para sua área de transferência.

2.    No console do API Gateway, no painel APIs, escolha o nome da sua API REST.

3.    No painel Autorizadores, escolha o autorizador do Lambda configurado. Em seguida, escolha Editar.

4.    Em Perfil de invocação do Lambda, insira o ARN do perfil do IAM que você copiou para sua área de transferência.

5.    Escolha Salvar. Em seguida, escolha Implantar a API.

Para adicionar permissão de invocação do Lambda a uma API REST com um autorizador do Lambda usando um modelo do CloudFormation

Adicione o seguinte trecho de código ao seu modelo do CloudFormation:

Importante: substitua <api-id> pela sua apiID. Substitua o valor de FunctionName pelo nome da sua função do Lambda. Substitua <auth-id> pelo authorizerId do seu autorizador do 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 obter mais informações sobre como declarar várias partes do modelo do CloudFormation, consulte Trechos de modelo.

Para adicionar a permissão de invocação do Lambda a uma API REST com um autorizador do Lambda usando a AWS CLI

Execute o seguinte comando add-permission da AWS CLI:

Importante: substitua o valor de function-name pelo nome da sua função do Lambda. Substitua o valor de source-arn pelo ARN de origem da sua API. Substitua o valor de statement-id por um identificador de instrução que diferencia a instrução de outras na mesma 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

Informações relacionadas

Usar políticas baseadas em recursos para o Lambda

Como posso configurar o log de acesso para o API Gateway?