Passer au contenu

J'ai utilisé un modèle CloudFormation ou une définition d’OpenAPI pour créer une API REST avec intégration Lambda. Pourquoi l’API Gateway renvoie-t-elle le message d'erreur « Échec de l'exécution » ?

Lecture de 5 minute(s)
0

J'ai utilisé un modèle AWS CloudFormation pour créer une API REST Amazon API Gateway avec intégration AWS Lambda. Lorsque j'utilise la méthode API pour invoquer ma fonction Lambda, j'obtiens un message d'erreur et un code d'état 500.

Brève description

Si vous disposez d'une API REST API Gateway avec intégration Lambda, celle-ci doit utiliser la méthode HTTP POST pour invoquer la fonction Lambda dorsale. Si vous utilisez une autre méthode HTTP pour la demande d'intégration de backend, telle que ANY ou GET, l'invocation échoue. API Gateway renvoie alors un message d'erreur similaire à l'exemple suivant dans Amazon CloudWatch Logs :

Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 msMon Oct 14 14:08:49 UTC 2019 : Endpoint response headers: {Date=Mon, 14 Oct 2019 14:08:49 GMT, Content-Length=130, Connection=keep-alive, x-amzn-RequestId=abc1d2ef-34ab-56c7-de8f-90123a456789}
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response body before transformations: <AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
Mon Oct 14 14:08:49 UTC 2019 : Lambda invocation failed with status: 403. Lambda request id: abc1d2ef-34ab-56c7-de8f-90123a456789
Mon Oct 14 14:08:49 UTC 2019 : Execution failed due to configuration error:
Mon Oct 14 14:08:49 UTC 2019 : Method completed with status: 500

Remarque : Vous pouvez toujours configurer n'importe quelle méthode HTTP pour le frontend de l'API REST.

Si vous créez une API REST avec intégration Lambda, utilisez l'une des méthodes suivantes pour spécifier POST pour la demande d'intégration de backend :

Remarque : Si vous utilisez la console API Gateway pour configurer une intégration Lambda, la demande d'intégration de backend est automatiquement définie sur POST.

Résolution

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l’interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre les erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'AWS CLI.

Il est recommandé de gérer toutes les ressources de pile via AWS CloudFormation et de ne pas apporter de modifications aux ressources de pile en dehors de CloudFormation.

La méthode que vous utilisez pour remplacer la méthode HTTP par POST pour la demande d'intégration de backend dépend de la définition du modèle d'origine. Le processus de mise à jour d'une passerelle d'API déployée par CloudFormation diffère du processus de mise à jour d'une passerelle d’API créée par OpenAPI.

Passerelles d’API créées dans CloudFormation

Pour les passerelles d’API créées par CloudFormation, vous devez mettre à jour le modèle de pile. Si vous avez défini la ressource AWS::ApiGateway::Method dans votre modèle CloudFormation pour créer votre méthode, mettez à jour la propriété HttpMethod sur POST. Pour obtenir des instructions, consultez la section Exemples.

Si votre méthode utilise une définition OpenAPI pour la propriété Corps de la ressource AWS::ApiGateway::RestAPI, définissez httpMethod sur POST dans votre fichier de définition d'API. Pour obtenir des instructions, consultez la section Objet x-amazon-apigateway-integration. Consultez également l'exemple de modèle Swagger dans le référentiel de GitHub aws-samples.

Pour mettre à jour votre API, exécutez les mises à jour de la pile AWS CloudFormation à l’aide du modèle modifié :

"x-amazon-apigateway-integration" : {    "type" : "aws",

    "httpMethod" : "POST"

Passerelles d’API créées en dehors de CloudFormation

Mettre à jour la méthode dans la console

Procédez comme suit :

  1. Ouvrez la console API Gateway.
  2. Choisissez votre API.
  3. Dans Ressources, choisissez la méthode HTTP intégrée à Lambda.
  4. Dans Exécution de la méthode, sélectionnez Demande d’intégration.
  5. Dans Demande d'intégration, pour Méthode HTTP, modifiez le nom de la fonction Lambda.
  6. Lorsque vous êtes invité à ajouter une autorisation à la fonction Lambda, choisissez OK.
  7. Déployez votre API.
  8. (Facultatif) Testez la méthode HTTP qui est intégrée à Lambda.

Remarque : Chaque fois que vous sélectionnez OK dans l'invite Ajouter une autorisation à la fonction Lambda, la console ajoute une nouvelle instruction à la politique de ressources de la fonction Lambda. Assurez-vous de ne pas dépasser la limite de taille de la politique de ressources. Pour plus d'informations, consultez les sections Configuration, déploiement et exécution des fonctions et Configurer une demande d’intégration d’API à l’aide de la console API Gateway.

Mettre à jour la table dans l’AWS CLI

Procédez comme suit :

  1. Pour mettre à jour la méthode HTTP d'intégration vers POST, exécutez la commande put-integration :

    aws apigateway put-integration \--rest-api-id 1234123412 \
    --resource-id a1b2c3 \
    --http-method ANY \
    --type AWS \
    --integration-http-method POST \
    --uri 'arn:aws:apigateway:us-west-2:lambda:path//2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:function_name/invocations
  2. Pour déployer les ressources configurées pour une API sur une étape existante, exécutez la commande create-deployment :

    aws apigateway create-deployment \--rest-api-id 1234123412 \
    --stage-name dev \
    --description 'Deployment to an existing dev stage'

Mettre à jour la méthode via une importation de définition d’OpenAPI

Procédez comme suit :

  1. Dans votre fichier de définition d'API, définissez la valeur de la propriété httpMethod sur POST. Pour obtenir des instructions, consultez l’objet x-amazon-apigateway-integration et l’exemple de modèle Swagger dans le référentiel de GitHub aws-samples.
  2. Pour mettre à jour votre API, importez le fichier de définition d'API modifié dans API Gateway. Consultez la section Importer un fichier OpenAPI pour mettre à jour une définition d'API existante.

Informations connexes

AWS::ApiGateway::Method Integration

Tutoriel : Créer une API REST de calculateur avec deux intégrations de service AWS et une intégration Lambda sans proxy

J'ai défini mon intégration Lambda dans API Gateway à l'aide d'une variable d’étape. Pourquoi une « erreur interne du serveur » et un code de statut 500 s’affichent-ils lorsque j'appelle la méthode API ?

Comment puis-je résoudre les erreurs HTTP 502 provenant des API REST API Gateway avec une intégration de proxy Lambda ?

Comment résoudre les erreurs « Invalid mapping expression specified » provenant d'API Gateway ?