Invoquer Lambda avec API Gateway - AWS SDK for JavaScript

Le guide de référence de l'API AWS SDK for JavaScript V3 décrit en détail toutes les opérations de l'API pour la AWS SDK for JavaScript version 3 (V3).

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Invoquer Lambda avec API Gateway

Vous pouvez appeler une fonction Lambda à l'aide d'Amazon API Gateway, un AWS service permettant de créer, de publier, de gérer, de surveiller et de sécuriser REST, HTTP et des WebSocket API à grande échelle. Les développeurs d'API peuvent créer des API qui accèdent à AWS ou à d'autres services web, ainsi qu'aux données stockées dans le cloud AWS. En tant que développeur d'API Gateway, vous pouvez créer des API à utiliser dans vos propres applications clientes. Pour plus d'informations, consultez Qu'est-ce qu'Amazon API Gateway ?

AWS Lambdaest un service de calcul qui vous permet d'exécuter du code sans provisionner ni gérer de serveurs. Vous pouvez créer des fonctions Lambda dans différents langages de programmation. Pour plus d’informations sur AWS Lambda, consultez Qu’est-ce qu’un AWS Lambda.

Dans cet exemple, vous créez une fonction Lambda à l'aide de l'API d'exécution JavaScript Lambda. Cet exemple invoque différents AWS services permettant d’effectuer un cas d’utilisation spécifique. Supposons, par exemple, qu'une organisation envoie un message texte mobile à ses employés pour les féliciter à la date du premier anniversaire, comme le montre cette illustration.

Tableau DynamoDB

La réalisation de l'exemple devrait prendre environ 20 minutes.

Cet exemple montre comment utiliser la JavaScript logique pour créer une solution qui exécute ce cas d'utilisation. Par exemple, vous apprendrez à lire une base de données pour déterminer quels employés ont atteint le premier anniversaire, à traiter les données et à envoyer un message texte à l'aide d'une fonction Lambda. Vous apprendrez ensuite à utiliser API Gateway pour appeler cette AWS Lambda fonction à l'aide d'un point de terminaison Rest. Par exemple, vous pouvez appeler la fonction Lambda à l'aide de cette commande curl :

curl -XGET "https://xxxxqjko1o3.execute-api.us-east-1.amazonaws.com/cronstage/employee"

Ce AWS didacticiel utilise une table Amazon DynamoDB nommée Employee qui contient ces champs.

  • id : clé primaire de la table.

  • FirstName : prénom de l'employé.

  • téléphone - numéro de téléphone de l'employé.

  • Date de début : date de début de l'employé.

Tableau DynamoDB
Important

Coût de réalisation : Les AWS services inclus dans ce document sont inclus dans le niveau AWS gratuit. Veillez toutefois à désactiver toutes les ressources une fois que vous aurez terminé cet exemple afin de ne pas être débité.

Tâches préalables

Pour configurer et exécuter cet exemple, vous devez d'abord :

  • Configurez l'environnement du projet pour exécuter ces TypeScript exemples de nœuds et installez les modules requis AWS SDK for JavaScript et tiers. Suivez les instructions indiquées sur GitHub.

  • Créez un fichier de configurations partagé avec vos informations d'identification utilisateur. Pour plus d'informations sur la fourniture d'un fichier d'informations d'identification partagé, consultez la section Fichiers de configuration et d'informations d'identification partagés dans le Guide de référence AWS des SDK et des outils.

Créez les AWS ressources

Ce didacticiel nécessite les ressources suivantes :

  • Une table Amazon DynamoDB Employee nommée avec une clé Id nommée et les champs illustrés dans l'illustration précédente. Assurez-vous de saisir les données correctes, y compris un téléphone portable valide avec lequel vous souhaitez tester ce cas d'utilisation. Pour plus d'informations, voir Création d'une table.

  • Rôle IAM associé à des autorisations permettant d'exécuter des fonctions Lambda.

  • Un compartiment Amazon S3 pour héberger la fonction Lambda.

Vous pouvez créer ces ressources manuellement, mais nous vous recommandons de les approvisionner AWS CloudFormation comme décrit dans ce didacticiel.

Créez les AWS ressources à l'aide de AWS CloudFormation

