

 La [Guía de referencia de la API de AWS SDK for JavaScript V3](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/) 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
<a name="api-gateway-invoking-lambda-example"></a>

Puede invocar una función Lambda mediante Amazon API Gateway, que es AWS un servicio para crear, publicar, mantener, supervisar y proteger REST, WebSocket APIs HTTP y a escala. Los desarrolladores de API pueden crear APIs ese acceso AWS u otros servicios web, así como los datos almacenados en la AWS nube. Como desarrollador de API Gateway, puede crear APIs para usarlas en sus propias aplicaciones cliente. Para obtener más información, consulte [Qué es Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 

AWS Lambda es un servicio informático que le 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 al respecto AWS Lambda, consulte [Qué es AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html).

En este ejemplo, se crea una función de Lambda mediante la API de tiempo de ejecución de JavaScript Lambda. En este ejemplo, se invocan diferentes AWS servicios 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\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picPhone.png)


Completar el ejemplo debería tomarle aproximadamente 20 minutos.

En este ejemplo, se muestra cómo utilizar JavaScript la lógica 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 mediante una función de Lambda. A continuación, aprenderá a usar API Gateway para invocar esta AWS Lambda función mediante un punto final 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 AWS tutorial se utiliza una tabla de Amazon DynamoDB denominada Employee que contiene estos campos.
+ **id**: la clave principal de la tabla.
+ **firstName**: nombre del empleado.
+ **phone**: número de teléfono del empleado.
+ **startDate**: fecha de inicio del empleado.

