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

Par défaut, une fonction AWS Lambda reçoit uniquement le corps de requête reçu par une API créée dans Amazon API Gateway. L'exemple de cet article illustre comment se servir de l'utilitaire curl pour envoyer un message à API Gateway, lequel utilise un modèle de mappage de corps pour extraire les en-têtes personnalisés ajoutés au message. Ensuite, l'API envoie le message mis à jour à une fonction Lambda afin qu'elle traite les en-têtes et renvoie une ou plusieurs valeurs d'en-tête du message d'origine.

Procédez comme suit pour acheminer des en-têtes personnalisés d'une API Amazon API Gateway vers une fonction Lambda.

Créer la fonction Lambda

Remarque

L'exemple suivant suppose que vous avez déjà configuré les autorisations nécessaires pour AWS Lambda et Amazon API Gateway comme décrit dans Authentification et contrôle d'accès pour AWS Lambda et Définition d'autorisations IAM pour l'accès à API Gateway. Pour les besoins de cet exemple, vous devez créer un rôle test auquel sont associées les deux stratégies gérées AmazonAPIGatewayInvokeFullAccess et AmazonAPIGatewayPushToCloudWatchLogs.

1.    Ouvrez la console AWS Lambda et choisissez Functions.

2.    Sélectionnez Create a Lambda function.

3.    Choisissez l'option Configure function.

4.    Entrez les valeurs appropriées dans les champs Name, Description et Runtime. Cet exemple utilise le nom CustomHeaders. Cet exemple s'appuie sur le runtime Node.js 4.3.

5.    Entrez le code suivant pour la fonction Lambda et vérifiez que Edit code inline est sélectionné pour l'option Code entry type.

exports.handler = (event, context) => {

context.done(null, "This message header was processed by Amazon " +event.headers["header1"]);

};

6.    Sous Lambda function handler and role, choisissez Choose an existing role pour Role, puis sélectionnez le nom du rôle test créé précédemment pour Existing role. Conservez les valeurs par défaut pour toutes les autres options de cette page. Sélectionnez Next.

7.    Choisissez Create Function et sélectionnez l'option Publish dans le menu Actions.

Créer l'API API Gateway

1.    Ouvrez la console API Gateway, choisissez APIs, puis choisissez Create API pour afficher la page Create new API. Vérifiez que l'option New API est sélectionnée. Spécifiez le nom SendtoLambda et ajoutez une brève description.

2.    Choisissez Create API.

3.    Ajoutez une ressource à l'API. Dans le volet de gauche, choisissez Ressources et, dans le menu Actions, choisissez Create Resource pour afficher la page New Child Resource. Entrez HeadersResource dans le champ Resource Name, puis choisissez Create Resource.

4.    Dans la console API Gateway, sélectionnez le nouveau headersresource. Dans le menu déroulant Actions, choisissez Create Method, puis choisissez POST dans la zone de liste déroulante qui s'affiche. Sélectionnez l'icône de coche affichée à droite de la méthode POST pour afficher la page /headersresource - POST - Setup.

5.    Sur cette page, vérifiez que la valeur de Integration type est définie sur Lambda Function, sélectionnez la région Lambda appropriée, puis entrez le nom CustomHeaders. Choisissez Save pour afficher la boîte de dialogue Add Permission to Lambda Function et choisissez OK.

6.    Sélectionnez la méthode POST dans le volet Resources afin d'afficher les informations d'exécution de la méthode. Sélectionnez le lien Integration Request répertorié dans la section /headersresource - POST - Method Execution.

7.    Conservez les paramètres par défaut de l'option Integration Request et développez Body Mapping Templates. Pour Request body passthrough, choisissez l'option « When there are no templates defined (recommended) », puis choisissez Add mapping template pour afficher l'option Content-Type. Entrez application/json sous Content-type, puis sélectionnez l'icône de coche.

8.    Entrez le code suivant dans la section d'entrée de code. Ce code parcourt les en-têtes des messages et ajoute chaque en-tête au corps du message de réponse.

{

    "method": "$context.httpMethod",

    "body" : $input.json('$'),

    "en-têtes": {

        #foreach($param in $input.params().header.keySet())

        "$param": "$util.escapeJavaScript($input.params().header.get($param))"

        #if($foreach.hasNext),#end

        #end

    }

}

9.    Choisissez Save pour mettre à jour la méthode POST pour l'API.

10.    Dans le menu Actions, choisissez Deploy API et entrez le nom d'une étape (par exemple, prod, test ou bêta). Une fois l'API déployée, vous êtes redirigé vers la page Stage Editor.

11.    Sur la page Stage Editor, sélectionnez la méthode POST et notez l'URL affichée en regard de Invoke URL: en haut de la page Stage Editor ; il s'agit de l'URL via laquelle sera appelée la méthode.

12.    Utilisez l'utilitaire curl pour envoyer un message à API Gateway. L'exemple suivant 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\"}"

13.    La sortie suivante doit s'afficher dans la console :

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

Remarque : Si vous devez installer curl sous Windows, envisagez de télécharger Git for Windows qui inclut le shell bash GNU et d'autres outils Linux tels que curl, tail, cat, grep, gzip et Perl.

L'outil de test PostMan peut également s'avérer utile. Il est disponible gratuitement en tant qu'application pour Chrome ou Mac.

Pour résumer

Ces étapes fournissent une vue d'ensemble de l'exemple :

1.    Un message est envoyé à la méthode POST d'une ressource API Gateway configurée avec une demande d'intégration à une fonction Lambda.

2.    La demande d'intégration utilise un modèle de mappage de corps pour copier les en-têtes de message dans le corps du message.

3.    La ressource API Gateway envoie une réponse mise à jour à la fonction Lambda.

4.    La fonction Lambda renvoie l'en-tête du message d'origine au mandataire.

Amazon API Gateway, AWS Lambda, modèle de mappage de corps, Node.js, intégration, en-têtes personnalisés, fonction, ressources, étape, déployer, corps de la demande


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support

Date de publication : 10/06/2016