AWS CloudFormationvous permet de créer et de provisionner des déploiements AWS d'infrastructure de manière prévisible et répétée. Pour plus d’informations sur AWS CloudFormation, consultez le AWS CloudFormationGuide de l’utilisateur .

Pour créer la AWS CloudFormation pile à l'aide de AWS CLI :

  1. Installez et configurez en AWS CLI suivant les instructions du guide de l'AWS CLIutilisateur.

  2. Créez un fichier nommé setup.yaml dans le répertoire racine du dossier de votre projet et GitHubcopiez-y le contenu.

    Note

    Le AWS CloudFormation modèle a été généré à l'aide du modèle AWS CDK disponible ici GitHub. Pour en savoir plus sur le AWS CDK, veuillez consulter le Guide du développeur AWS Cloud Development Kit (AWS CDK).

  3. Exécutez la commande suivante depuis la ligne de commande, en remplaçant STACK_NAME par un nom unique pour la pile.

    Important

    Le nom de la pile doit être unique au sein d'une AWS région et d'un AWS compte. Vous pouvez spécifier jusqu'à 128 caractères. Les chiffres et les tirets sont autorisés.

    aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM

    Pour plus d'informations sur les paramètres de create-stack commande, consultez le guide de référence des AWS CLI commandes et le guide de AWS CloudFormation l'utilisateur.

  4. Ensuite, renseignez le tableau en suivant la procédureRemplissage du tableau.

Remplissage du tableau

Pour remplir le tableau, créez d'abord un répertoire nommélibs, puis créez un fichier nommédynamoClient.js, puis collez-y le contenu ci-dessous.

const { DynamoDBClient } = require ( "@aws-sdk/client-dynamodb" ); // Set the AWS Region. const REGION = "REGION"; // e.g. "us-east-1" // Create an Amazon Lambda service client object. const dynamoClient = new DynamoDBClient({region:REGION}); module.exports = { dynamoClient };

Ce code est disponible ici GitHub.

Créez ensuite un fichier nommé populate-table.js dans le répertoire racine du dossier de votre projet et GitHubcopiez-y le contenu. Pour l'un des articles, remplacez la valeur de la phone propriété par un numéro de téléphone portable valide au format E.164, et la valeur startDate par la date du jour.

Exécutez la commande suivante depuis la ligne de commande.

node populate-table.js
const { BatchWriteItemCommand } = require ( "aws-sdk/client-dynamodb" ); const {dynamoClient} = require ( "./libs/dynamoClient" ); // Set the parameters. export const params = { RequestItems: { Employees: [ { PutRequest: { Item: { id: { N: "1" }, firstName: { S: "Bob" }, phone: { N: "155555555555654" }, startDate: { S: "2019-12-20" }, }, }, }, { PutRequest: { Item: { id: { N: "2" }, firstName: { S: "Xing" }, phone: { N: "155555555555653" }, startDate: { S: "2019-12-17" }, }, }, }, { PutRequest: { Item: { id: { N: "55" }, firstName: { S: "Harriette" }, phone: { N: "155555555555652" }, startDate: { S: "2019-12-19" }, }, }, }, ], }, }; export const run = async () => { try { const data = await dbclient.send(new BatchWriteItemCommand(params)); console.log("Success", data); } catch (err) { console.log("Error", err); } }; run();

Ce code est disponible ici GitHub.

Création de la fonction AWS Lambda

Configuration du kit SDK

Dans le libs répertoire, créez des fichiers nommés snsClient.js etlambdaClient.js, puis collez le contenu ci-dessous dans ces fichiers, respectivement.

const { SNSClient } = require ( "@aws-sdk/client-sns" ); // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon SNS service client object. const snsClient = new SNSClient({ region: REGION }); module.exports = { snsClient };

Remplacez REGION par AWS Region. Ce code est disponible ici GitHub.

const { LambdaClient } = require ( "@aws-sdk/client-lambda" ); // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon Lambda service client object. const lambdaClient = new LambdaClient({ region: REGION }); module.exports = { lambdaClient };

Remplacez REGION par AWS Region. Ce code est disponible ici GitHub.

Importez d'abord les modules et commandes requis AWS SDK for JavaScript (v3). Calculez ensuite la date du jour et attribuez-la à un paramètre. Troisièmement, créez les paramètres pourScanCommand. Remplacez TABLE_NAME par le nom de la table que vous avez créée dans la Créez les AWS ressources section de cet exemple.

