Invocación de Lambda con API Gateway - AWS SDK for JavaScript

La Guía de referencia de la API de AWS SDK for JavaScript V3 describe en detalle todas las operaciones de la API para la versión 3 (V3) de AWS SDK for JavaScript.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Invocación de Lambda con API Gateway

Puede invocar una función de Lambda utilizando Amazon API Gateway, que es un servicio de AWS para la creación, la publicación, el mantenimiento, el monitoreo y la protección de las API REST, HTTP y de WebSocket a cualquier escala. Los desarrolladores de la API pueden crear API que obtengan acceso a AWS o a otros servicios web, así como los datos almacenados en la nube de AWS. Como desarrollador de API Gateway, puede crear API para su uso en sus propias aplicaciones de cliente. Para obtener más información, consulte Qué es Amazon API Gateway

Lambda es un servicio de computación que permite ejecutar código sin aprovisionar ni administrar servidores. Puede crear funciones de Lambda en varios lenguajes de programación. Para obtener más información acerca de Lambda, consulte Qué es Lambda.

En este ejemplo, creará una función de Lambda utilizando la API de tiempo de ejecución de Lambda JavaScript. Este ejemplo invoca diferentes servicios de AWS para realizar un caso de uso específico. Por ejemplo, supongamos que una organización envía un mensaje de texto al móvil a sus empleados para felicitarles por su primer aniversario, como se muestra en esta ilustración.

Tabla de DynamoDB

Completar el ejemplo debería tomarle aproximadamente 20 minutos.

En este ejemplo, se muestra cómo utilizar la lógica de JavaScript para crear una solución que ejecute este caso de uso. Por ejemplo, aprenderá a leer una base de datos para determinar qué empleados han cumplido un año, cómo procesar los datos y cómo enviar un mensaje de texto, todo ello utilizando una función de Lambda. A continuación, aprenderá a usar API Gateway para invocar esta función de Lambda utilizando un punto de conexión de Rest. Por ejemplo, puede invocar la función de Lambda con este comando de curl:

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

En este tutorial de AWS se utiliza una tabla de Amazon DynamoDB denominada Employee que contiene estos campos.

  • id: la clave principal de la tabla.

  • firstName: nombre del empleado.

  • teléfono: número de teléfono del empleado.

  • startDate: fecha de inicio del empleado.

Tabla de DynamoDB
importante

Costo de finalización: los servicios de AWS incluidos en este documento están incluidos en el nivel gratuito de AWS. Sin embargo, asegúrese de cancelar todos los recursos una vez que haya completado este ejemplo para que no se le cobre nada.

Tareas previas necesarias

Para configurar y ejecutar este ejemplo, primero debe completar estas tareas:

  • Configure el entorno del proyecto para ejecutar estos ejemplos de Node TypeScript e instale los módulos necesarios de AWS SDK for JavaScript y de terceros. Siga las instrucciones en GitHub.

  • Cree un archivo de configuraciones compartidas con sus credenciales de usuario. Para obtener más información sobre proporcionar un archivo de credenciales compartido, consulte Archivos de configuración y credenciales compartidos en la Guía de referencia las herramientas y los SDK de AWS.

Crear los recursos de AWS

Este tutorial requiere los siguientes recursos:

  • Una tabla de Amazon DynamoDB llamada Employee con una clave llamada Id y los campos que se muestran en la ilustración anterior. Asegúrese de introducir los datos correctos, incluido un teléfono móvil válido con el que quiera probar este caso de uso. Para obtener más información, consulte Crear una tabla.

  • Un rol de IAM con permisos adjuntos para ejecutar funciones de Lambda.

  • Un bucket de Amazon S3 para alojar la función de Lambda.

Puede crear estos recursos manualmente, pero le recomendamos que los aprovisione utilizando AWS CloudFormation tal y cómo se describe en este tutorial.

Crear los recursos de AWS usando AWS CloudFormation

