Come posso risolvere gli errori "Invalid permissions on Lambda function" dalle REST API di API Gateway?

5 minuti di lettura
0

Quando invoco la mia funzione AWS Lambda da una REST API di Gateway Amazon API, ricevo l'errore "Invalid permissions on Lambda function".

Breve descrizione

Se hai una REST API di API Gateway che invoca una funzione Lambda senza l'autorizzazione di invocazione Lambda, API Gateway restituisce l'errore "Invalid permissions on Lambda function".

Se configuri la registrazione CloudWatch per la REST API, API Gateway registra anche uno dei messaggi di errore seguenti:

  • Esempio di messaggio di errore di CloudWatch per le REST API con un'integrazione 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"
  • Esempio di messaggio di errore di CloudWatch per le REST API con un sistema di autorizzazione 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
    Execution failed due to configuration error: Authorizer error"

Risoluzione

Per risolvere questi errori, esegui una delle operazioni seguenti:

Per ulteriori informazioni, consulta API Gateway permissions model for invoking an API.

Nota: se ricevi un errore 401 Autorizzazione negata, segui le istruzioni in Perché ricevo errori 401 di autorizzazione negata di API Gateway dopo aver creato un sistema di autorizzazione Lambda?

Risolvi gli errori di integrazione Lambda

Aggiungi l'autorizzazione di invocazione Lambda a una REST API con un'integrazione Lambda utilizzando la console API Gateway

Completa i passaggi seguenti:

  1. Apri la console API Gateway.
  2. Nel pannello API seleziona il nome della REST API.
  3. Nel pannello Risorse seleziona il metodo HTTP configurato.
  4. Nel pannello Esecuzione metodo seleziona Richiesta di integrazione.
  5. In Tipo di integrazione seleziona Funzione Lambda.
  6. Espandi l'elenco a discesa Regione Lambda. Quindi scegli la regione AWS in cui si trova la funzione Lambda.
  7. Seleziona l'elenco a discesa Funzione Lambda. Quindi scegli il nome della funzione Lambda.
  8. Fai clic su Salva. Quindi seleziona Distribuisci l'API per aggiungere all'API l'autorizzazione di invocazione Lambda.

Aggiungi l'autorizzazione di invocazione Lambda a una REST API con un'integrazione Lambda utilizzando un modello CloudFormation

Aggiungi il frammento di codice seguente al modello 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: nel modello precedente sostituisci quanto segue:
Il valore di FunctionName con il nome della funzione Lambda
Il valore di SourceArn con il nome della risorsa Amazon (ARN) di origine dell'API
All'interno del valore di sourceArn, example-api-id con il tuo apiID

Per ulteriori informazioni su come dichiarare le varie parti del modello CloudFormation, consulta Template snippets.

Aggiungi l'autorizzazione di invocazione Lambda alla REST API con un'integrazione Lambda utilizzando AWS CLI

Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta Troubleshooting errors for the AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Esegui il comando di AWS CLI add-permission seguente:

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: sostituisci quanto segue nel comando precedente:
Il valore di function-name con il nome della funzione Lambda
Il valore di source-arn con l'ARN di origine dell'API
Il valore di statement-id con un identificatore di istruzione che identifichi in modo univoco l'istruzione

Risolvi gli errori del sistema di autorizzazione Lambda

Aggiungi l'autorizzazione di invocazione Lambda a una REST API con un sistema di autorizzazione Lambda tramite la console API Gateway

Completa i passaggi seguenti:

  1. Crea un ruolo IAM per API Gateway che consenta l'azione lambda:InvokeFunction. Quindi copia l'ARN del ruolo IAM negli appunti.
  2. Apri la console API Gateway.
  3. Nel pannello API seleziona il nome della REST API.
  4. Nel pannello Autorizzazioni seleziona il sistema di autorizzazione Lambda configurato. Quindi fai clic su Modifica.
  5. In Ruolo di richiamo Lambda inserisci l'ARN del ruolo IAM che hai copiato negli appunti.
  6. Fai clic su Salva. Quindi seleziona Distribuisci l'API.

Aggiungi l'autorizzazione di invocazione Lambda a una REST API con un sistema di autorizzazione Lambda utilizzando un modello CloudFormation

Aggiungi il frammento di codice seguente al modello 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: nel modello precedente sostituisci quanto segue:
Il valore di FunctionName con il nome della funzione Lambda
All'interno del valore di sourceArn, example-api-id con il tuo apiID
All'interno del valore di sourceARN, example-auth-id con l'authorizerId del tuo sistema di autorizzazione Lambda

Aggiungi l'autorizzazione di invocazione Lambda a una REST API con un sistema di autorizzazione Lambda tramite AWS CLI

Esegui il comando di AWS CLI add-permission seguente:

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: sostituisci quanto segue nel comando precedente:
Il valore di function-name con il nome della funzione Lambda
Il valore di source-arn con l'ARN di origine dell'API
Il valore di statement-id con un identificatore di istruzione che identifichi in modo univoco l'istruzione

Informazioni correlate

Working with resource-based IAM policies in Lambda

Come posso configurare la registrazione degli accessi di API Gateway?