Comment résoudre les erreurs « permissions non valides sur la fonction Lambda » des API REST de la passerelle API ?

Lecture de 5 minute(s)
0

Lorsque j'invoque ma fonction AWS Lambda à l'aide d'une API REST d'Amazon API Gateway, j'obtiens une erreur « permissions non valides sur la fonction Lambda ». Quelle est la cause de l'erreur et comment la corriger ?

Brève description

Si votre API REST API Gateway essaie d'invoquer votre fonction Lambda sans la permission Lambda invoke, alors API Gateway renvoie l'erreur suivante : « permissions non valides sur la fonction Lambda »

Si vous configurez la journalisation CloudWatch pour votre API REST, API Gateway consigne également l'un des messages d'erreur suivants :

Exemple de message d'erreur CloudWatch pour les API REST avec une intégration Lambda

« Sending request to https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xx:function:xxx/invocations » (Envoi de la demande à https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xx:function:xxx/invocations)
Échec de l'exécution en raison d'une erreur de configuration : autorisations non valides sur la fonction Lambda
Méthode complétée avec l'état : 500"

Exemple de message d'erreur CloudWatch pour les API REST avec un mécanisme d'autorisation Lambda

« Envoi de la demande à https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xxx:function:xx/invocations
Échec de l'exécution en raison d'une erreur de configuration : autorisations non valides sur la fonction Lambda
« L'exécution a échoué en raison d'une erreur de configuration : Erreur de permission »

Solution

Pour résoudre ces erreurs, veuillez effectuer l'une des opérations suivantes :

Ajoutez une autorisation Lambda invoke basée sur les ressources à votre API REST en utilisant l'une des méthodes décrites dans cet article.

-ou-

Configurez un rôle d'exécution AWS Identity and Access Management (IAM) qui accorde à votre API REST l'autorisation d'appeler votre fonction.

Pour plus d'informations, veuillez consulter le sitemodèle d'autorisations API Gateway pour invoquer une API.

Remarque :

Pour ajouter une permission Invoke à une API REST avec une intégration Lambda à l'aide de la console API Gateway

1.    Dans la console API Gateway, dans le volet API, choisissez le nom de votre API REST.

2.    Dans le volet Ressources, choisissez la méthode HTTP configurée.

3.    Dans le volet Execution de la méthode, choisissez Demande d’intégration .

4.    Pour Type d’intégration, choisissez Fonction Lambda Function.

5.    Développez la liste déroulante Région Lambda. Ensuite, choisissez la région AWS dans laquelle se trouve votre fonction Lambda.

6.    Choisissez la liste déroulante Fonction Lambda. Ensuite, choisissez le nom de votre fonction Lambda.

7.    Une invite apparaît qui vous donne la possibilité d' ajouter une autorisation à la fonction Lambda. Choisissez OK.

8.    Choisissez Enregistrer. Ensuite, choisissez Déployer l'API pour ajouter l'autorisation Lambda invoke à votre API.

Pour ajouter une permission Lambda Invoke à une API REST avec une intégration Lambda à l'aide d'un modèle CloudFormation

Ajoutez l'extrait de code suivant à votre modèle CloudFormation :

Important : Remplacez <api-id> par votre apiID. Remplacez la valeur FunctionName par le nom de votre fonction Lambda. Remplacez la valeur SourceArn par le nom Amazon Resource Name (ARN) source de votre 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>"

Pour plus d'informations sur la façon de déclarer différentes parties de modèle CloudFormation, veuillez consulter la section Extraits de modèle.

Pour ajouter une permission Lambda Invoke à une API REST avec une intégration Lambda à l'aide de l'interface de ligne de commande AWS

Exécutez la commande Add-permission AWS CLI suivante :

Important : Remplacez la valeur function-name par le nom de votre fonction Lambda. Remplacez la valeur source-arn par l' ARN source de votre API. Remplacez la valeur statement-id par un identificateur d'instruction qui différencie l'instruction des autres dans la même stratégie.

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

Pour ajouter Lambda, invoquez l'autorisation d'une API REST avec un autorisateur Lambda à l'aide de la console API Gateway

1.    Créez un rôle IAM pour API Gateway qui autorise l'action « lambda:InvokeFunction ». Ensuite, copiez le rôle IAM ARN dans votre presse-papiers.

2.    Dans la console API Gateway, dans le volet API, choisissez le nom de votre API REST.

3.    Dans le volet Autorisateurs, choisissez l'autorisation Lambda configuré. Ensuite, choisissez Modifier.

4.    Pour Lambda Invoke Role, entrez l'ARN du rôle IAM que vous avez copié dans votre Presse-papiers.

5.    Choisissez Enregistrer. Ensuite, choisissez Déployer l'API.

Pour ajouter une autorisation Lambda Invoke à une API REST avec un autorisateur Lambda à l'aide d'un modèle CloudFormation

Ajoutez l'extrait de code suivant à votre modèle CloudFormation :

Important : Remplacez <api-id> par votre apiID. Remplacez la valeur FunctionName par le nom de votre fonction Lambda. Remplacez <auth-id> par l'authorizerId de votre autorisateur 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>"

Pour plus d'informations sur la façon de déclarer différentes parties de modèle CloudFormation, veuillez consulter la section Extraits de modèle.

Pour ajouter une autorisation Lambda Invoke à une API REST avec un autorisateur Lambda à l'aide de l'interface de ligne de commande AWS

Exécutez la commande add-permission AWS CLI suivante :

Important : remplacez la valeur function-name par le nom de votre fonction Lambda. Remplacez la valeur source-arn par l' ARN source de votre API. Remplacez la valeur statement-id par un identificateur d'instruction qui différencie l'instruction des autres dans la même politique.

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

Informations connexes

Utilisation des stratégies basées sur les ressources pour Lambda

Comment configurer la journalisation des accès pour la passerelle API ?