Pourquoi je reçois des erreurs « Execution failed due to configuration » (Échec de l'exécution en raison de la configuration) de l'API Gateway après avoir utilisé un modèle CloudFormation ou une définition OpenAPI pour créer une API REST avec une intégration Lambda ?

Date de la dernière mise à jour : 04/05/2022

J'ai utilisé un modèle AWS CloudFormation (ou une définition OpenAPI) pour créer une API REST Amazon API Gateway avec intégration AWS Lambda. Lorsque j'essaie d'appeler ma fonction Lambda à l'aide de la méthode API, je reçois le message d'erreur suivant et le code d'état 500 : « Execution failed due to configuration » (Échec de l'exécution en raison de la configuration). Quelle est la cause de l'erreur et comment résoudre le problème ?

Brève description

Si vous disposez d'une API REST API Gateway avec intégration Lambda, l'API doit appeler la fonction Lambda backend en utilisant la méthode HTTP POST. Si vous utilisez une autre méthode HTTP (par exemple, ANY ou GET) pour la demande d'intégration backend, l'appel échoue. API Gateway envoie ensuite un message d'erreur similaire à l'exemple suivant dans vos journaux Amazon CloudWatch :

Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 ms
Mon 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 une méthode HTTP pour le frontend de votre API REST.

Vous devez spécifier la méthode POST pour la demande d'intégration backend si vous créez une API REST avec intégration Lambda de l'une des manières suivantes :

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

Solution

La bonne pratique de CloudFormation est de gérer toutes les ressources de la pile via AWS CloudFormation et de ne pas apporter de modifications aux ressources de la pile en dehors de CloudFormation.

La méthode utilisée pour changer la méthode HTTP en POST pour la demande d'intégration backend dépend de la définition du modèle d'origine. Par exemple, le processus est différent pour mettre à jour une API Gateway déployée à l'aide de CloudFormation par rapport à une API Gateway créée avec OpenAPI ou l'AWS CLI.

Pour modifier la méthode de demande d'intégration en POST pour les API Gateways créées à l'aide de CloudFormation

Pour obtenir des instructions, consultez la section Modification d'un modèle de pile.

A. Si votre méthode a été créée en définissant la ressource AWS::ApiGateway::Method dans votre modèle CloudFormation, mettez à jour la propriété HttpMethod sur POST. Pour obtenir des instructions, consultez la section Exemples de la documentation AWS::ApiGateway::Method.

B. Si votre méthode inclut une définition OpenAPI comme valeur de la propriété Body de la ressource AWS::ApiGateway::RestAPI : définissez la valeur de la propriété httpMethod dans votre fichier de définition d'API sur POST.  Pour plus d'informations, consultez la section Objet x-amazon-apigateway-integration et exemple de modèle Swagger dans le référentiel GitHub aws-samples.

Mettez à jour votre API en exécutant des mises à jour de la pile AWS CloudFormation avec le modèle modifié :

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

    "httpMethod" : "POST"

Pour modifier la méthode HTTP de l'intégration backend en POST pour les API Gateways créées en dehors de CloudFormation

Méthode de mise à jour en utilisant la console

  1. Dans la console API Gateway, choisissez votre API.
  2. Dans le panneau Resources (Ressources), choisissez la méthode HTTP ayant l'intégration Lambda.
  3. Dans le panneau Method Execution (Exécution de la méthode), choisissez Integration Request (Demande d'intégration).
  4. Dans le panneau Integration Request (Demande d'intégration), pour la HTTP method (méthode HTTP), modifiez le nom de la fonction Lambda en cliquant sur l'icône en forme de crayon à droite du nom de la fonction, puis cliquez sur l'icône en forme de coche qui apparaît à droite.
  5. Après l'affichage de l'invite Add Permission to Lambda Function (Ajouter une autorisation à la fonction Lambda), choisissez OK.
  6. Déployez votre API.
  7. (Facultatif) Testez la méthode HTTP avec l'intégration Lambda.

Remarque : la console ajoute une nouvelle instruction à la politique de ressources de la fonction Lambda chaque fois que vous sélectionnez OK dans l'invite Add Permission to Lambda Function (Ajouter une autorisation à la fonction Lambda). Notez la taille de la politique de ressources de votre fonction pour vous assurer qu'elle n'atteint pas la limite de taille de la politique de ressources. Consultez : Configuration, déploiement et exécution des fonctions.

Pour plus d'informations, consultez Démarrer avec API Gateway et Configuration d'une demande d'intégration d'API à l'aide de la console API Gateway.

Mettez à jour la méthode à l'aide de l'AWS CLI

  1. Exécutez la méthode put-integration pour mettre à jour la méthode http d'intégration en POST :
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. Déployez les ressources configurées pour une API vers une étape existante :

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

Remarque : si vous recevez des erreurs lors de l'exécution de commandes AWS CLI, vérifiez que vous utilisez la version la plus récente d'AWS CLI.

Mettez à jour la méthode à l'aide de l'importation de définition OpenAPI

  1. Définissez la valeur de la propriété httpMethod dans votre fichier de définition d'API sur POST. Pour plus d'informations, consultez la section Objet x-amazon-apigateway-integration et exemple de modèle Swagger dans le référentiel GitHub aws-samples.
  2. Mettez à jour votre API en important le fichier de définition d'API mis à jour dans API Gateway. Consultez la section Importation d'un fichier OpenAPI pour mettre à jour une définition d'API existante.