L'extrait de code suivant illustre cette étape. (Pour obtenir l'exemple complet, consultez Regroupement de la fonction Lambda.)

"use strict"; const { ScanCommand } = require("@aws-sdk/client-dynamodb"); const { PublishCommand } = require("@aws-sdk/client-sns"); const {snsClient} = require ( "./libs/snsClient" ); const {dynamoClient} = require ( "./libs/dynamoClient" ); // Get today's date. const today = new Date(); const dd = String(today.getDate()).padStart(2, "0"); const mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0! const yyyy = today.getFullYear(); const date = yyyy + "-" + mm + "-" + dd; // Set the parameters for the ScanCommand method. const params = { // Specify which items in the results are returned. FilterExpression: "startDate = :topic", // Define the expression attribute value, which are substitutes for the values you want to compare. ExpressionAttributeValues: { ":topic": { S: date }, }, // Set the projection expression, which are the attributes that you want. ProjectionExpression: "firstName, phone", TableName: "Employees", };

Analyse de la table DynamoDB

Créez d'abord une fonction async/await appelée sendText pour publier un message texte à l'aide d'Amazon SNS. PublishCommand Ajoutez ensuite un schéma de try blocs qui analyse la table DynamoDB à la recherche des employés à l'occasion de leur anniversaire de travail aujourd'hui, puis appelle sendText la fonction pour envoyer un message texte à ces employés. En cas d'erreur, le catch bloc est appelé.

L'extrait de code suivant illustre cette étape. (Pour obtenir l'exemple complet, consultez Regroupement de la fonction Lambda.)

// Helper function to send message using Amazon SNS. exports.handler = async () => { // Helper function to send message using Amazon SNS. async function sendText(textParams) { try { await snsClient.send(new PublishCommand(textParams)); console.log("Message sent"); } catch (err) { console.log("Error, message not sent ", err); } } try { // Scan the table to identify employees with work anniversary today. const data = await dynamoClient.send(new ScanCommand(params)); data.Items.forEach(function (element) { const textParams = { PhoneNumber: element.phone.N, Message: "Hi " + element.firstName.S + "; congratulations on your work anniversary!", }; // Send message using Amazon SNS. sendText(textParams); }); } catch (err) { console.log("Error, could not scan table ", err); } };

Regroupement de la fonction Lambda

Cette rubrique décrit comment regrouper mylambdafunction.ts les AWS SDK for JavaScript modules requis pour cet exemple dans un fichier groupé appeléindex.js.

  1. Si ce n'est pas déjà fait, suivez cet exemple Tâches préalables pour installer le webpack.

    Note

    Pour plus d'informations sur Webpack, consultezRegroupez des applications avec Webpack.

  2. Exécutez ce qui suit dans la ligne de commande JavaScript pour regrouper les informations de cet exemple dans un fichier appelé <index.js> :

    webpack mylambdafunction.ts --mode development --target node --devtool false --output-library-target umd -o index.js
    Important

    Notez que la sortie est nomméeindex.js. Cela est dû au fait que les fonctions Lambda doivent avoir un index.js gestionnaire pour fonctionner.

  3. Compressez le fichier de sortie groupéindex.js,, dans un fichier ZIP nommémylambdafunction.zip.

  4. mylambdafunction.zipTéléchargez-le dans le compartiment Amazon S3 que vous avez créé dans la Créez les AWS ressources rubrique de ce didacticiel.

Déployer la fonction Lambda

À la racine de votre projet, créez un lambda-function-setup.ts fichier et collez-y le contenu ci-dessous.

Remplacez BUCKET_NAME par le nom du compartiment Amazon S3 dans lequel vous avez chargé la version ZIP de votre fonction Lambda. Remplacez ZIP_FILE_NAME par le nom de la version ZIP de votre fonction Lambda. Remplacez ROLE par le numéro de ressource Amazon (ARN) du rôle IAM que vous avez créé dans le Créez les AWS ressources sujet de ce didacticiel. Remplacez LAMBDA_FUNCTION_NAME par le nom de la fonction Lambda.

