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

5 minuti di lettura
0

Quando richiamo la mia funzione AWS Lambda utilizzando una REST API di Gateway Amazon API, ricevo l'errore "Invalid permissions on Lambda function". Qual è la causa dell'errore e come posso risolverlo?

Breve descrizione

Se la REST API di API Gateway tenta di richiamare la funzione Lambda senza autorizzazioni per il richiamo della funzione Lambda, API Gateway restituisce il seguente errore: "Invalid permissions on Lambda function"

Se configuri l’accesso di CloudWatch per le REST API, API Gateway registra anche uno dei seguenti messaggi di errore:

Esempio di messaggio di errore di CloudWatch per le REST API con integrazione Lambda

"Invio della richiesta a https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xx:function:xxx/invocations
Esecuzione non riuscita a causa di un errore di configurazione: Invalid permissions on Lambda function
Metodo completato con lo stato: 500"

Esempio di messaggio di errore di CloudWatch per le REST API con sistema di autorizzazione Lambda

"Invio della richiesta a https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xxx:function:xx/invocations
Esecuzione non riuscita a causa di un errore di configurazione: Invalid permissions on Lambda function
Esecuzione non riuscita a causa di un errore di configurazione: Errore sistema di autorizzazione"

Risoluzione

Per risolvere questi errori, esegui una delle seguenti operazioni:

Aggiungi alla REST API un'autorizzazione per il richiamo Lambda basata sulle risorse utilizzando uno dei metodi descritti in questo articolo.

-oppure-

Configura un ruolo di esecuzione di AWS Identity and Access Management (IAM) che conceda alla REST API l'autorizzazione a richiamare la funzione.

Per ulteriori informazioni, consulta il modello di autorizzazioni di API Gateway per richiamare un'API.

Nota:

Per aggiungere l'autorizzazione per il richiamo Lambda a una REST API con un’integrazione Lambda utilizzando la console API Gateway

1.    Nella console API Gateway, nel riquadro API, scegli il nome della REST API.

2.    Nel riquadro Risorse scegli il metodo HTTP configurato.

3.    Nel riquadro Esecuzione metodo scegli Richiesta di integrazione.

4.    Per il Tipo di integrazione scegli Funzione Lambda.

5.    Espandi l'elenco a discesa Regione Lambda. Quindi, scegli la regione AWS in cui si trova la funzione Lambda.

6.    Scegli l'elenco a discesa Funzione Lambda. Quindi, scegli il nome della funzione Lambda.

7.    Viene visualizzato un prompt che offre l’opzione Aggiungi autorizzazione alla Funzione Lambda. Scegli OK.

8.    Scegli Salva. Quindi, scegli Distribuisci l'API per aggiungere all’API l'autorizzazione per il richiamo della funzione Lambda.

Per aggiungere l'autorizzazione al richiamo della funzione Lambda a una REST API con un'integrazione Lambda utilizzando un modello CloudFormation

Aggiungi il seguente frammento di codice al modello CloudFormation:

Importante: sostituisci <api-id> con il tuo apiID. Sostituisci il valore FunctionName con il nome della funzione Lambda. Sostituisci il valore SourceArn con il nome della risorsa Amazon (ARN) di origine dell’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>"

Per ulteriori informazioni su come dichiarare le varie parti del modello CloudFormation, consulta Frammenti di modello.

Per aggiungere l'autorizzazione al richiamo della funzione Lambda alla REST API con un'integrazione Lambda utilizzando AWS CLI

Esegui il seguente comando di AWS CLI add-permission:

Importante: sostituisci il valore function-name con il nome della funzione Lambda. Sostituisci il valore source-arn con l'ARN di origine dell’API. Sostituisci il valore statement-id con un identificatore di dichiarazione che differenzi la dichiarazione dalle altre nella stessa policy.

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

Per aggiungere l'autorizzazione al richiamo della funzione Lambda a una REST API con autorizzazioni Lambda tramite la console API Gateway

1.    Crea un ruolo IAM per API Gateway che consenta l'azione "lambda:InvokeFunction". Quindi, copia l'ARN del ruolo IAM negli appunti.

2.    Nella console API Gateway, nel riquadro API, scegli il nome della REST API.

3.    Nel riquadro Autorizzazioni, scegli il sistema di autorizzazione Lambda configurata. Quindi, scegli Modifica.

4.    Per il Ruolo di richiamo Lambda, inserisci l'ARN del ruolo IAM che hai copiato negli appunti.

5.    Scegli Salva. Quindi, scegli Distribuisci l'API.

Per aggiungere l'autorizzazione al richiamo della funzione Lambda a una REST API con un’autorizzazione Lambda utilizzando un modello CloudFormation

Aggiungi il seguente frammento di codice al modello CloudFormation:

Importante: sostituisci <api-id> con il tuo apiID. Sostituisci il valore FunctionName con il nome della funzione Lambda. Sostituisci <auth-id> con l’authorizerId del tuo sistema di autorizzazione 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>"

Per ulteriori informazioni su come dichiarare le varie parti del modello CloudFormation, consulta Frammenti di modello.

Per aggiungere l'autorizzazione al richiamo della funzione Lambda a una REST API con un’autorizzazione Lambda tramite AWS CLI

Esegui il seguente comando di AWS CLI add-permission:

Importante: sostituisci il valore function-name con il nome della funzione Lambda. Sostituisci il valore source-arn con l'ARN di origine dell’API. Sostituisci il valore statement-id con un identificatore di dichiarazione che differenzi la dichiarazione dalle altre nella stessa policy.

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

Informazioni correlate

Uso delle policy basate sulle risorse per Lambda

Come posso configurare la registrazione degli accessi del API Gateway?