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

Dernière mise à jour : 08/01/2020

Comment créer une fonction AWS Lambda pour traiter des en-têtes personnalisés de messages transmis via une API Amazon API Gateway ?

Brève description

Par défaut, une fonction Lambda ingère uniquement le corps de la demande reçue par une API Gateway. Pour transmettre des en-têtes personnalisés à partir d'une API Gateway vers une fonction Lambda, utilisez curl pour envoyer un message à l'API à l'aide d'un modèle de mappage de corps pour extraire les en-têtes personnalisés ajoutés au message.

L'API envoie le message mis à jour à une fonction Lambda pour traiter les en-têtes, en renvoyant une ou plusieurs valeurs d'en-tête du message d'origine.

Solution

Configurer les autorisations IAM

Configurez les autorisations AWS Identity and Access Management (IAM) requises pour Lambda et API Gateway. Pour plus d'informations, consultez Contrôler l'accès à une API avec des autorisations IAM.

Pour les tests, créez un rôle IAM et attachez les stratégies gérées par AWS AmazonAPIGatewayInvokeFullAccess et AmazonAPIGatewayPushToCloudWatchLogs.

Créer une fonction Lambda

1.    Ouvrez la console Lambda.

2.    Si vous n'êtes pas un habitué de Lambda, choisissez « Get Started Now » (Mise en route). Dans le cas contraire, choisissez « Create function » (Créer une fonction). La page « Create function » (Créer une fonction) s'ouvre et propose l'option « Author from scratch » (Créer à partir de zéro).

3.    Lorsque l'option « Author from scratch » (Créer à partir de zéro) est sélectionnée, allez sous « Basic information » (Informations de base) et procédez comme suit :
Pour Function name (Nom de la fonction), saisissez un nom comme CustomHeaders.
Pour Runtime (Exécution), choisissez Node.js 12.x.

4.    Sous Permissions (Autorisations), développez Choose or create an execution role (Choisir ou créer un rôle d'exécution).

5.    Choisissez Use an existing role (Utiliser un rôle existant).

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

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

8.    Dans le volet Configuration sous Function code (Code de fonction), remplacez le code dans le volet de l'éditeur (index.js) par l'exemple de code de fonction 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 Gateway

1.    Ouvrez la console API Gateway.

2.    Si vous avez des API existantes dans la console, choisissez Create API (Créer une API). Si ce n'est pas le cas, passez à l'étape suivante.

3.    Pour l'option Choose an API type (Choisir un type d'API), sous REST API (API REST), choisissez Build (Créer).

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

5.    Sous Settings (Paramètres), procédez comme suit :
Saisissez un nom d'API, comme SendtoLambda.
(Facultatif) Entrez une Description.
Laissez le Type de point de terminaison sur Régional.

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

Configurer l'API

1.    Dans la console API Gateway, dans le volet Resources de votre nouvelle API, choisissez Actions, puis Create Resource (Créer une ressource).

2.    Dans le volet New Child Resource (Ressource du nouvel enfant) procédez comme suit :
Saisissez un nom de ressource, tel que HeadersResource.
Sélectionnez Create Resource (Créer une ressource).

3.    Choisissez Actions, puis Create Method (Créer une méthode).

4.    Dans le menu déroulant sous /headersresource, choisissez POST, puis sélectionnez l'icône de coche.

5.    Dans le volet /headersresource - POST - Setup procédez comme suit pour configurer votre point d'intégration :
Pour Integration type (Type d'intégration), choisissez Lambda Function (Fonction Lambda).
Pour Lambda Region (Région Lambda), choisissez la région AWS de votre fonction Lambda.
Pour Lambda Function (Fonction Lambda), entrez le nom de votre fonction Lambda.
Choisissez « Save » (Enregistrer).

6.    Dans la boîte de dialogue Add Permission to Lambda Function (Ajouter des autorisations à la fonction Lambda), cliquez sur OK.

7.    Dans le volet /headersresource - POST - Method Execution, choisissez Integration Request (Demande d'intégration).

8.    Dans le volet /headersresource - POST - Integration Request procédez comme suit :
Développez Mappage de modèles.
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, entrez application/json, puis choisissez l'icône de coche Create (Créer).

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

1.    Dans le volet Resources (Ressource) de la console API Gateway, choisissez Actions, puis Deploy API (Déployer l’API).

2.    Dans la boîte de dialogue Deploy API (Déployer l'API), procédez comme suit :
For Deployment stage (Étape de déploiement), choisissez [New Stage] (Nouvelle étape).
Pour Stage name (Nom de l'étape), entrez un nom, tel que test.
(Facultatif) Entrez une description d'étape et une description de déploiement.
Choisissez Deploy (Déployer).

3.    Dans le volet Stage Editor (Éditeur d'étape), copiez l'URL d'appel dans le Presse-papiers. L'URL ressemble à ceci : https://1a2bc3d456.execute-api.region.amazonaws.com/test.

Tester votre API

Utilisez curl pour envoyer un message à votre API Gateway. Pour plus d'informations sur la commande curl, consultez le site Web du projet cURL.

Astuce : pour installer curl sur Windows, vous pouvez télécharger Git pour Windows, qui inclut le shell GNU Bash et d'autres outils Linux, tels que curl, tail, cat, grep, gzip et Perl. Pour télécharger Git pour Windows, consultez Downloads sur le site web de Git. Pour plus d'informations sur Bash, consultez GNU Bash sur le site web de GNU.

Cet exemple de commande renvoie la valeur de l'en-tête header1 référencé par la fonction Lambda :

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

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

En cas de réussite, vous voyez le résultat suivant :

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