Comment puis-je transmettre des en-têtes personnalisés via API Gateway à une fonction Lambda en utilisant une intégration Lambda personnalisée ?

Lecture de 6 minute(s)
0

Je souhaite configurer une fonction AWS Lambda via une intégration personnalisée (non proxy) pour traiter les en-têtes personnalisés qui sont transmis via mon API d'Amazon API Gateway. Comment je fais ça ?

Brève description

Par défaut, une fonction Lambda traite uniquement le corps de requête de méthode qu'elle reçoit d'une demande d'une API d'API Gateway. Pour transmettre des en-têtes personnalisés d'une API d'API Gateway à une fonction Lambda, utilisez un modèle de mappage de corps. L'API envoie la demande d'API mise à jour à une fonction Lambda pour traiter les en-têtes. Ensuite, la fonction Lambda renvoie une ou plusieurs valeurs d'en-tête de la demande d'API d'origine.

Solution

Vérifiez que vous disposez des autorisations AWS Identity and Access Management (IAM) requises.

Suivez les instructions de la section Contrôler l'accès à une API avec des autorisations IAM.

Pour tester cette procédure, vous pouvez créer un rôle IAM et attacher les stratégies gérées AWS suivantes :

  • AmazonAPIGatewayInvokeFullAccess
  • AmazonAPIGatewayPushToCloudWatchLogs

Créer une fonction Lambda pour gérer les en-têtes personnalisés de votre API d'API Gateway

1.    Ouvrez la console Lambda.

2.    Choisissez Create function (Créer une fonction). La page Create function (Créer une fonction) s'ouvre avec l'option Author from scratch (Créer à partir de zéro) sélectionnée.

3.    Dans le panneau Basic information (Informations de base), procédez comme suit :
Pour Function name (Nom de fonction), saisissez un nom qui décrit le but de votre fonction. Par exemple :CustomHeaders (En-têtes personnalisés).
Dans le champ Runtime (Exécution), choisissez Node.js 14.x.

4.    Sous Permissions (Autorisations), développez Change default execution role (Modifier le rôle d'exécution par défaut).

5.    Choisissez Use an existing role (Utiliser un rôle existant). Une liste déroulante des rôles existants s'affiche.

6.    Pour Existing role (Rôle existant), choisissez le rôle d'exécution Lambda que vous avez créé précédemment.

7.    Choisissez Create function (Créer une fonction).

8.    Dans le volet Source du code, remplacez le code dans le volet de l'éditeur (index.js) par le code suivant :

exports.handler = (event, context, callback) => {
// TODO implement
callback(null, "This message header was processed by Amazon " +event.headers["header1"]);
};

9.    Choisissez Save (Enregistrer).

Pour plus d'informations, consultez Création de fonctions Lambda avec Node.js.

Créer une API REST API Gateway

1.    Ouvrez la console API Gateway.

2.    Sélectionnez Create API (Créer une API).

-ou-

Si vous utilisez API Gateway pour la première fois, une page vous présentant les fonctionnalités de l'outil s'affiche. Sous API REST, choisissez Build (Créer). Lorsque la fenêtre contextuelle Create Example API (Créer l'exemple d'API) apparaît, choisissez OK.

3.    Pour Choose an API type (Choisir un type d'API), dans le panneau API REST, choisissez Build.

4.    Sous Create new API (Créer une nouvelle API), choisissez New API (Nouvelle API).

5.    Sous Settings (Paramètres), procédez comme suit :
Pour API name (Nom de l'API), saisissez un nom qui décrit l'objectif de votre API. Par exemple : SendtoLambda (Envoyer à Lambda).
Pour Description, écrivez une brève description de l'objectif de votre API (facultatif).
Pour Endpoint Type (Type de point de terminaison), choisissez Regional.

6.    Choisissez Create API (Créer une API).

Configurer le point d'intégration de votre API et le modèle de mappage de corps

1.    Dans la console API Gateway, choisissez le nom de l'API que vous avez créée à l'étape précédente. La page Ressources de votre API s'ouvre.

2.    Sur la page Ressources, choisissez Actions. Choisissez ensuite Create Resource (Créer une ressource).

3.    Dans le panneau New Child Resource (Ressource du nouvel enfant), procédez comme suit :
Pour Resource Name, saisissez un nom qui décrit la ressource. Par exemple : HeadersResource (Ressource d'en-tête).
Sélectionnez Create Resource (Créer une ressource).

4.    Choisissez Actions. Sélectionnez ensuite Create Method (Créer une méthode).

5.    Dans la liste déroulante sous /headersresource, choisissez POST. Ensuite, choisissez l'icône de coche.

6.    Sur la page /headersresource - POST - Setup, procédez comme suit :
Pour Integration type (Type d'intégration), choisissez Lambda Function (Fonction Lambda).
Pour Lambda Region, choisissez la région AWS qui héberge votre fonction.
Pour Lambda Function, saisissez le nom de votre fonction.
Choisissez Save (Enregistrer). Une fenêtre contextuelle Add Permission to Lambda Function Ajouter une autorisation à la fonction Lambda apparaît.
Dans la fenêtre contextuelle, cliquez sur OK.

7.    Sur la page /headersresource - POST - Method Execution, choisissez Integration Request (Demande d'intégration).

8.    Sur la page /headersresource - POST - Integration Request, procédez comme suit :
Développez Mapping Templates (Modèle de mappage).
Pour Request body passthrough, choisissez When there are no templates defined (recommended).
Choisissez Add mapping template (Ajouter un modèle de mappage).
Pour Content-Type, saisissez application/json. Ensuite, choisissez l'icône de coche.

9.    Dans l'éditeur de modèle de mappage, entrez ce qui suit :

{
  "method": "$context.httpMethod",
  "body" : $input.json('$'),
  "headers": {
    #foreach($param in $input.params().header.keySet())
    "$param": "$util.escapeJavaScript($input.params().header.get($param))"
    #if($foreach.hasNext),#end
    #end
  }
}

10.    Choisissez Save (Enregistrer).

Déployer votre API vers une nouvelle étape

1.    Suivez les instructions de la section Déployer une API REST vers une étape. Pour plus d'informations, consultez la section Configuration d'une étape à l'aide de la console API Gateway.

2.    Dans le panneau Stage Editor (Éditeur d'étape), copiez l'URL d'appel dans le presse-papiers.

Exemple d'URL d'appel de l'API REST

https://1a2bc3d456.execute-api.region.amazonaws.com/test

Tester votre configuration

Pour vérifier que les en-têtes de message sont traités par votre API et la fonction Lambda, exécutez la commande curl suivante :

Important : remplacez https://restApiId.execute-api.region.amazonaws.com/stageName par l'URL d'appel de votre API.

curl -H "Content-Type: application/json" -H "header1: API Gateway and AWS Lambda" -X POST -d "{\"API_body\": \"This is the body\"}" https://restApiId.execute-api.region.amazonaws.com/stageName/headersresource

Exemple de sortie

"This message header was processed by Amazon API Gateway and AWS Lambda"

Remarque : pour installer curl sous Windows, consultez la section Téléchargements sur le site Web Git. Pour plus d'informations sur curl, consultez le site Web du projet curl.


Informations connexes

Configuration de transformations de données pour les API REST

Autorisations Lambda

Contrôler l'accès à une API avec des autorisations IAM