AWS CloudFormation le permite crear y aprovisionar implementaciones de infraestructura de AWS de forma predecible y uniforme. Para obtener más información sobre AWS CloudFormation, consulte la Guía del usuario de AWS CloudFormation.

Para crear la pila de AWS CloudFormation usando AWS CLI:

  1. Para instalar y configurar AWS CLI, siga las instrucciones de la Guía del usuario de AWS CLI.

  2. Cree un archivo con el nombre setup.yaml en el directorio raíz de la carpeta de su proyecto y copie en él este contenido de GitHub.

    nota

    La plantilla de AWS CloudFormation se generó usando AWS CDK disponible aquí en GitHub. Para obtener más información acerca de AWS CDK, consulte la Guía para desarrolladores de AWS Cloud Development Kit (CDK).

  3. Ejecute el siguiente comando desde la línea de comandos y reemplace STACK_NAME por un nombre único para la pila.

    importante

    El nombre de la pila tiene que ser único en una región de AWS de una cuenta de AWS. El nombre puede tener una longitud de hasta 128 caracteres, y se permiten números y guiones.

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

    Para obtener más información sobre los parámetros del comando create-stack, consulte la guía de referencia de comandos de AWS CLI y la Guía del usuario de AWS CloudFormation.

  4. A continuación, complete la tabla siguiendo el procedimiento Rellenar la tabla.

Rellenar la tabla

Para rellenar la tabla, primero cree un directorio con el nombre libs y, dentro de él, cree un archivo con el nombre dynamoClient.js y pegue en él el contenido que aparece a continuación.

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 };

Este código está disponible aquí en GitHub.

A continuación, cree un archivo con el nombre populate-table.js en el directorio raíz de la carpeta de su proyecto y copie en él este contenido de GitHub. Para uno de los elementos, sustituya el valor de la propiedad phone por un número de teléfono móvil válido con el formato E.164, y el valor de startDate por la fecha de hoy.

Desde la línea de comandos, ejecute el comando siguiente:

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();

Este código está disponible aquí en GitHub.

Creación de la función de Lambda

Configuración del SDK

En el directorio libs, cree archivos con los nombres snsClient.js y lambdaClient.js, y pegue el contenido que aparece a continuación en estos archivos, respectivamente.

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 };

Sustituya REGION por la región de AWS. Este código está disponible aquí en 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 };

Sustituya REGION por la región de AWS. Este código está disponible aquí en GitHub.

En primer lugar, importe los módulos y comandos necesarios de AWS SDK for JavaScript (v3). A continuación, calcule la fecha de hoy y asígnela a un parámetro. En tercer lugar, cree los parámetros para ScanCommand. Sustituya TABLE_NAME por el nombre de la tabla que creó en la sección Crear los recursos de AWS de este ejemplo.

El siguiente fragmento de código muestra este paso. (Consulte Agrupación de la función de Lambda para ver el ejemplo completo).

"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", };

Escaneo de una tabla de DynamoDB

En primer lugar, cree una función async/await llamada sendText para publicar un mensaje de texto usando PublishCommand de Amazon SNS. A continuación, añada un patrón de bloques try que escanee la tabla de DynamoDB en busca de empleados cuyo aniversario laboral sea hoy y, a continuación, llame a la función sendText para enviar un mensaje de texto a estos empleados. Si se produce un error, se llama al bloque catch.

El siguiente fragmento de código muestra este paso. (Consulte Agrupación de la función de Lambda para ver el ejemplo completo).

// 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); } };

Agrupación de la función de Lambda

En este tema se describe cómo agrupar mylambdafunction.ts y los módulos AWS SDK for JavaScript necesarios para este ejemplo en un archivo de agrupación llamado index.js.

  1. Si aún no lo ha hecho, siga el Tareas previas necesarias para este ejemplo para instalar el paquete web.

    nota

    Para obtener información sobre el paquete web, consulte Combine aplicaciones con webpack.

  2. Ejecute lo siguiente en la línea de comandos para agrupar el JavaScript de este ejemplo en un archivo llamado <index.js>:

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

    Observe que la salida tiene el nombre index.js. Esto se debe a que las funciones de Lambda tienen que tener un controlador index.js para funcionar.

  3. Comprima el archivo de salida empaquetado, index.js, en un archivo ZIP denominado mylambdafunction.zip.

  4. Suba mylambdafunction.zip al bucket de Amazon S3 que creó en el tema de Crear los recursos de AWS de este tutorial.