// Load the required Lambda client and commands. const { CreateFunctionCommand } = require ( "@aws-sdk/client-lambda" ); const { lambdaClient} = require ( "./libs/lambdaClient.js ); // Set the parameters. const params = { Code: { S3Bucket: "BUCKET_NAME", // BUCKET_NAME S3Key: "ZIP_FILE_NAME", // ZIP_FILE_NAME }, FunctionName: "LAMBDA_FUNCTION_NAME", Handler: "index.handler", Role: "IAM_ROLE_ARN", // IAM_ROLE_ARN; e.g., arn:aws:iam::650138640062:role/v3-lambda-tutorial-lambda-role Runtime: "nodejs12.x", Description: "Scans a DynamoDB table of employee details and using Amazon Simple Notification Services (Amazon SNS) to " + "send employees an email on each anniversary of their start-date.", }; const run = async () => { try { const data = await lambdaClient.send(new CreateFunctionCommand(params)); console.log("Success", data); // successful response } catch (err) { console.log("Error", err); // an error occurred } }; run();

Entrez ce qui suit sur la ligne de commande pour déployer la fonction Lambda.

node lambda-function-setup.ts

Cet exemple de code est disponible ici GitHub.

Configurer API Gateway pour appeler la fonction Lambda

Création de l'API Rest

Vous pouvez utiliser la console API Gateway pour créer un point de terminaison REST pour la fonction Lambda. Une fois cela fait, vous pouvez invoquer la fonction Lambda à l'aide d'un appel RESTful.

  1. Connectez-vous à la console Amazon API Gateway.

  2. Sous Rest API, choisissez Build.

  3. Sélectionnez Nouvelle API.

    Tableau DynamoDB
  4. Spécifiez Employee comme nom d'API et fournissez une description.

    Tableau DynamoDB
  5. Sélectionnez Create API (Créer une API).

  6. Choisissez Ressources dans la section Employé.

    Tableau DynamoDB
  7. Dans le champ du nom, spécifiez les employés.

  8. Choisissez Create Resources (Créer des ressources).

  9. Dans le menu déroulant Actions, choisissez Create Resources.

    Tableau DynamoDB
  10. Choisissez /employees, sélectionnez Create Method dans les Actions, puis sélectionnez GET dans le menu déroulant situé sous /employees. Choisissez l'icône représentant une coche.

    Tableau DynamoDB
  11. Choisissez fonction Lambda et entrez mylambdafunction comme nom de la fonction Lambda. Choisissez Enregistrer.

Testez la méthode API Gateway

À ce stade du didacticiel, vous pouvez tester la méthode API Gateway qui appelle la fonction Lambda mylambdafunction. Pour tester la méthode, choisissez Test, comme indiqué dans l'illustration suivante.

Tableau DynamoDB

Une fois que la fonction Lambda est invoquée, vous pouvez consulter le fichier journal pour voir un message de réussite.

Déployer la méthode API Gateway

Une fois le test réussi, vous pouvez déployer la méthode depuis la console Amazon API Gateway.

  1. Choisissez Get.

    Tableau DynamoDB
  2. Dans le menu déroulant Actions, sélectionnez Déployer l'API.

    Tableau DynamoDB
  3. Remplissez le formulaire Deploy API et choisissez Deploy.

    Tableau DynamoDB
  4. Choisissez Save Changes (Enregistrer les modifications).

  5. Choisissez à nouveau Obtenir et remarquez que l'URL change. Il s'agit de l'URL d'appel que vous pouvez utiliser pour appeler la fonction Lambda.

    Tableau DynamoDB

Supprimer les ressources

Félicitations ! Vous avez invoqué une fonction Lambda via Amazon API Gateway à l'aide du. AWS SDK for JavaScript Comme indiqué au début de ce didacticiel, veillez à désactiver toutes les ressources que vous créez pendant que vous suivez ce didacticiel pour vous assurer que vous n'êtes pas débité. Pour ce faire, supprimez la AWS CloudFormation pile que vous avez créée dans la Créez les AWS ressources rubrique de ce didacticiel, comme suit :

  1. Ouvrez le AWS CloudFormationdans la console AWS de gestion.

  2. Ouvrez la page Stacks et sélectionnez la pile.

  3. Sélectionnez Supprimer.