![\[Tabla de DynamoDB\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/pic00.png)


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

**Para crear la aplicación:**

1. [Completar los requisitos previos ](#api-gateway-invoking-lambda-provision-resources)

1. [Cree los AWS recursos](#api-gateway-invoking-lambda-provision-resources)

1. [Preparar el script del navegador ](#api-gateway-invoking-lambda-browser-script)

1. [Crear y cargar una función de Lambda](#api-gateway-invoking-lambda-browser-script)

1. [Implemente la función de Lambda ](#api-gateway-invoking-lambda-deploy-function)

1. [Ejecutar la aplicación](#api-gateway-invoking-lambda-run)

1. [Eliminar los recursos](#api-gateway-invoking-lambda-destroy) 

## Tareas previas necesarias
<a name="api-gateway-invoking-lambda-prerequisites"></a>

Para configurar y ejecutar este ejemplo, primero debe completar estas tareas:
+ Configure el entorno del proyecto para ejecutar estos TypeScript ejemplos de Node e instale los módulos necesarios AWS SDK para JavaScript y de terceros. Siga las instrucciones que figuran en [ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cross-services/lambda-api-gateway/README.md).
+ Cree un archivo de configuraciones compartidas con sus credenciales de usuario. Para obtener más información sobre cómo proporcionar un archivo de credenciales compartido, consulte [Archivos de configuración y credenciales compartidos](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html) en la *Guía de referencia de herramientas AWS SDKs y herramientas*.

## Cree los AWS recursos
<a name="api-gateway-invoking-lambda-provision-resources"></a>

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](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html).
+ 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 los métodos CloudFormation descritos en este tutorial.

### Cree los AWS recursos mediante CloudFormation
<a name="api-gateway-invoking-lambda-resources-cli"></a>

CloudFormation le permite crear y aprovisionar despliegues de AWS infraestructura de forma predecible y repetitiva. Para obtener más información al respecto CloudFormation, consulte la Guía del [AWS CloudFormation usuario](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/).

Para crear la CloudFormation pila con AWS CLI:

1. Instale y configure las AWS CLI siguientes instrucciones de la [Guía del AWS CLI usuario](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html).

1. Cree un archivo con un nombre `setup.yaml` en el directorio raíz de la carpeta de su proyecto y copie [el contenido GitHub en](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/setup.yaml) él.
**nota**  
La CloudFormation plantilla se generó utilizando lo que AWS CDK está [disponible aquí GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/resources/cdk/lambda_using_api_gateway). Para obtener más información sobre el AWS CDK, consulte la [Guía para AWS Cloud Development Kit (AWS CDK) desarrolladores](https://docs.aws.amazon.com/cdk/latest/guide/).

1. Ejecute el siguiente comando desde la línea de comandos y *STACK\$1NAME* sustitúyalo por un nombre único para la pila.
**importante**  
El nombre de la pila debe ser único en una AWS región y una AWS cuenta. 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](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) y la [Guía del usuario de AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html).

1. A continuación, complete la tabla siguiendo el procedimiento [Rellenar la tabla](#api-gateway-invoking-lambda-resources-create-table).

### Rellenar la tabla
<a name="api-gateway-invoking-lambda-resources-create-table"></a>

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](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/libs/dynamoClient.js).

A continuación, cree un archivo con un nombre `populate-table.js` en el directorio raíz de la carpeta de su proyecto y copie el contenido [aquí GitHub en](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/populate-table.js) él. 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](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/populate-table.js).

## Creando la AWS Lambda función
<a name="api-gateway-invoking-lambda-browser-script"></a>

### Configuración del SDK
<a name="api-gateway-invoking-lambda-configure-sdk"></a>

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

 *REGION*Sustitúyala por la AWS región. Este código está disponible [aquí en GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/libs/snsClient.js).

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

*REGION*Sustitúyalo por la AWS región. Este código está disponible [aquí en GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/libs/lambdaClient.js).

En primer lugar, importe los módulos y comandos necesarios AWS SDK para 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`. *TABLE\$1NAME*Sustitúyala por el nombre de la tabla que creaste en la [Cree los AWS recursos](#api-gateway-invoking-lambda-provision-resources) sección de este ejemplo.

El siguiente fragmento de código muestra este paso. (Consulte [Agrupación de la función de Lambda](#api-gateway-invoking-lambda-full) para ver el ejemplo completo).

```
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 la tabla de DynamoDB
<a name="api-gateway-invoking-lambda-scan-table"></a>

En primer lugar, cree una async/await función llamada `sendText` para publicar un mensaje de texto mediante Amazon SNS`PublishCommand`. 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 que envíe 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](#api-gateway-invoking-lambda-full) 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));
    for (const element of data.Items) {
      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
<a name="api-gateway-invoking-lambda-full"></a>

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

1. Si aún no lo ha hecho, siga el [Tareas previas necesarias](#api-gateway-invoking-lambda-prerequisites) para este ejemplo para instalar el paquete web. 
**nota**  
Para obtener información sobre el *paquete web*, consulte [Agrupación de aplicaciones con Webpack](webpack.md).

1. Ejecute lo siguiente en la línea de comandos para agrupar los 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.

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

1. Suba `mylambdafunction.zip` al bucket de Amazon S3 que creó en el tema de [Cree los AWS recursos](#api-gateway-invoking-lambda-provision-resources) de este tutorial. 

## Implemente la función de Lambda
<a name="api-gateway-invoking-lambda-deploy-function"></a>

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

*BUCKET\$1NAME*Sustitúyalo por el nombre del bucket de Amazon S3 en el que cargó la versión ZIP de la función Lambda. *ZIP\$1FILE\$1NAME*Sustituya la versión ZIP de la función Lambda por el nombre del nombre. *ROLE*Sustitúyalo por el número de recurso de Amazon (ARN) del rol de IAM que creaste en el [Cree los AWS recursos](#api-gateway-invoking-lambda-provision-resources) tema de este tutorial. *LAMBDA\$1FUNCTION\$1NAME*Sustitúyala por un nombre para la función 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](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/lambda-function-setup.js).

## Configuración de API Gateway para invocar la función de Lambda
<a name="api-gateway-invoking-lambda-run"></a>

**Para crear la aplicación:**

1. [Cree la API de REST](#api-gateway-invoking-lambda-run-create)

1. [Probar el método de API Gateway](#api-gateway-invoking-lambda-run-test)

1. [Implementar el método de API Gateway](#api-gateway-invoking-lambda-run-deploy)

### Cree la API de REST
<a name="api-gateway-invoking-lambda-run-create"></a>

Puede utilizar la consola 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 Amazon API Gateway](https://console.aws.amazon.com/apigateway).

1. En la API de REST, seleccione **Compilación**.

1. Seleccione **Nueva API**.  
![\[Tabla de DynamoDB\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/PicNewAPI.png)

1. Especifique **Empleado** como nombre de la API y proporcione una descripción.  
![\[Tabla de DynamoDB\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picEmployeeAPI.png)

1. Seleccione **Crear API**.

1. Seleccione **Recursos** en la sección **Empleado**.  
![\[Tabla de DynamoDB\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picResources.png)

1. En el campo de nombre, especifique los **empleados**.

1. Elija **Create Resources (Crear recursos)**.

1. En el menú desplegable **Acciones**, elija **Crear recursos**.  
![\[Tabla de DynamoDB\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picCreateResources.png)

1. 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\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picGet.png)

1. 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
<a name="api-gateway-invoking-lambda-run-test"></a>

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\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picTest.png)


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
<a name="api-gateway-invoking-lambda-run-deploy"></a>

Una vez que la prueba se haya realizado correctamente, podrá implementar el método desde la [consola Amazon API Gateway](https://console.aws.amazon.com/apigateway).

1. Elija **Obtener**.  
![\[Tabla de DynamoDB\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picGetDeploy.png)

1. En el menú desplegable **Acciones**, elija **Implementar API**.  
![\[Tabla de DynamoDB\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picDeployMethod.png)

1. Rellene el formulario de **Implementar API** y seleccione **Implementar**.  
![\[Tabla de DynamoDB\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picDeployMethod.png)

1.  Elija **Save changes (Guardar cambios)**.

1.  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\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picURL2.png)

## Elimine los recursos
<a name="api-gateway-invoking-lambda-destroy"></a>

¡Enhorabuena\$1 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, puedes eliminar la CloudFormation pila que creaste en el [Cree los AWS recursos](#api-gateway-invoking-lambda-provision-resources) tema de este tutorial, de la siguiente manera:

1. Abra la [CloudFormation en la consola AWS de administración]( https://console.aws.amazon.com/cloudformation/home).

1. Abra la página **Pilas** y seleccione la pila.

1. Elija **Eliminar**.