Implemente la función de Lambda

En la raíz del proyecto, cree un archivo lambda-function-setup.ts y pegue en él el contenido siguiente.

Sustituya BUCKET_NAME por el nombre del bucket de Amazon S3 en el que cargó la versión ZIP de la función de Lambda. Sustituya ZIP_FILE_NAME por el nombre de la versión ZIP de la función de Lambda. Sustituya ROLE por el número de recurso de Amazon (ARN) del rol de IAM que ha creado en el tema Crear los recursos de AWS de este tutorial. Sustituya LAMBDA_FUNCTION_NAME por un nombre para la función de 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();

Introduzca lo siguiente en la línea de comandos para implementar la función de Lambda.

node lambda-function-setup.ts

Este ejemplo de código está disponible aquí en GitHub.

Configuración de API Gateway para invocar la función de Lambda

Cree el resto de la API

Puede utilizar la consola de API Gateway para crear un punto de conexión para la función de Lambda. Una vez hecho esto, podrá invocar la función de Lambda mediante una llamada restful.

  1. Inicie sesión en la consola de Amazon API Gateway.

  2. En Rest API, seleccione Compilación.

  3. Seleccione Nueva API.

    Tabla de DynamoDB
  4. Especifique Empleado como nombre de la API y proporcione una descripción.

    Tabla de DynamoDB
  5. Elija Crear API.

  6. Seleccione Recursos en la sección Empleado.

    Tabla de DynamoDB
  7. En el campo de nombre, especifique los empleados.

  8. Elija Create Resources (Crear recursos).

  9. En el menú desplegable Acciones, elija Crear recursos.

    Tabla de DynamoDB
  10. Elija /empleados, seleccione Crear método en las Acciones y, a continuación, seleccione OBTENER en el menú desplegable situado debajo de /empleados. Elija el icono de marca de verificación.

    Tabla de DynamoDB
  11. Elija la función de Lambda e introduzca mylambdafunction como nombre de la función de Lambda. Seleccione Guardar.

Probar el método de API Gateway

En este punto del tutorial, puede probar el método de API Gateway que invoca la función de Lambda mylambdafunction. Para probar el método, elija Probar, como se muestra en la siguiente ilustración.

Tabla de DynamoDB

Una vez que se invoca la función de Lambda, puede ver el archivo de registro para ver un mensaje correcto.

Implementar el método de API Gateway

Una vez que la prueba se haya realizado correctamente, podrá implementar el método desde la consola de Amazon API Gateway.

  1. Elija Obtener.

    Tabla de DynamoDB
  2. En el menú desplegable Acciones, elija Implementar API.

    Tabla de DynamoDB
  3. Rellene el formulario de Implementar API y seleccione Implementar.

    Tabla de DynamoDB
  4. Elija Guardar cambios.

  5. Seleccione Obtener de nuevo y observe que la URL cambia. Esta es la URL de invocación que puede utilizar para invocar la función de Lambda.

    Tabla de DynamoDB

Elimine los recursos

¡Enhorabuena! Ha invocado una función de Lambda a través de Amazon API Gateway usando AWS SDK for JavaScript. Como se indicó al principio de este tutorial, asegúrese de cancelar todos los recursos que cree mientras realiza este tutorial para asegurarse de que no se le cobre nada. Para ello, puede eliminar la pila de AWS CloudFormation que creó en el tema Crear los recursos de AWS de este tutorial, de la siguiente manera:

  1. Abra AWS CloudFormation en la consola de administración de AWS.

  2. Abra la página Pilas y seleccione la pila.

  3. Elija Eliminar.