

# Creación de funciones de Lambda con Node.js
<a name="lambda-nodejs"></a>

Puede ejecutar código JavaScript con Node.js en AWS Lambda. Lambda proporciona [tiempos de ejecución](lambda-runtimes.md) para Node.js que ejecutan su código para procesar eventos. El código se ejecuta en un entorno que incluye AWS SDK para JavaScript, con credenciales de un rol de AWS Identity and Access Management (IAM) que usted administre. Para obtener más información sobre las versiones del SDK incluidas en los tiempos de ejecución de Node.js, consulte [Versiones del SDK incluidas en el tiempo de ejecución](#nodejs-sdk-included).

Lambda admite los siguientes tiempos de ejecución de Node.js.<a name="nodejs-supported-runtimes"></a>


| Nombre | Identificador | Sistema operativo | Fecha de baja | Bloqueo de la función Crear | Bloqueo de la función Actualizar | 
| --- | --- | --- | --- | --- | --- | 
|  Node.js 24  |  `nodejs24.x`  |  Amazon Linux 2023  |   30 de abril de 2028   |   1 de junio de 2028   |   1 de julio de 2028   | 
|  Node.js 22  |  `nodejs22.x`  |  Amazon Linux 2023  |   30 de abril de 2027   |   1 de junio de 2027   |   1 de julio de 2027   | 
|  Node.js 20  |  `nodejs20.x`  |  Amazon Linux 2023  |   30 de abril de 2026   |   31 de agosto de 2026   |   30 de septiembre de 2026   | 

**Para crear una función de Node.js.**

1. Abra la [consola de Lambda](https://console.aws.amazon.com/lambda).

1. Seleccione **Creación de función**.

1. Configure los siguientes ajustes:
   + En **Nombre de la función**: ingrese el nombre de la función.
   + **Tiempo de ejecución**: elija **Node.js 24.x**.

1. Elija **Crear función**.

La consola crea una función de Lambda con un único archivo de origen llamado `index.mjs`. Puede editar este archivo y agregar más archivos en el editor de código integrado. En la sección **IMPLEMENTAR**, elija **Implementar** para actualizar el código de la función. A continuación, para ejecutar el código, seleccione **Crear evento de prueba** en la sección **EVENTOS DE PRUEBA**.

El archivo `index.mjs` exporta una función denominada `handler` que toma un objeto de evento y un objeto context. Esta es la [función de controlador](nodejs-handler.md) a la que llama Lambda cuando se invoca la función. El tiempo de ejecución de la función de Node.js obtiene los eventos de invocación de Lambda y se los pasa al controlador. En la configuración de función, el valor de controlador es `index.handler`.

Al guardar el código de función, la consola de Lambda crea un paquete de implementación de archivo .zip. Cuando desarrolle el código de función fuera de la consola (mediante un IDE), debe [crear un paquete de implementación](nodejs-package.md) para cargar el código a la función de Lambda.

El tiempo de ejecución de la función pasa un objeto context al controlador, además del evento de invocación. El [objeto context](nodejs-context.md) contiene información adicional acerca de la invocación, la función y el entorno de ejecución. Hay más información disponible en las variables de entorno.

Su función de Lambda tiene un grupo de registros de Registros de CloudWatch. El tiempo de ejecución de la función envía detalles de cada invocación a Registros de CloudWatch. Se transmite cualquier [registro que su función genere](nodejs-logging.md) durante la invocación. Si su función devuelve un error, Lambda formatea el error y lo devuelve al invocador.

**Topics**
+ [

## Versiones del SDK incluidas en el tiempo de ejecución
](#nodejs-sdk-included)
+ [

## Uso de keep-alive para conexiones TCP
](#nodejs-keep-alive)
+ [

## Carga del certificado de la CA
](#nodejs-certificate-loading)
+ [

## Características experimentales de Node.js
](#nodejs-experimental-features)
+ [

# Definir el controlador de las funciones de Lambda en Node.js
](nodejs-handler.md)
+ [

# Implementar funciones Node.js de Lambda con archivos de archivo.zip
](nodejs-package.md)
+ [

# Implementar funciones Node.js Lambda con imágenes de contenedor
](nodejs-image.md)
+ [

# Uso de capas para funciones de Lambda en Node.js
](nodejs-layers.md)
+ [

# Uso del objeto de contexto Lambda para recuperar la información de la función Node.js
](nodejs-context.md)
+ [

# Registro y supervisión de las funciones de Lambda de Node.js
](nodejs-logging.md)
+ [

# Instrumentación del código Node.js en AWS Lambda
](nodejs-tracing.md)

## Versiones del SDK incluidas en el tiempo de ejecución
<a name="nodejs-sdk-included"></a>

Todos los [tiempos de ejecución de Node.js para Lambda admitidos](#nodejs-supported-runtimes) incluyen una versión secundaria específica de la versión 3 de AWS SDK para JavaScript, no la [versión más reciente](https://github.com/aws/aws-sdk-js-v3/releases). La versión secundaria específica incluida en el tiempo de ejecución depende de la versión del tiempo de ejecución y de su Región de AWS. Para encontrar la versión específica del SDK incluida en el tiempo de ejecución que está utilizando, cree una función de Lambda con el código siguiente.

**Example index.mjs**  

```
import packageJson from '@aws-sdk/client-s3/package.json' with { type: 'json' };

export const handler = async () => ({ version: packageJson.version });
```
Esta acción devuelve una respuesta con el siguiente formato:  

```
{
  "version": "3.632.0"
}
```

Para obtener más información, consulte [Uso de la versión 3 del SDK para JavaScript en el controlador](nodejs-handler.md#nodejs-example-sdk-usage).

## Uso de keep-alive para conexiones TCP
<a name="nodejs-keep-alive"></a>

El agente HTTP o HTTPS predeterminado de Node.js crea una nueva conexión TCP para cada nueva solicitud. Para evitar el costo de establecer nuevas conexiones, la opción keep-alive está habilitada por defecto en todos los [tiempos de ejecución de Node.js compatibles](#nodejs-supported-runtimes). Keep-alive puede reducir los tiempos de solicitud de las funciones de Lambda que realizan varias llamadas a la API mediante el SDK.

Para deshabilitar keep-alive, consulte [Reusing connections with keep-alive in Node.js](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html) en la *Guía para desarrolladores de AWS SDK para JavaScript 3.x*. Para obtener más información sobre el uso de keep-alive, consulte [HTTP keep-alive is on by default in modular AWS SDK for JavaScript](https://aws.amazon.com/blogs/developer/http-keep-alive-is-on-by-default-in-modular-aws-sdk-for-javascript/) en AWS Developer Tools Blog.

## Carga del certificado de la CA
<a name="nodejs-certificate-loading"></a>

Para las versiones de tiempo de ejecución hasta Node.js 18, Lambda carga automáticamente los certificados de la CA (autoridad de certificación) específicos de Amazon para facilitar la creación de funciones que interactúen con otros Servicios de AWS. Por ejemplo, Lambda incluye los certificados de Amazon RDS necesarios para validar el [certificado de identidad del servidor](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html) instalado en la base de datos de Amazon RDS. Este comportamiento puede afectar el rendimiento durante los arranques en frío.

A partir de Node.js 20, Lambda ya no carga certificados de la CA adicionales de forma predeterminada. El tiempo de ejecución Node.js 20 contiene un archivo de certificado con todos los certificados de la CA de Amazon ubicados en `/var/runtime/ca-cert.pem`. Para restaurar el mismo comportamiento de los tiempos de ejecución de Node.js 18 y anteriores, establezca la [variable `NODE_EXTRA_CA_CERTS` del entorno](configuration-envvars.md) en `/var/runtime/ca-cert.pem`.

Para obtener un rendimiento óptimo, recomendamos que agrupe solo los certificados que necesite con su paquete de implementación y que los cargue mediante la variable de entorno `NODE_EXTRA_CA_CERTS`. El archivo de certificados debe constar de uno o más certificados de CA raíz o intermedios de confianza en formato PEM. Por ejemplo, en el caso de RDS, incluya los certificados necesarios junto con el código como `certificates/rds.pem`. A continuación, cargue los certificados configurando `NODE_EXTRA_CA_CERTS` como `/var/task/certificates/rds.pem`.

## Características experimentales de Node.js
<a name="nodejs-experimental-features"></a>

Las versiones anteriores del lenguaje Node.js habilitan algunas características experimentales de forma predeterminada. Lambda deshabilitan estas características para garantizar la estabilidad del tiempo de ejecución y un rendimiento uniforme. En la siguiente tabla se enumeran las características experimentales que Lambda deshabilita.


| Característica experimental | Versiones de Node.js compatibles | Indicador de Node.js aplicado por Lambda | Indicador de Lambda para volver a habilitar | 
| --- | --- | --- | --- | 
|  Soporte para importar módulos mediante require en módulos ES  |  Node.js 20, Node.js 22  |  `--no-experimental-require-module`  |  `--experimental-require-module`  | 
|  Soporte para detectar automáticamente los módulos ES frente a CommonJS  |  Node.js 22  |  `--no-experimental-detect-module`  |  `--experimental-detect-module`  | 

Para habilitar una característica experimental deshabilitada, establezca el indicador de reactivación en la variable de entorno `NODE_OPTIONS`. Por ejemplo, para habilitar el soporte require de módulos ES, establezca `NODE_OPTIONS` en `--experimental-require-module`. Lambda detecta esta anulación y elimina el indicador de desactivación correspondiente.

**importante**  
 El uso de características experimentales puede provocar problemas de inestabilidad y rendimiento. Es posible que estas características se modifiquen o eliminen en futuras versiones de Node.js. Las funciones que utilizan características experimentales no son aptas para el Acuerdo de Nivel de Servicio (SLA) de Lambda o AWS Support.

# Definir el controlador de las funciones de Lambda en Node.js
<a name="nodejs-handler"></a>

El *controlador* de la función de Lambda es el método del código de la función que procesa eventos. Cuando se invoca una función, Lambda ejecuta el método del controlador. La función se ejecuta hasta que el controlador devuelve una respuesta, se cierra o se agota el tiempo de espera.

En esta página se describe cómo se trabaja con los controladores de funciones de Lambda en Node.js, incluidas las opciones para la configuración del proyecto, las convenciones de nomenclatura y las prácticas recomendadas. En esta página también se muestra un ejemplo de una función de Lambda de Node.js que recibe información sobre un pedido, genera un recibo en un archivo de texto y coloca este archivo en un bucket de Amazon Simple Storage Service (Amazon S3). Para obtener información sobre cómo implementar la función después de escribirla, consulte [Implementar funciones Node.js de Lambda con archivos de archivo.zip](nodejs-package.md) o [Implementar funciones Node.js Lambda con imágenes de contenedor](nodejs-image.md).

**Topics**
+ [

## Configuración del proyecto del controlador de Node.js
](#nodejs-handler-setup)
+ [

## Ejemplo de código de una función de Lambda en Node.js
](#nodejs-example-code)
+ [

## Módulos de CommonJS y ES
](#nodejs-commonjs-es-modules)
+ [

## Inicialización de Node.js
](#nodejs-initialization)
+ [

## Convenciones de nomenclatura de controladores
](#nodejs-handler-naming)
+ [

## Definición del objeto de evento de entrada y acceso a él
](#nodejs-example-input)
+ [

## Patrones de controlador válidos para funciones de Node.js
](#nodejs-handler-signatures)
+ [

## Uso de la versión 3 del SDK para JavaScript en el controlador
](#nodejs-example-sdk-usage)
+ [

## Acceso a las variables de entorno
](#nodejs-example-envvars)
+ [

## Uso del estado global
](#nodejs-handler-state)
+ [

## Prácticas recomendadas de codificación para las funciones de Lambda en Node.js
](#nodejs-best-practices)

## Configuración del proyecto del controlador de Node.js
<a name="nodejs-handler-setup"></a>

Existen varias formas de inicializar un proyecto de Lambda de Node.js. Por ejemplo, puede crear un proyecto de Node.js estándar mediante `npm`, crear una [aplicación de AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/using-sam-cli-init.html#using-sam-cli-init-new) o crear una [aplicación de AWS CDK](lambda-cdk-tutorial.md#lambda-cdk-step-1).

Para crear un proyecto mediante `npm`:

```
npm init
```

Este comando inicializa el proyecto y genera un archivo `package.json` que gestiona los metadatos y las dependencias del proyecto.

El código de su función reside en un archivo de JavaScript `.js` o `.mjs`. En el siguiente ejemplo, nombramos este archivo `index.mjs` porque utiliza un controlador de módulos de ES. Lambda admite tanto controladores de módulos de ES como de CommonJS. Para obtener más información, consulte [Módulos de CommonJS y ES](#nodejs-commonjs-es-modules).

Un proyecto habitual de la función de Lambda en Node.js sigue esta estructura general:

```
/project-root
  ├── index.mjs — Contains main handler
  ├── package.json — Project metadata and dependencies
  ├── package-lock.json — Dependency lock file
  └── node_modules/ — Installed dependencies
```

## Ejemplo de código de una función de Lambda en Node.js
<a name="nodejs-example-code"></a>

El siguiente ejemplo de código de función de Lambda recibe información sobre un pedido, genera un recibo en un archivo de texto y coloca este archivo en un bucket de Amazon S3.

**Example Función de Lambda en index.mjs**  

```
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';

// Initialize the S3 client outside the handler for reuse
const s3Client = new S3Client();

/**
 * Lambda handler for processing orders and storing receipts in S3.
 * @param {Object} event - Input event containing order details
 * @param {string} event.order_id - The unique identifier for the order
 * @param {number} event.amount - The order amount
 * @param {string} event.item - The item purchased
 * @returns {Promise<string>} Success message
 */
export const handler = async(event) => {
    try {
        // Access environment variables
        const bucketName = process.env.RECEIPT_BUCKET;
        if (!bucketName) {
            throw new Error('RECEIPT_BUCKET environment variable is not set');
        }

        // Create the receipt content and key destination
        const receiptContent = `OrderID: ${event.order_id}\nAmount: $${event.amount.toFixed(2)}\nItem: ${event.item}`;
        const key = `receipts/${event.order_id}.txt`;

        // Upload the receipt to S3
        await uploadReceiptToS3(bucketName, key, receiptContent);

        console.log(`Successfully processed order ${event.order_id} and stored receipt in S3 bucket ${bucketName}`);
        return 'Success';
    } catch (error) {
        console.error(`Failed to process order: ${error.message}`);
        throw error;
    }
};

/**
 * Helper function to upload receipt to S3
 * @param {string} bucketName - The S3 bucket name
 * @param {string} key - The S3 object key
 * @param {string} receiptContent - The content to upload
 * @returns {Promise<void>}
 */
async function uploadReceiptToS3(bucketName, key, receiptContent) {
    try {
        const command = new PutObjectCommand({
            Bucket: bucketName,
            Key: key,
            Body: receiptContent
        });

        await s3Client.send(command);
    } catch (error) {
        throw new Error(`Failed to upload receipt to S3: ${error.message}`);
    }
}
```

Este archivo `index.mjs` contiene las siguientes secciones de código:
+ Bloque `import`: use este bloque para incluir las bibliotecas que requiere la función de Lambda, como [clientes de AWS SDK](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/the-request-object.html).
+ Declaración `const s3Client`: esto inicializa un [cliente de Amazon S3](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/) fuera de la función del controlador. Esto hace que Lambda ejecute este código durante la [fase de inicialización](lambda-runtime-environment.md#runtimes-lifecycle-ib) y el cliente se conserva para su [reutilización en múltiples invocaciones](lambda-runtime-environment.md#execution-environment-reuse).
+ Bloque de comentarios de JSDoc: defina los tipos de entrada y salida de su controlador mediante [anotaciones de JSDoc](https://jsdoc.app/about-getting-started).
+ `export const handler`: esta es la función principal del controlador que invoca Lambda. Al implementar su función, especifique `index.handler` para la propiedad [Handler](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-Handler). El valor de la propiedad `Handler` es el nombre del archivo y el nombre del método del controlador exportado, separados por un punto.
+ Función `uploadReceiptToS3`: se trata de una función auxiliar a la que hace referencia la función del controlador principal.

Para que esta función se ejecute correctamente, su [rol de ejecución](lambda-intro-execution-role.md) debe permitir la acción `s3:PutObject`. Además, asegúrese de definir la variable de entorno `RECEIPT_BUCKET`. Tras una invocación correcta, el bucket de Amazon S3 debe contener un archivo de recibo.

## Módulos de CommonJS y ES
<a name="nodejs-commonjs-es-modules"></a>

Node.js admite dos sistemas de módulos: módulos de CommonJS y ECMAScript (módulos de ES). Lambda recomienda usar módulos de ES, ya que admiten la espera de nivel superior, lo que permite completar tareas asíncronas durante la [inicialización del entorno de ejecución](#nodejs-initialization).

Node.js trata los archivos con una extensión de nombre de archivo `.cjs` como módulos de CommonJS, mientras que una extensión `.mjs` denota módulos de ES. De forma predeterminada, Node.js trata los archivos con la extensión de nombre de archivo `.js` como módulos de CommonJS. Puede configurar Node.js para tratar los archivos `.js` como módulos de ES; para ello, especifique el `type` como `module` en el archivo `package.json` de la función. Puede configurar Node.js en Lambda para que detecte automáticamente si un archivo `.js` debe tratarse como un módulo de CommonJS o de ES; para ello, añada la marca `—experimental-detect-module` a la variable de entorno `NODE_OPTIONS`. Para obtener más información, consulte [Características experimentales de Node.js](lambda-nodejs.md#nodejs-experimental-features).

Los siguientes ejemplos muestran los controladores de funciones escritos con los módulos de ES y CommonJS. Todos los ejemplos restantes de esta página utilizan módulos de ES.

------
#### [ ES module example ]

**Example – Controlador de módulos de ES**  

```
const url = "https://aws.amazon.com/";

export const handler = async(event) => {
    try {
        const res = await fetch(url);
        console.info("status", res.status);
        return res.status;
    }
    catch (e) {
        console.error(e);
        return 500;
    }
};
```

------
#### [ CommonJS module example ]

**Example – Controlador de módulos de CommonJS**  

```
const https = require("https");
let url = "https://aws.amazon.com/";

exports.handler = async function (event) {
  let statusCode;
  await new Promise(function (resolve, reject) {
    https.get(url, (res) => {
        statusCode = res.statusCode;
        resolve(statusCode);
      }).on("error", (e) => {
        reject(Error(e));
      });
  });
  console.log(statusCode);
  return statusCode;
};
```

------

## Inicialización de Node.js
<a name="nodejs-initialization"></a>

Node.js utiliza un modelo de E/S sin bloqueo que admite operaciones asíncronas eficientes mediante un bucle de eventos. Por ejemplo, si Node.js realiza una llamada de red, la función continúa procesando otras operaciones sin bloquear la respuesta de la red. Cuando se recibe la respuesta de la red, se coloca en la cola de devolución de llamada. Las tareas de la cola se procesan cuando se completa la tarea actual.

Lambda recomienda usar una espera de nivel superior para que las tareas asíncronas iniciadas durante la inicialización del entorno de ejecución se completen durante la inicialización. Las tareas asíncronas que no se completan durante la inicialización normalmente se ejecutan durante la primera invocación de la función. Esto puede provocar un comportamiento inesperado o errores. Por ejemplo, la inicialización de la función puede realizar una llamada de red para recuperar un parámetro del almacén de parámetros de AWS. Si esta tarea no se completa durante la inicialización, el valor puede ser nulo durante una invocación. También puede haber un retraso entre la inicialización y la invocación, que puede desencadenar errores en operaciones urgentes. En concreto, las llamadas de servicio de AWS pueden depender de firmas de solicitud urgentes, lo que provoca errores en las llamadas de servicio si la llamada no se completa durante la fase de inicialización. Completar las tareas durante la inicialización normalmente mejora el rendimiento del arranque en frío, y se invoca primero el rendimiento cuando se utiliza la concurrencia aprovisionada. Para obtener más información, consulte la publicación del blog [Using Node.js ES modules and top-level await in AWS Lambda](https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda).

## Convenciones de nomenclatura de controladores
<a name="nodejs-handler-naming"></a>

Al configurar una función, el valor de la configuración [Handler](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-Handler) es el nombre del archivo y el nombre del método del controlador exportado, separados por un punto. El valor predeterminado de las funciones creadas en la consola y de los ejemplos de esta guía es `index.handler`. Esto indica el método `handler` que se exporta desde el archivo `index.js` o `index.mjs`.

Si crea una función en la consola con un nombre de archivo o un nombre de controlador de funciones diferente, debe editar el nombre del controlador predeterminado.

**Para cambiar el nombre de controlador de la función (consola)**

1. Abra la página [Funciones](https://console.aws.amazon.com/lambda/home#/functions) de la consola de Lambda y elija su función.

1. Elija la pestaña **Código**.

1. Desplácese hacia abajo hasta el panel **Configuración del tiempo de ejecución** y elija **Editar**.

1. En **Controlador**, ingrese el nuevo nombre del controlador de funciones.

1. Seleccione **Save**.

## Definición del objeto de evento de entrada y acceso a él
<a name="nodejs-example-input"></a>

El formato de entrada más común y estándar de las funciones de Lambda es JSON. En este ejemplo, la función espera una entrada similar a la siguiente:

```
{
    "order_id": "12345",
    "amount": 199.99,
    "item": "Wireless Headphones"
}
```

Al trabajar con funciones de Lambda en Node.js, puede definir la forma del evento de entrada mediante anotaciones de JSDoc. En este ejemplo, se define la estructura de entrada en el comentario de JSDoc del controlador:

```
/**
 * Lambda handler for processing orders and storing receipts in S3.
 * @param {Object} event - Input event containing order details
 * @param {string} event.order_id - The unique identifier for the order
 * @param {number} event.amount - The order amount
 * @param {string} event.item - The item purchased
 * @returns {Promise<string>} Success message
 */
```

Después de definir estos tipos en el comentario de JSDoc, puede acceder a los campos del objeto de evento directamente en el código. Por ejemplo, `event.order_id` recupera el valor de `order_id` de la entrada original.

## Patrones de controlador válidos para funciones de Node.js
<a name="nodejs-handler-signatures"></a>

Le recomendamos que use [async/await](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/using-async-await.html) para declarar el controlador de funciones en lugar de usar [devoluciones de llamadas](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/using-a-callback-function.html). Async/await es una forma concisa y legible de escribir código asíncrono, sin necesidad de devoluciones de llamadas anidadas ni promesas encadenadas. Con async/await, puedes escribir código que se lea como código sincrónico, sin dejar de ser asíncrono y sin bloqueo.

### controladores de funciones asíncronos (recomendados)
<a name="nodejs-handler-async"></a>

La palabra clave `async` marca una función como asíncrona y la palabra clave `await` detiene la ejecución de la función hasta que se resuelva una `Promise`. El controlador acepta los argumentos siguientes:
+ `event`: contiene los datos de entrada que se pasan a la función.
+ `context`: contiene información sobre la función de invocación y el entorno de ejecución. Para obtener más información, consulte [Uso del objeto de contexto Lambda para recuperar la información de la función Node.js](nodejs-context.md).

A continuación se muestran las firmas válidas para el patrón async/await:

```
export const handler = async (event) => { };
```

```
export const handler = async (event, context) => { };
```

### Controladores de funciones sincrónicos
<a name="nodejs-handler-synchronous"></a>

Si su función no realiza ninguna tarea asíncrona, puede usar un controlador de funciones sincrónicas, con una de las siguientes firmas de función:

```
export const handler = (event) => { };
```

```
export const handler = (event, context) => { };
```

### Controladores de funciones del flujo de respuesta
<a name="nodejs-handler-response-streaming"></a>

Lambda admite el flujo de respuesta con Node.js. Los controladores de la función del flujo de respuesta utilizan el decorador `awslambda.streamifyResponse()` y toman 3 parámetros: `event`, `responseStream` y `context`. La siguiente es la firma de la función:

```
export const handler = awslambda.streamifyResponse(async (event, responseStream, context) => { });
```

Para obtener más información, consulte [Transmisión de respuestas para funciones de Lambda](configuration-response-streaming.md).

### Controladores de funciones basados en la devolución de llamada
<a name="nodejs-handler-callback"></a>

**nota**  
Los controladores de funciones basados en la devolución de llamada solo se admiten hasta Node.js 22. A partir de Node.js 24, las tareas asíncronas deben implementarse mediante controladores de funciones asíncronos.

Los controladores de funciones basados en la devolución de llamada deben usar los argumentos de evento, contexto y devolución de llamada. Ejemplo:

```
export const handler = (event, context, callback) => { };
```

La función de devolución de llamada espera un `Error` y una respuesta, que debe poder serializarse en JSON. La función continúa ejecutándose hasta que el [bucle de eventos](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/) se vacía o se agota el tiempo de espera de la función. La respuesta no se envía al invoker hasta que todas las tareas de bucle de eventos hayan terminado. Si el tiempo de espera de la función se agota, se devolverá un error en su lugar. Puede configurar el tiempo de ejecución para enviar la respuesta inmediatamente estableciendo [context.callbackWaitsForEmptyEventLoop](nodejs-context.md) en false.

**Example — solicitud HTTP con callback**  
La siguiente función de ejemplo comprueba una URL y devuelve el código de estado al invocador.  

```
import https from "https";
let url = "https://aws.amazon.com/";

export const handler = (event, context, callback) => {
  https.get(url, (res) => {
    callback(null, res.statusCode);
  }).on("error", (e) => {
    callback(Error(e));
  });
};
```

## Uso de la versión 3 del SDK para JavaScript en el controlador
<a name="nodejs-example-sdk-usage"></a>

A menudo, utilizará las funciones de Lambda para interactuar con otros recursos de AWS o actualizarlos. La forma más sencilla de interactuar con estos recursos es utilizar AWS SDK para JavaScript. Todos los [tiempos de ejecución de Node.js para Lambda admitidos](lambda-nodejs.md#nodejs-supported-runtimes) incluyen la [versión 3 del SDK para JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/introduction/). Sin embargo, se le recomienda firmemente que incluya los clientes de AWS SDK que sean necesarios en el paquete de implementación. Esto maximiza la [compatibilidad con versiones anteriores](runtimes-update.md#runtime-update-compatibility) en cualquiera de las futuras actualizaciones del tiempo de ejecución de Lambda. Solo confíe en el SDK proporcionado por el tiempo de ejecución cuando no pueda incluir paquetes adicionales (por ejemplo, cuando use el editor de código de la consola de Lambda o el código insertado en una plantilla de AWS CloudFormation).

Para agregar dependencias del SDK a la función, utilice el comando `npm install` para los clientes del SDK específicos que necesite. En el código de ejemplo, se usa el [cliente de Amazon S3](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/). Agregue esta dependencia mediante la ejecución del siguiente comando en el directorio que contiene el archivo `package.json`:

```
npm install @aws-sdk/client-s3
```

En el código de la función, importe el cliente y los comandos que sean necesarios, tal y como se demuestra en la función de ejemplo:

```
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
```

A continuación, inicialice un [cliente de Amazon S3](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/):

```
const s3Client = new S3Client();
```

En este ejemplo, inicializamos el cliente de Amazon S3 fuera de la función del controlador principal para evitar tener que inicializarlo cada vez que invocamos nuestra función. Después de inicializar el cliente del SDK, podrá usarlo para hacer llamadas a la API para ese servicio de AWS. El código de ejemplo llama a la API [PutObject](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/command/PutObjectCommand/) de Amazon S3 de la siguiente manera:

```
const command = new PutObjectCommand({
    Bucket: bucketName,
    Key: key,
    Body: receiptContent
});
```

## Acceso a las variables de entorno
<a name="nodejs-example-envvars"></a>

En el código del controlador, puede hacer referencia a cualquier [variable de entorno](configuration-envvars.md) mediante `process.env`. En este ejemplo, se hace referencia a la variable de entorno `RECEIPT_BUCKET` definida mediante las siguientes líneas de código:

```
// Access environment variables
const bucketName = process.env.RECEIPT_BUCKET;
if (!bucketName) {
    throw new Error('RECEIPT_BUCKET environment variable is not set');
}
```

## Uso del estado global
<a name="nodejs-handler-state"></a>

Lambda ejecuta su código estático durante la [fase de inicialización](lambda-runtime-environment.md#runtimes-lifecycle-ib) antes de invocar la función por primera vez. Los recursos que se crean durante la inicialización permanecen en la memoria entre las invocaciones, por lo que evita tener que crearlos cada vez que invoca la función.

En el código de ejemplo, el código de inicialización del cliente de S3 está fuera del controlador. El tiempo de ejecución inicializa el cliente antes de que la función gestione su primer evento; por su parte, el cliente permanece disponible para su reutilización en todas las invocaciones.

## Prácticas recomendadas de codificación para las funciones de Lambda en Node.js
<a name="nodejs-best-practices"></a>

Siga estas directrices para desarrollar funciones de Lambda:
+ **Separe el controlador de Lambda de la lógica del núcleo.** Esto le permite probar las distintas unidades de la función con mayor facilidad.
+ **Controle las dependencias del paquete de implementación de la función. ** El entorno de ejecución AWS Lambda contiene varias bibliotecas. Para los tiempos de ejecución de Node.js y Python, estos incluyen los AWS SDK. Para disponer del conjunto más reciente de características y actualizaciones de seguridad, Lambda actualizará periódicamente estas bibliotecas. Estas actualizaciones pueden introducir cambios sutiles en el comportamiento de la función de Lambda. Para disponer de un control total de las dependencias que utiliza la función, empaquete todas las dependencias con el paquete de implementación. 
+ **Minimice la complejidad de las dependencias.** Son preferibles los marcos de trabajo más sencillos, ya que se cargan rápidamente al arrancar el [entorno de ejecución](lambda-runtime-environment.md).
+ **Minimice el tamaño del paquete de implementación de acuerdo con las necesidades de su tiempo de ejecución. ** Esto reducirá la cantidad de tiempo que tarda el paquete de implementación en descargarse y desempaquetarse antes de la invocación.

**Reutilice el entorno de ejecución para mejorar el rendimiento de la función.** Inicialice los clientes de SDK y las conexiones de base de datos fuera del controlador de funciones y almacene localmente en caché los recursos estáticos en el directorio `/tmp`. Las invocaciones posteriores procesadas por la misma instancia de su función pueden reutilizar estos recursos. Esto ahorra costes al reducir el tiempo de ejecución de la función.

Para evitar posibles filtraciones de datos entre las invocaciones, no utilice el entorno de ejecución para almacenar datos de usuario, eventos u otra información con implicaciones de seguridad. Si su función se basa en un estado mutable que no se puede almacenar en la memoria dentro del controlador, considere crear una función independiente o versiones independientes de una función para cada usuario.

**Utilice una directiva keep-alive para mantener conexiones persistentes.** Lambda purga las conexiones inactivas a lo largo del tiempo. Si intenta reutilizar una conexión inactiva al invocar una función, se producirá un error de conexión. Para mantener la conexión persistente, use la directiva keep-alive asociada al tiempo de ejecución. Para ver un ejemplo, consulte [Reutilización de conexiones con Keep-Alive en Node.js](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html).

**Utilice [variables de entorno](configuration-envvars.md) para pasar parámetros operativos a su función.** Por ejemplo, si está escribiendo en un bucket de Amazon S3, en lugar de codificar de forma rígida el nombre del bucket, configúrelo como una variable de entorno.

**Evite utilizar invocaciones recursivas** en la función de Lambda, en las que la función se invoca a sí misma o inicia un proceso que puede volver a invocarla. Esto podría producir un volumen no intencionado de invocaciones de la función y costos elevados. Si observa un volumen imprevisto de invocaciones, establezca la simultaneidad reservada de funciones en `0` inmediatamente para limitar todas las invocaciones de la función mientras actualiza el código.

**No utilice API no documentadas y no públicas** en el código de la función de Lambda. Para tiempos de ejecución administrados de AWS Lambda, Lambda aplica periódicamente actualizaciones funcionales y de seguridad a las API internas de Lambda. Estas actualizaciones de las API internas pueden ser incompatibles con versiones anteriores, lo que conlleva consecuencias no deseadas, como errores de invocación si su función depende de estas API no públicas. Consulte la [referencia de la API](https://docs.aws.amazon.com/lambda/latest/api/welcome.html) para obtener una lista de las API disponibles públicamente.

**Escriba el código idempotente.** Escribir el código idempotente para las funciones garantiza que los eventos duplicados se gestionen de la misma manera. El código debe validar y gestionar correctamente los eventos duplicados. Para obtener más información, consulte [¿Cómo puedo hacer que mi función de Lambda sea idempotente?](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-idempotent/).

# Implementar funciones Node.js de Lambda con archivos de archivo.zip
<a name="nodejs-package"></a>

 El código de la función de AWS Lambda incluye un archivo .js o .mjs que contiene el código del controlador de la función, junto con los paquetes y módulos adicionales de los que depende el código. Para implementar este código de función en Lambda, se utiliza un *paquete de despliegue*. Este paquete puede ser un archivo de archivos .zip o una imagen de contenedor. Para obtener más información sobre el uso de imágenes de contenedores con Node.js, consulte [Implementar funciones de Lambda Node.js con imágenes de contenedores](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-image.html). 

 Para crear un paquete de despliegue como un archivo de archivos .zip, puede emplear utilidad de archivado de archivos .zip incorporada de la herramienta de línea de comandos, o cualquier otra utilidad de archivos .zip, como [7zip](https://www.7-zip.org/download.html). En los ejemplos que se muestran en las siguientes secciones se supone que está utilizando una herramienta `zip` de línea de comandos en un entorno Linux o macOS. Para utilizar los mismos comandos en Windows, puede [instalar el Subsistema de Windows para Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) a fin de obtener una versión de Ubuntu y Bash integrada con Windows. 

 Tenga en cuenta que Lambda utiliza permisos de archivo de POSIX, por lo que puede necesitar [establecer permisos para la carpeta del paquete de despliegue](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-deployment-package-errors/) antes de crear el archivo de archivos .zip. 

**Topics**
+ [

## Dependencias de tiempo de ejecución en Node.js
](#nodejs-package-dependencies)
+ [

## Creación de un paquete de despliegue .zip sin dependencias
](#nodejs-package-create-no-dependencies)
+ [

## Creación de un paquete de despliegue .zip con dependencias
](#nodejs-package-create-dependencies)
+ [

## Creación de una capa de Node.js para las dependencias
](#nodejs-package-dependencies-layers)
+ [

## Ruta de búsqueda de dependencias y bibliotecas incluidas en tiempo de ejecución
](#nodejs-package-searchpath)
+ [

## Creación y actualización de funciones de Lambda Node.js mediante archivos .zip
](#nodejs-package-create-update)

## Dependencias de tiempo de ejecución en Node.js
<a name="nodejs-package-dependencies"></a>

 Para las funciones de Lambda que utilizan el tiempo de ejecución de Node.js, una dependencia puede ser cualquier módulo Node.js. El tiempo de ejecución de Node.js incluye varias bibliotecas comunes, así como una versión de AWS SDK para JavaScript. Todos los [tiempos de ejecución de Node.js compatibles](lambda-nodejs.md#nodejs-supported-runtimes) incluyen la versión 3 del SDK. Para usar la versión 2 del SDK, agregue el SDK a su paquete de implementación de archivos .zip. Para saber qué versión específica del SDK se incluye en el tiempo de ejecución que está utilizando, consulte [Versiones del SDK incluidas en el tiempo de ejecución](lambda-nodejs.md#nodejs-sdk-included). 

 Lambda actualiza de manera periódica las bibliotecas del SDK en el tiempo de ejecución de Node.js para incluir las características y actualizaciones de seguridad más recientes. Lambda también aplica parches y actualizaciones de seguridad a las demás bibliotecas incluidas en el tiempo de ejecución. Para tener el control total de las dependencias de un paquete, puede agregar la versión preferida de cualquier dependencia con tiempo de ejecución incluido al paquete de despliegue. Por ejemplo, si quiere utilizar una versión concreta del SDK para JavaScript, puede incluirla en el archivo .zip como una dependencia. Para obtener más información sobre cómo agregar dependencias con tiempo de ejecución incluido en el archivo .zip, consulte [Ruta de búsqueda de dependencias y bibliotecas incluidas en tiempo de ejecución](#nodejs-package-searchpath). 

 Según el [modelo de responsabilidad compartida de AWS](lambda-runtimes.md#runtimes-shared-responsibility), usted es responsable de la administración de cualquier dependencia en los paquetes de despliegue de sus funciones. Esto incluye la aplicación de actualizaciones y parches de seguridad. Para actualizar las dependencias del paquete de despliegue de la función, primero cree un nuevo archivo .zip y, a continuación, cárguelo en Lambda. Para obtener más información, consulte [Creación de un paquete de despliegue .zip con dependencias](#nodejs-package-create-dependencies) y [Creación y actualización de funciones de Lambda Node.js mediante archivos .zip](#nodejs-package-create-update). 

## Creación de un paquete de despliegue .zip sin dependencias
<a name="nodejs-package-create-no-dependencies"></a>

 Si el código de la función no tiene dependencias, excepto las bibliotecas incluidas en el tiempo de ejecución de Lambda, el archivo .zip solo contiene el archivo `index.js` o `index.mjs` con el código del controlador de la función. Utilice la utilidad de compresión que prefiera para crear un archivo .zip con el archivo `index.js` o `index.mjs` en la raíz. Si el archivo que contiene el código del controlador no está en la raíz del archivo .zip, Lambda no podrá ejecutar el código. 

 Para obtener información sobre cómo implementar un archivo .zip para crear una nueva función de Lambda o actualizar una existente, consulte  [Creación y actualización de funciones de Lambda Node.js mediante archivos .zip](#nodejs-package-create-update). 

## Creación de un paquete de despliegue .zip con dependencias
<a name="nodejs-package-create-dependencies"></a>

Si el código de la función depende de paquetes o módulos que no se encuentran incluidos en el tiempo de ejecución de Node.js de Lambda, puede agregar estas dependencias al archivo .zip con el código de la función o utilizar una [capa de Lambda](chapter-layers.md). En las instrucciones de esta sección, se muestra cómo incluir las dependencias en el paquete de despliegue .zip. Para obtener instrucciones sobre cómo incluir las dependencias en una capa, consulte [Creación de una capa de Node.js para las dependencias](#nodejs-package-dependencies-layers).

Los siguientes comandos de la CLI crean un archivo .zip llamado `my_deployment_package.zip`, que contiene el archivo `index.js` o `index.mjs` con el código del controlador de la función y sus dependencias. En el ejemplo, las dependencias se instalan mediante el administrador de paquetes npm.

**Creación del paquete de implementación**

1. Desplácese hasta el directorio del proyecto que contiene el archivo de código fuente `index.js` o `index.mjs`. En este ejemplo, el directorio se llama `my_function`.

   ```
   cd my_function
   ```

1. Instale las bibliotecas necesarias de la función en el directorio `node_modules` mediante el comando `npm install`. En este ejemplo, instalará AWS X-Ray SDK para Node.js.

   ```
   npm install aws-xray-sdk
   ```

   De este modo, se crea una estructura de carpetas similar a la siguiente:

   ```
   ~/my_function
   ├── index.mjs
   └── node_modules
       ├── async
       ├── async-listener
       ├── atomic-batcher
       ├── aws-sdk
       ├── aws-xray-sdk
       ├── aws-xray-sdk-core
   ```

   También puede agregar módulos personalizados que cree usted mismo al paquete de despliegue. Cree un directorio en `node_modules` con el nombre del módulo y guarde los paquetes personalizados allí.

1. Cree un archivo .zip con el contenido de la carpeta del proyecto en la raíz. Utilice la opción `r` (recursiva) para asegurarse de que el zip contiene las subcarpetas.

   ```
   zip -r my_deployment_package.zip .
   ```

## Creación de una capa de Node.js para las dependencias
<a name="nodejs-package-dependencies-layers"></a>

En las instrucciones de esta sección, se muestra cómo incluir las dependencias en una capa. Para obtener instrucciones sobre cómo incluir las dependencias en el paquete de implementación, consulte [Creación de un paquete de despliegue .zip con dependencias](#nodejs-package-create-dependencies).

Cuando agrega una capa a una función, Lambda carga el contenido de la capa en el directorio `/opt` de ese entorno de ejecución. Para cada tiempo de ejecución de Lambda, la variable `PATH` ya incluye rutas de carpeta específicas en el directorio `/opt`. Para garantizar que Lambda recoja el contenido de la capa, el archivo .zip de la capa, debe tener sus dependencias en las siguientes rutas de carpeta:
+ `nodejs/node_modules`
+ `nodejs/node18/node_modules (NODE_PATH)`
+ `nodejs/node20/node_modules (NODE_PATH)`
+ `nodejs/node22/node_modules (NODE_PATH)`

Por ejemplo, la estructura del archivo .zip de la capa podría tener el siguiente aspecto:

```
xray-sdk.zip
└ nodejs/node_modules/aws-xray-sdk
```

Además, Lambda detecta de forma automática cualquier biblioteca en el directorio `/opt/lib` y todos los archivos binarios en el directorio `/opt/bin`. Para asegurarse de que Lambda encuentre el contenido de la capa de forma correcta, también puede crear una capa con la siguiente estructura:

```
custom-layer.zip
└ lib
    | lib_1
    | lib_2
└ bin
    | bin_1
    | bin_2
```

Después de empaquetar la capa, consulte [Creación y eliminación de capas en Lambda](creating-deleting-layers.md) y [Adición de capas a las funciones](adding-layers.md) para completar la configuración de la capa.

## Ruta de búsqueda de dependencias y bibliotecas incluidas en tiempo de ejecución
<a name="nodejs-package-searchpath"></a>

El tiempo de ejecución de Node.js incluye varias bibliotecas comunes, así como una versión de AWS SDK para JavaScript. Si quiere utilizar una versión diferente de una biblioteca con tiempo de ejecución incluido, puede agruparla con la función o agregarla como una dependencia en el paquete de despliegue. Por ejemplo, puede utilizar una versión diferente del SDK al agregarla al paquete de despliegue .zip. También puede incluirla en una [capa de Lambda](chapter-layers.md) para la función.

Cuando utilice una instrucción `import` o `require` en el código, el tiempo de ejecución de Node.js buscará en los directorios, en la ruta `NODE_PATH`, hasta que encuentre el módulo. De forma predeterminada, la primera ubicación que busca el tiempo de ejecución es el directorio en el que se descomprime y monta el paquete de despliegue .zip (`/var/task`). Si incluye una versión de una biblioteca incluida en el tiempo de ejecución de su paquete de despliegue, esta versión tendrá prioridad sobre la versión incluida en el tiempo de ejecución. Las dependencias del paquete de despliegue también tienen prioridad sobre las dependencias de las capas.

Cuando agregue una dependencia a una capa, Lambda la extraerá en `/opt/nodejs/nodexx/node_modules`, donde `nodexx` representa la versión del entorno de ejecución utilizada. En la ruta de búsqueda, este directorio tiene prioridad sobre el directorio que contiene las bibliotecas incluidas en el tiempo de ejecución (`/var/lang/lib/node_modules`). Las bibliotecas de las capas de funciones tienen prioridad sobre las versiones incluidas en el tiempo de ejecución.

Para ver la ruta de búsqueda completa de la función de Lambda, agregue la siguiente línea de código.

```
console.log(process.env.NODE_PATH)
```

También puede agregar dependencias en una carpeta independiente dentro del paquete .zip. Por ejemplo, puede agregar un módulo personalizado a una carpeta del paquete .zip llamada `common`. Cuando descomprima y monte el paquete .zip, esta carpeta se colocará dentro del directorio `/var/task`. Para utilizar una dependencia de una carpeta en el paquete de despliegue .zip del código, utilice una instrucción `import { } from` o `const { } = require()`, según si utiliza una resolución de módulo CJS o ESM. Por ejemplo:

```
import { myModule } from './common'
```

Si agrupa el código con `esbuild`, `rollup` o similares, las dependencias utilizadas por la función se agrupan en uno o más archivos. Recomendamos utilizar este método para vender dependencias, siempre que sea posible. En comparación con el agregado de dependencias al paquete de despliegue, la agrupación del código mejora el rendimiento debido a la reducción de las operaciones de E/S.

## Creación y actualización de funciones de Lambda Node.js mediante archivos .zip
<a name="nodejs-package-create-update"></a>

 Una vez que haya creado su paquete de implementación .zip, puede utilizarlo para crear una nueva función de Lambda o actualizar una existente. Puede implementar el paquete .zip a través de la consola, la AWS Command Line Interface y la API de Lambda. También puede crear y actualizar funciones de Lambda mediante AWS Serverless Application Model (AWS SAM) y CloudFormation. 

El tamaño máximo de un paquete de despliegue .zip para Lambda es de 250 MB (descomprimido). Tenga en cuenta que este límite se aplica al tamaño combinado de todos los archivos que cargue, incluidas las capas de Lambda.

El tiempo de ejecución de Lambda necesita permiso para leer los archivos del paquete de implementación. En la notación octal de permisos de Linux, Lambda necesita 644 permisos para archivos no ejecutables (rw-r--r--) y 755 permisos (rwxr-xr-x) para directorios y archivos ejecutables.

En Linux y macOS, utilice el comando `chmod` para cambiar los permisos de los archivos y directorios del paquete de implementación. Por ejemplo, para conceder a un archivo no ejecutable los permisos correctos, ejecute el siguiente comando.

```
chmod 644 <filepath>
```

Para cambiar los permisos de los archivos en Windows, consulte [Set, View, Change, or Remove Permissions on an Object](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc731667(v=ws.10)) en la documentación de Microsoft Windows.

**nota**  
Si no concede a Lambda los permisos necesarios para acceder a los directorios del paquete de implementación, Lambda establecerá los permisos de esos directorios en 755 (rwxr-xr-x).

### Creación y actualización de funciones con archivos .zip mediante la consola
<a name="nodejs-package-create-console"></a>

 Para crear una nueva función, primero debe crearla en la consola y, a continuación, cargar el archivo .zip. Para actualizar una función existente, abra la página de la función correspondiente y, a continuación, siga el mismo procedimiento para agregar el archivo .zip actualizado. 

 Si el archivo .zip tiene un tamaño inferior a 50 MB, puede crear o actualizar una función al cargarlo directamente desde su equipo local. Para archivos .zip de más de 50 MB, primero debe cargar su paquete en un bucket de Amazon S3. Para obtener instrucciones sobre cómo cargar un archivo en un bucket de Amazon S3 con la Consola de administración de AWS, consulte [Introducción a Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html). Para cargar archivos mediante la AWS CLI, consulte [Mover objetos](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) en la *Guía del usuario de la AWS CLI*. 

**nota**  
No puede cambiar el [tipo de paquete de implementación](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType) (.zip o imagen de contenedor) de una función existente. Por ejemplo, no se puede convertir una función de imagen de contenedor para utilizar un archivo .zip. Debe crear una nueva función.

**Para crear una nueva función (consola)**

1. Abra la [página Funciones](https://console.aws.amazon.com/lambda/home#/functions) de la consola de Lambda y elija **Crear función**.

1. Elija **Crear desde cero**.

1. En **Información básica**, haga lo siguiente:

   1. En **Nombre de la función**, escriba el nombre de la función.

   1. En **Tiempo de ejecución**, seleccione el tiempo de ejecución que desea utilizar.

   1. (Opcional) Para **Arquitectura**, elija la arquitectura del conjunto de instrucciones para su función. La arquitectura predeterminada es x86\$164. Asegúrese de que el paquete de despliegue .zip para su función sea compatible con la arquitectura del conjunto de instrucciones que seleccione.

1. (Opcional) En **Permisos**, expanda **Cambiar función de ejecución predeterminada**. Puede crear un nuevo **Rol de ejecución** o utilizar uno existente.

1. Seleccione **Creación de función**. Lambda crea una función básica “Hola, mundo” mediante el tiempo de ejecución elegido.

**Para cargar un archivo .zip desde su equipo local (consola)**

1. En la [página Funciones](https://console.aws.amazon.com/lambda/home#/functions) de la consola de Lambda, elija la función para la que desea cargar el archivo .zip.

1. Seleccione la pestaña **Código**.

1. En el panel **Código fuente**, elija **Cargar desde**.

1. Elija un **archivo .zip**.

1. Para cargar el archivo .zip, haga lo siguiente:

   1. Seleccione **Cargar** y, a continuación, seleccione su archivo .zip en el selector de archivos.

   1. Elija **Abrir**.

   1. Seleccione **Save**.

**Carga de un archivo .zip desde un bucket de Amazon S3 (consola)**

1. En la [página Funciones](https://console.aws.amazon.com/lambda/home#/functions) de la consola de Lambda, elija la función para la que desea cargar un nuevo archivo .zip.

1. Seleccione la pestaña **Código**.

1. En el panel **Código fuente**, elija **Cargar desde**.

1. Elija la **ubicación de Amazon S3**.

1. Pegue la URL del enlace de Amazon S3 de su archivo .zip y seleccione **Guardar**.

### Actualización de las funciones del archivo .zip mediante el editor de código de la consola
<a name="nodejs-package-console-edit"></a>

 Para algunas funciones con paquetes de despliegue en formato .zip, puede utilizar el editor de código integrado en la consola de Lambda para actualizar el código de la función de forma directa. Para utilizar esta característica, la función debe cumplir los siguientes criterios: 
+ La función debe utilizar uno de los tiempos de ejecución del lenguaje interpretado (Python, Node.js o Ruby)
+ El paquete de implementación de la función debe tener un tamaño inferior a 50 MB (sin comprimir).

El código de función de las funciones con paquetes de despliegue de imágenes de contenedores no se puede editar directamente en la consola.

**Para actualizar el código de función mediante el editor de código de la consola**

1. Abra la [página Funciones](https://console.aws.amazon.com/lambda/home#/functions) de la consola de Lambda y seleccione su función.

1. Seleccione la pestaña **Código**.

1. En el panel **Código fuente**, seleccione su archivo de código fuente y edítelo en el editor de código integrado.

1. En la sección **IMPLEMENTAR** elija **Implementar** para actualizar el código de la función:  
![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

### Creación y actualización de funciones con archivos .zip mediante la AWS CLI
<a name="nodejs-package-create-cli"></a>

 Puede utilizar la [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) para crear una nueva función o actualizar una existente con un archivo .zip. Utilice los comandos [create-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) y [update-function-code](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) para implementar su paquete .zip. Si el archivo .zip tiene un tamaño inferior a 50 MB, puede cargarlo desde una ubicación de archivo en su equipo de compilación local. Para archivos más grandes, debe cargar su paquete .zip desde un bucket de Amazon S3. Para obtener instrucciones sobre cómo cargar un archivo en un bucket de Amazon S3 con la AWS CLI, consulte [Mover objetos](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) en la *Guía del usuario de la AWS CLI*. 

**nota**  
Si carga su archivo .zip desde un bucket de Amazon S3 con la AWS CLI, el bucket debe estar ubicado en la misma Región de AWS que su función.

 Para crear una nueva función mediante un archivo .zip con la AWS CLI, debe especificar lo siguiente: 
+ El nombre de la función (`--function-name`).
+ El tiempo de ejecución de la función (`--runtime`).
+ El nombre de recurso de Amazon (ARN) del [rol de ejecución](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) de la función (`--role`).
+ El nombre del método de controlador en el código de la función (`--handler`).

 También debe especificar la ubicación del archivo .zip. Si el archivo .zip se encuentra en una carpeta de su equipo de compilación local, utilice la opción `--zip-file` para especificar la ruta del archivo, como se muestra en el siguiente comando de ejemplo. 

```
aws lambda create-function --function-name myFunction \
--runtime nodejs24.x --handler index.handler \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip
```

 Para especificar la ubicación del archivo .zip en un bucket de Amazon S3, utilice la opción `--code`, como se muestra en el siguiente comando de ejemplo. Solo necesita utilizar el parámetro `S3ObjectVersion` para los objetos con versiones. 

```
aws lambda create-function --function-name myFunction \
--runtime nodejs24.x --handler index.handler \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion
```

 Para actualizar una función existente mediante la CLI, especifique el nombre de la función mediante el parámetro `--function-name`. También debe especificar la ubicación del archivo .zip que desea utilizar para actualizar el código de la función. Si el archivo .zip se encuentra en una carpeta de su equipo de compilación local, utilice la opción `--zip-file` para especificar la ruta del archivo, como se muestra en el siguiente comando de ejemplo. 

```
aws lambda update-function-code --function-name myFunction \
--zip-file fileb://myFunction.zip
```

 Para especificar la ubicación del archivo .zip en un bucket de Amazon S3, utilice las opciones `--s3-bucket` y `--s3-key` tal como se muestra en el siguiente comando de ejemplo. Solo necesita utilizar el parámetro `--s3-object-version` para los objetos con versiones. 

```
aws lambda update-function-code --function-name myFunction \
--s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version
```

### Creación y actualización de funciones con archivos .zip mediante la API de Lambda
<a name="nodejs-package-create-api"></a>

 Para crear y actualizar funciones con un archivo de archivos .zip, utilice las siguientes operaciones de la API: 
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)

### Creación y actualización de funciones con archivos .zip mediante AWS SAM
<a name="nodejs-package-create-sam"></a>

 AWS Serverless Application Model (AWS SAM) es un conjunto de herramientas que ayuda a agilizar el proceso de creación y ejecución de aplicaciones sin servidor en AWS. Defina los recursos de su aplicación en una plantilla YAML o JSON y utilice la interfaz de la línea de comandos de AWS SAM (AWS SAM CLI) para crear, empaquetar e implementar sus aplicaciones. Al crear una función de Lambda a partir de una plantilla de AWS SAM, AWS SAM crea automáticamente un paquete de despliegue .zip o una imagen de contenedor con el código de la función y las dependencias que especifique. Para obtener más información sobre el uso de AWS SAM para crear e implementar funciones de Lambda, consulte [Introducción a AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html) en la *Guía para desarrolladores de AWS Serverless Application Model*.

También puede utilizar AWS SAM para crear una función de Lambda con un archivo de archivos .zip existente. Para crear una función de Lambda mediante AWS SAM, puede guardar el archivo .zip en un bucket de Amazon S3 o en una carpeta local de su equipo de compilación. Para obtener instrucciones sobre cómo cargar un archivo en un bucket de Amazon S3 con la AWS CLI, consulte [Mover objetos](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) en la *Guía del usuario de la AWS CLI*. 

 En la plantilla de AWS SAM, el recurso `AWS::Serverless::Function` especifica la función de Lambda. En este recurso, establezca las siguientes propiedades para crear una función mediante un archivo de archivos .zip: 
+ `PackageType`: se establece como `Zip`.
+ `CodeUri`: se establece como el URI de Amazon S3, la ruta a la carpeta local o el objeto [FunctionCode](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-functioncode.html) del código de la función.
+ `Runtime`: se establece como el entorno de ejecución elegido

 Con AWS SAM, si su archivo .zip tiene más de 50 MB, no es necesario cargarlo primero en un bucket de Amazon S3. AWS SAM puede cargar paquetes .zip hasta el tamaño máximo permitido de 250 MB (descomprimidos) desde una ubicación de su equipo de compilación local. 

 Para obtener más información sobre la implementación de funciones mediante un archivo .zip en AWS SAM, consulte [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html) en la *Guía para desarrolladores de AWS SAM*. 

### Creación y actualización de funciones con archivos .zip mediante CloudFormation
<a name="nodejs-package-create-cfn"></a>

 Puede utilizar CloudFormation para crear una función de Lambda con un archivo de archivos .zip. Para crear una función de Lambda a partir de un archivo .zip, primero debe cargar el archivo a un bucket de Amazon S3. Para obtener instrucciones sobre cómo cargar un archivo en un bucket de Amazon S3 con la AWS CLI, consulte [Mover objetos](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) en la *Guía del usuario de la AWS CLI.*

En la plantilla de CloudFormation, el recurso `AWS::Lambda::Function` especifica la función de Lambda. En este recurso, establezca las siguientes propiedades para crear una función mediante un archivo de archivos .zip:
+ `PackageType`: se establece como `Zip`.
+ `Code`: ingrese el nombre del bucket de Amazon S3 y el nombre del archivo .zip en los campos `S3Bucket` y `S3Key`.
+ `Runtime`: se establece como el tiempo de ejecución elegido.

 El archivo .zip que genera CloudFormation no puede superar los 4 MB. Para obtener más información sobre la implementación de funciones mediante un archivo .zip en CloudFormation, consulte [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html) en la *Guía del usuario de CloudFormation*. 

# Implementar funciones Node.js Lambda con imágenes de contenedor
<a name="nodejs-image"></a>

Hay tres formas de crear una imagen de contenedor para una función de Lambda en Node.js:
+ [Uso de una imagen base de AWS de Node.js](#nodejs-image-instructions)

  Las [imágenes base de AWS](images-create.md#runtimes-images-lp) vienen precargadas con un tiempo de ejecución de lenguaje, un cliente de interfaz de tiempo de ejecución para administrar la interacción entre Lambda y el código de la función y un emulador de interfaz de tiempo de ejecución para realizar pruebas a nivel local.
+ [Uso de una imagen base exclusiva del sistema operativo de AWS](images-create.md#runtimes-images-provided)

  [Las imágenes base exclusivas del sistema operativo de AWS](https://gallery.ecr.aws/lambda/provided)contienen una distribución de Amazon Linux y el [emulador de interfaz de tiempo de ejecución](https://github.com/aws/aws-lambda-runtime-interface-emulator/). Por lo general, estas imágenes se utilizan para crear imágenes contenedoras para lenguajes compilados, como [Go](go-image.md#go-image-provided) y [Rust](lambda-rust.md), y para un lenguaje o versión de un lenguaje para los que Lambda no proporciona una imagen base, como Node.js 19. También se pueden usar imágenes base exclusivas del sistema operativo para implementar un [tiempo de ejecución personalizado](runtimes-custom.md). Para que la imagen sea compatible con Lambda, debe incluir el [cliente de interfaz de tiempo de ejecución para Node.js](#nodejs-image-clients) en la imagen.
+ [Uso de una imagen base que no sea de AWS](#nodejs-image-clients)

  Puede utilizar una imagen base alternativa de otro registro de contenedores, como Alpine Linux o Debian. También puede utilizar una imagen personalizada creada por su organización. Para que la imagen sea compatible con Lambda, debe incluir el [cliente de interfaz de tiempo de ejecución para Node.js](#nodejs-image-clients) en la imagen.

**sugerencia**  
Para reducir el tiempo que tardan las funciones de contenedor de Lambda en activarse, consulte [Uso de compilaciones de varias fases](https://docs.docker.com/build/building/multi-stage/) en la documentación de Docker. Para compilar imágenes de contenedores eficientes, siga [Prácticas recomendadas para escribir Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/).

En esta página, se explica cómo compilar, probar e implementar imágenes de contenedor para Lambda.

**Topics**
+ [

## AWS imágenes base para Node.js
](#nodejs-image-base)
+ [

## Uso de una imagen base de AWS de Node.js
](#nodejs-image-instructions)
+ [

## Uso de una imagen base alternativa con el cliente de interfaz de tiempo de ejecución
](#nodejs-image-clients)

## AWS imágenes base para Node.js
<a name="nodejs-image-base"></a>

AWS proporciona las siguientes imágenes base para Node.js:


| Etiquetas | Tiempo de ejecución | Sistema operativo | Dockerfile | Obsolescencia | 
| --- | --- | --- | --- | --- | 
| 24 | Node.js 24 | Amazon Linux 2023 | [Dockerfile para Node.js 24 en GitHub](https://github.com/aws/aws-lambda-base-images/blob/nodejs24.x/Dockerfile.nodejs24.x) |   30 de abril de 2028   | 
| 22 | Node.js 22 | Amazon Linux 2023 | [Dockerfile para Node.js 22 en GitHub](https://github.com/aws/aws-lambda-base-images/blob/nodejs22.x/Dockerfile.nodejs22.x) |   30 de abril de 2027   | 
| 20 | Node.js 20 | Amazon Linux 2023 | [Dockerfile para Node.js 20 en GitHub](https://github.com/aws/aws-lambda-base-images/blob/nodejs20.x/Dockerfile.nodejs20.x) |   30 de abril de 2026   | 

Repositorio de Amazon ECR: [gallery.ecr.aws/lambda/nodejs](https://gallery.ecr.aws/lambda/nodejs)

Las imágenes base de Node.js 20 y versiones posteriores se basan en la ‭[‬imagen de contenedor mínima de Amazon Linux 2023‭](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html)‬. Las imágenes base anteriores utilizan Amazon Linux 2. AL2023 ofrece varias ventajas con respecto a Amazon Linux 2, incluida una huella de implementación más reducida y versiones actualizadas de bibliotecas como `glibc`.

Las imágenes basadas en AL2023 utilizan `microdnf` (enlazadas simbólicamente como `dnf`) como administrador de paquetes en lugar de `yum`, que es el administrador de paquetes predeterminado en Amazon Linux 2. `microdnf` es una implementación independiente de `dnf`. Para obtener una lista de los paquetes que se incluyen en las imágenes basadas en AL2023, consulte las columnas de **Minimal Container** de [Comparing packages installed on Amazon Linux 2023 Container Images](https://docs.aws.amazon.com/linux/al2023/ug/al2023-container-image-types.html). Para obtener más información sobre las diferencias entre AL2023 y Amazon Linux 2, consulte [Introducing the Amazon Linux 2023 runtime for AWS Lambda](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/) en el Blog de informática de AWS.

**nota**  
Para ejecutar imágenes basadas en AL2023 de forma local, incluso con AWS Serverless Application Model (AWS SAM), debe usar Docker en la versión 20.10.10 o posterior.

## Uso de una imagen base de AWS de Node.js
<a name="nodejs-image-instructions"></a>

### Requisitos previos
<a name="nodejs-image-prerequisites"></a>

Para completar los pasos de esta sección, debe disponer de lo siguiente:
+ [AWS CLI versión 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (versión mínima 25.0.0)
+ El [complemento buildx](https://github.com/docker/buildx/blob/master/README.md) de Docker.
+ Node.js

### Creación de una imagen a partir de una imagen base
<a name="nodejs-image-create"></a>

**Para crear una imagen de contenedor a partir de una imagen base AWS para Node.js**

1. Cree un directorio para el proyecto y, a continuación, cambie a ese directorio.

   ```
   mkdir example
   cd example
   ```

1. Cree un nuevo proyecto de Node.js con `npm`. Para aceptar las opciones predeterminadas proporcionadas en la experiencia interactiva, oprima `Enter`.

   ```
   npm init
   ```

1. Cree un nuevo archivo denominado `index.js`. Puede agregar el siguiente código de función de muestra al archivo para realizar pruebas o utilizar su propio código.  
**Example Controlador de CommonJS**  

   ```
   exports.handler = async (event) => {
       const response = {
           statusCode: 200,
           body: JSON.stringify('Hello from Lambda!'),
       };
       return response;
   };
   ```

1. Si su función depende de bibliotecas distintas de AWS SDK para JavaScript, utilice [npm](https://www.npmjs.com/) para agregarlas al paquete.

1. Cree un nuevo archivo Dockerfile con la siguiente configuración:
   + Establezca la propiedad `FROM` en el [URI de la imagen base](https://gallery.ecr.aws/lambda/nodejs).
   + Utilice el comando COPY para copiar el código de la función y las dependencias del tiempo de ejecución a `{LAMBDA_TASK_ROOT}`, una [variable de entorno definido de Lambda](configuration-envvars.md#configuration-envvars-runtime).
   + Establezca el argumento `CMD` para el controlador de la función de Lambda.

   Tenga en cuenta que el Dockerfile de ejemplo no incluye una [instrucción USER](https://docs.docker.com/reference/dockerfile/#user). Al implementar una imagen de contenedor en Lambda, Lambda define automáticamente un usuario predeterminado de Linux con permisos de privilegio mínimo. Esto es diferente del comportamiento estándar de Docker, que utiliza de forma predeterminada el usuario `root` cuando no se proporciona ninguna instrucción `USER`.  
**Example Dockerfile**  

   ```
   FROM public.ecr.aws/lambda/nodejs:22
   
   # Copy function code
   COPY index.js ${LAMBDA_TASK_ROOT}
     
   # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
   CMD [ "index.handler" ]
   ```

1. Cree la imagen de Docker con el comando [docker build](https://docs.docker.com/engine/reference/commandline/build/). En el siguiente ejemplo se asigna un nombre a la imagen `docker-image` y se le asigna la [etiqueta](https://docs.docker.com/engine/reference/commandline/build/#tag) `test`. Para que la imagen sea compatible con Lambda, debe usar la opción `--provenance=false`.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**nota**  
El comando especifica la opción `--platform linux/amd64` para garantizar que el contenedor sea compatible con el entorno de ejecución de Lambda, independientemente de la arquitectura de la máquina de compilación. Si tiene intención de crear una función de Lambda con la arquitectura del conjunto de instrucciones ARM64, asegúrese de cambiar el comando para utilizar la opción `--platform linux/arm64` en su lugar.

### (Opcional) Prueba de la imagen de forma local
<a name="nodejs-image-test"></a>

1. Inicie la imagen de Docker con el comando **docker run**. En este ejemplo, `docker-image` es el nombre de la imagen y `test` es la etiqueta.

   ```
   docker run --platform linux/amd64 -p 9000:8080 docker-image:test
   ```

   Este comando ejecuta la imagen como un contenedor y crea un punto de conexión local en `localhost:9000/2015-03-31/functions/function/invocations`.
**nota**  
Si creó la imagen de Docker para la arquitectura del conjunto de instrucciones ARM64, asegúrese de utilizar la opción `--platform linux/arm64` en lugar de `--platform linux/amd64`.

1. Desde una nueva ventana de terminal, publique un evento en el punto de conexión local.

------
#### [ Linux/macOS ]

   En Linux y macOS, ejecute el siguiente comando `curl`:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   Este comando invoca la función con un evento vacío y devuelve una respuesta. Si utiliza su propio código de función en lugar del código de función de ejemplo, quizás quiera invocar la función con una carga JSON. Ejemplo:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

------
#### [ PowerShell ]

   En PowerShell, ejecute el siguiente comando `Invoke-WebRequest`:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   Este comando invoca la función con un evento vacío y devuelve una respuesta. Si utiliza su propio código de función en lugar del código de función de ejemplo, quizás quiera invocar la función con una carga JSON. Ejemplo:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
   ```

------

1. Obtenga el ID del contenedor.

   ```
   docker ps
   ```

1. Use el comando [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) para detener el contenedor. En este comando, reemplace `3766c4ab331c` por el ID del contenedor del paso anterior.

   ```
   docker kill 3766c4ab331c
   ```

### Implementación de la imagen
<a name="nodejs-image-deploy"></a>

**Para cargar la imagen en Amazon ECR y crear la función de Lambda**

1. Para autenticar la CLI de Docker en su registro de Amazon ECR, ejecute el comando [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html).
   + Establezca el valor de `--region` en la Región de AWS en la que desee crear el repositorio de Amazon ECR.
   + Reemplace `111122223333` por el ID de su Cuenta de AWS.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. Cree un repositorio en Amazon ECR con el comando [create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html).

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**nota**  
El repositorio de Amazon ECR debe estar en la misma Región de AWS que la función de Lambda.

   Si se realiza de la forma correcta, verá una respuesta como la siguiente:

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. Copie el valor de `repositoryUri` de la salida del paso anterior.

1. Ejecute el comando [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) para etiquetar la imagen local en su repositorio de Amazon ECR como la versión más reciente. En este comando:
   + `docker-image:test` es el nombre y la [etiqueta](https://docs.docker.com/engine/reference/commandline/build/#tag) de su imagen de Docker. Son el nombre y la etiqueta de la imagen que especificó en el comando `docker build`.
   + Reemplace `<ECRrepositoryUri>` por el `repositoryUri` que ha copiado. Asegúrese de incluir `:latest` al final del URI.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   Ejemplo:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Ejecute el comando [docker push](https://docs.docker.com/engine/reference/commandline/push/) para implementar la imagen local en el repositorio de Amazon ECR. Asegúrese de incluir `:latest` al final del URI del repositorio.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [Cree un rol de ejecución](lambda-intro-execution-role.md#permissions-executionrole-api) para la función si aún no tiene uno. Necesitará el nombre de recurso de Amazon (ARN) del rol en el paso siguiente.

1. Cree la función de Lambda. En `ImageUri`, especifique el URI del repositorio anterior. Asegúrese de incluir `:latest` al final del URI.

   ```
   aws lambda create-function \
     --function-name hello-world \
     --package-type Image \
     --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**nota**  
Puede crear una función con una imagen de una cuenta AWS diferente, siempre que la imagen esté en la misma región que la función de Lambda. Para obtener más información, consulte [Permisos entre cuentas de Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Invoque la función.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   Debería ver una respuesta como la siguiente:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Para ver la salida de la función, compruebe el archivo `response.json`.

Para actualizar el código de la función, debe volver a compilar la imagen, cargar la nueva imagen en el repositorio de Amazon ECR y, a continuación, utilizar el comando [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) para implementar la imagen en la función de Lambda.

Lambda resuelve la etiqueta de la imagen en un resumen de imagen específico. Esto significa que si apunta la etiqueta de imagen que se utilizó para implementar la función a una nueva imagen en Amazon ECR, Lambda no actualiza automáticamente la función para usar la nueva imagen.

Para implementar la nueva imagen en la misma función de Lambda, debe usar el comando [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html), incluso si la etiqueta de la imagen en Amazon ECR sigue siendo la misma. En el siguiente ejemplo, la opción `--publish` crea una nueva versión de la función con la imagen del contenedor actualizada.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```

## Uso de una imagen base alternativa con el cliente de interfaz de tiempo de ejecución
<a name="nodejs-image-clients"></a>

Si usa una [imagen base exclusiva del sistema operativo](images-create.md#runtimes-images-provided) o una imagen base alternativa, debe incluir el cliente de interfaz de tiempo de ejecución en su imagen. El cliente de interfaz de tiempo de ejecución extiende el [API de tiempo de ejecución](runtimes-api.md), que administra la interacción entre Lambda y el código de la función.

Instale el [cliente de interfaz de tiempo de ejecución para Node.js](https://www.npmjs.com/package/aws-lambda-ric) mediante el administrador de paquetes npm:

```
npm install aws-lambda-ric
```

También puede descargar el [cliente de interfaz de tiempo de ejecución Node.js](https://github.com/aws/aws-lambda-nodejs-runtime-interface-client) desde GitHub.

El siguiente ejemplo muestra cómo crear una imagen de contenedor para Node.js utilizando una imagen base que no es de AWS. El siguiente Dockerfile de ejemplo usa una imagen base de `bookworm`. El Dockerfile incluye el cliente de interfaz de tiempo de ejecución.

### Requisitos previos
<a name="nodejs-alt-prerequisites"></a>

Para completar los pasos de esta sección, debe disponer de lo siguiente:
+ [AWS CLI versión 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (versión mínima 25.0.0)
+ El [complemento buildx](https://github.com/docker/buildx/blob/master/README.md) de Docker.
+ Node.js

### Creación de imágenes a partir de una imagen base alternativa
<a name="nodejs-alt-create"></a>

**Para crear una imagen de contenedor a partir de una imagen base que no es de AWS**

1. Cree un directorio para el proyecto y, a continuación, cambie a ese directorio.

   ```
   mkdir example
   cd example
   ```

1. Cree un nuevo proyecto de Node.js con `npm`. Para aceptar las opciones predeterminadas proporcionadas en la experiencia interactiva, oprima `Enter`.

   ```
   npm init
   ```

1. Cree un nuevo archivo denominado `index.js`. Puede agregar el siguiente código de función de muestra al archivo para realizar pruebas o utilizar su propio código.  
**Example Controlador de CommonJS**  

   ```
   exports.handler = async (event) => {
       const response = {
           statusCode: 200,
           body: JSON.stringify('Hello from Lambda!'),
       };
       return response;
   };
   ```

1. Cree un nuevo Dockerfile. El siguiente Dockerfile usa una imagen base de `bookworm` en lugar de una [imagen base de AWS](images-create.md#runtimes-images-lp). El Dockerfile incluye el [cliente de interfaz de tiempo de ejecución](https://www.npmjs.com/package/aws-lambda-ric), que hace que la imagen sea compatible con Lambda. El Dockerfile utiliza una [compilación de varias etapas](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-multi-stage-builds). La primera etapa crea una imagen de compilación, que es un entorno estándar de Node.js donde se instalan las dependencias de la función. La segunda etapa crea una imagen más compacta que incluye el código de la función y sus dependencias. Esto reduce el tamaño final de la imagen.
   + Establezca la propiedad `FROM` como el identificador de la imagen base.
   + Utilice el comando `COPY` para copiar el código de la función y las dependencias del tiempo de ejecución.
   + Configure `ENTRYPOINT` como el módulo que desea que el contenedor de Docker ejecute cuando se inicie. En este caso, el módulo es el cliente de interfaz de tiempo de ejecución.
   + Establezca el argumento `CMD` para el controlador de la función de Lambda.

   Tenga en cuenta que el Dockerfile de ejemplo no incluye una [instrucción USER](https://docs.docker.com/reference/dockerfile/#user). Al implementar una imagen de contenedor en Lambda, Lambda define automáticamente un usuario predeterminado de Linux con permisos de privilegio mínimo. Esto es diferente del comportamiento estándar de Docker, que utiliza de forma predeterminada el usuario `root` cuando no se proporciona ninguna instrucción `USER`.  
**Example Dockerfile**  

   ```
   # Define custom function directory
   ARG FUNCTION_DIR="/function"
   
   FROM node:20-bookworm as build-image
   
   # Include global arg in this stage of the build
   ARG FUNCTION_DIR
   
   # Install build dependencies
   RUN apt-get update && \
       apt-get install -y \
       g++ \
       make \
       cmake \
       unzip \
       libcurl4-openssl-dev
   
   # Copy function code
   RUN mkdir -p ${FUNCTION_DIR}
   COPY . ${FUNCTION_DIR}
   
   WORKDIR ${FUNCTION_DIR}
   
   # Install Node.js dependencies
   RUN npm install
   
   # Install the runtime interface client
   RUN npm install aws-lambda-ric
   
   # Grab a fresh slim copy of the image to reduce the final size
   FROM node:20-bookworm-slim
   
   # Required for Node runtimes which use npm@8.6.0+ because
   # by default npm writes logs under /home/.npm and Lambda fs is read-only
   ENV NPM_CONFIG_CACHE=/tmp/.npm
   
   # Include global arg in this stage of the build
   ARG FUNCTION_DIR
   
   # Set working directory to function root directory
   WORKDIR ${FUNCTION_DIR}
   
   # Copy in the built dependencies
   COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
   
   # Set runtime interface client as default command for the container runtime
   ENTRYPOINT ["/usr/local/bin/npx", "aws-lambda-ric"]
   # Pass the name of the function handler as an argument to the runtime
   CMD ["index.handler"]
   ```

1. Cree la imagen de Docker con el comando [docker build](https://docs.docker.com/engine/reference/commandline/build/). En el siguiente ejemplo se asigna un nombre a la imagen `docker-image` y se le asigna la [etiqueta](https://docs.docker.com/engine/reference/commandline/build/#tag) `test`. Para que la imagen sea compatible con Lambda, debe usar la opción `--provenance=false`.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**nota**  
El comando especifica la opción `--platform linux/amd64` para garantizar que el contenedor sea compatible con el entorno de ejecución de Lambda, independientemente de la arquitectura de la máquina de compilación. Si tiene intención de crear una función de Lambda con la arquitectura del conjunto de instrucciones ARM64, asegúrese de cambiar el comando para utilizar la opción `--platform linux/arm64` en su lugar.

### (Opcional) Prueba de la imagen de forma local
<a name="nodejs-alt-test"></a>

Utilice el [emulador de interfaz de tiempo de ejecución](https://github.com/aws/aws-lambda-runtime-interface-emulator/) para probar la imagen localmente. Puede [crear el emulador en su imagen](https://github.com/aws/aws-lambda-runtime-interface-emulator/?tab=readme-ov-file#build-rie-into-your-base-image) o usar el procedimiento siguiente para instalarlo en su equipo local.

**Para instalar y ejecutar el emulador de interfaz de tiempo de ejecución en su equipo local**

1. Desde el directorio del proyecto, ejecute el siguiente comando para descargar el emulador de interfaz de tiempo de ejecución (arquitectura x86-64) de GitHub e instalarlo en su equipo local.

------
#### [ Linux/macOS ]

   ```
   mkdir -p ~/.aws-lambda-rie && \
       curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \
       chmod +x ~/.aws-lambda-rie/aws-lambda-rie
   ```

   Para instalar el emulador arm64, reemplace la URL del repositorio de GitHub en el comando anterior por lo siguiente:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------
#### [ PowerShell ]

   ```
   $dirPath = "$HOME\.aws-lambda-rie"
   if (-not (Test-Path $dirPath)) {
       New-Item -Path $dirPath -ItemType Directory
   }
         
   $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
   $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie"
   Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath
   ```

   Para instalar el emulador arm64, reemplace el `$downloadLink` con lo siguiente:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------

1. Inicie la imagen de Docker con el comando **docker run**. Tenga en cuenta lo siguiente:
   + `docker-image` es el nombre de la imagen y `test` es la etiqueta.
   + `/usr/local/bin/npx aws-lambda-ric index.handler` es el `ENTRYPOINT` seguido del `CMD` de su Dockerfile.

------
#### [ Linux/macOS ]

   ```
   docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
       --entrypoint /aws-lambda/aws-lambda-rie \
       docker-image:test \
           /usr/local/bin/npx aws-lambda-ric index.handler
   ```

------
#### [ PowerShell ]

   ```
   docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 `
   --entrypoint /aws-lambda/aws-lambda-rie `
   docker-image:test `
       /usr/local/bin/npx aws-lambda-ric index.handler
   ```

------

   Este comando ejecuta la imagen como un contenedor y crea un punto de conexión local en `localhost:9000/2015-03-31/functions/function/invocations`.
**nota**  
Si creó la imagen de Docker para la arquitectura del conjunto de instrucciones ARM64, asegúrese de utilizar la opción `--platform linux/arm64` en lugar de `--platform linux/amd64`.

1. Publique un evento en el punto de conexión local.

------
#### [ Linux/macOS ]

   En Linux y macOS, ejecute el siguiente comando `curl`:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   Este comando invoca la función con un evento vacío y devuelve una respuesta. Si utiliza su propio código de función en lugar del código de función de ejemplo, quizás quiera invocar la función con una carga JSON. Ejemplo:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

------
#### [ PowerShell ]

   En PowerShell, ejecute el siguiente comando `Invoke-WebRequest`:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   Este comando invoca la función con un evento vacío y devuelve una respuesta. Si utiliza su propio código de función en lugar del código de función de ejemplo, quizás quiera invocar la función con una carga JSON. Ejemplo:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
   ```

------

1. Obtenga el ID del contenedor.

   ```
   docker ps
   ```

1. Use el comando [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) para detener el contenedor. En este comando, reemplace `3766c4ab331c` por el ID del contenedor del paso anterior.

   ```
   docker kill 3766c4ab331c
   ```

### Implementación de la imagen
<a name="nodejs-alt-deploy"></a>

**Para cargar la imagen en Amazon ECR y crear la función de Lambda**

1. Para autenticar la CLI de Docker en su registro de Amazon ECR, ejecute el comando [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html).
   + Establezca el valor de `--region` en la Región de AWS en la que desee crear el repositorio de Amazon ECR.
   + Reemplace `111122223333` por el ID de su Cuenta de AWS.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. Cree un repositorio en Amazon ECR con el comando [create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html).

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**nota**  
El repositorio de Amazon ECR debe estar en la misma Región de AWS que la función de Lambda.

   Si se realiza de la forma correcta, verá una respuesta como la siguiente:

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. Copie el valor de `repositoryUri` de la salida del paso anterior.

1. Ejecute el comando [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) para etiquetar la imagen local en su repositorio de Amazon ECR como la versión más reciente. En este comando:
   + `docker-image:test` es el nombre y la [etiqueta](https://docs.docker.com/engine/reference/commandline/build/#tag) de su imagen de Docker. Son el nombre y la etiqueta de la imagen que especificó en el comando `docker build`.
   + Reemplace `<ECRrepositoryUri>` por el `repositoryUri` que ha copiado. Asegúrese de incluir `:latest` al final del URI.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   Ejemplo:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Ejecute el comando [docker push](https://docs.docker.com/engine/reference/commandline/push/) para implementar la imagen local en el repositorio de Amazon ECR. Asegúrese de incluir `:latest` al final del URI del repositorio.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [Cree un rol de ejecución](lambda-intro-execution-role.md#permissions-executionrole-api) para la función si aún no tiene uno. Necesitará el nombre de recurso de Amazon (ARN) del rol en el paso siguiente.

1. Cree la función de Lambda. En `ImageUri`, especifique el URI del repositorio anterior. Asegúrese de incluir `:latest` al final del URI.

   ```
   aws lambda create-function \
     --function-name hello-world \
     --package-type Image \
     --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**nota**  
Puede crear una función con una imagen de una cuenta AWS diferente, siempre que la imagen esté en la misma región que la función de Lambda. Para obtener más información, consulte [Permisos entre cuentas de Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Invoque la función.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   Debería ver una respuesta como la siguiente:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Para ver la salida de la función, compruebe el archivo `response.json`.

Para actualizar el código de la función, debe volver a compilar la imagen, cargar la nueva imagen en el repositorio de Amazon ECR y, a continuación, utilizar el comando [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) para implementar la imagen en la función de Lambda.

Lambda resuelve la etiqueta de la imagen en un resumen de imagen específico. Esto significa que si apunta la etiqueta de imagen que se utilizó para implementar la función a una nueva imagen en Amazon ECR, Lambda no actualiza automáticamente la función para usar la nueva imagen.

Para implementar la nueva imagen en la misma función de Lambda, debe usar el comando [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html), incluso si la etiqueta de la imagen en Amazon ECR sigue siendo la misma. En el siguiente ejemplo, la opción `--publish` crea una nueva versión de la función con la imagen del contenedor actualizada.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```

# Uso de capas para funciones de Lambda en Node.js
<a name="nodejs-layers"></a>

Utilice [capas de Lambda](chapter-layers.md) para empaquetar el código y las dependencias que desee reutilizar en varias funciones. Las capas suelen contener dependencias de biblioteca, un [tiempo de ejecución personalizado](runtimes-custom.md) o archivos de configuración. La creación de una capa implica tres pasos generales:

1. Empaquete el contenido de su capa. Esto significa crear un archivo de archivo. zip que contenga las dependencias que desea usar en sus funciones.

1. Cree la capa en Lambda.

1. Agregue la capa a sus funciones.

**Topics**
+ [

## Empaquete el contenido de su capa.
](#nodejs-layers-package)
+ [

## Creación de la capa en Lambda
](#publishing-layer)
+ [

## Adición de la capa a la función
](#nodejs-layer-adding)
+ [

## Aplicación de ejemplo
](#nodejs-layer-sample-app)

## Empaquete el contenido de su capa.
<a name="nodejs-layers-package"></a>

Para crear una capa, agrupe sus paquetes en un archivo .zip que cumpla con los siguientes requisitos:
+ Cree la capa con la misma versión de Node.js que tiene previsto usar para la función de Lambda. Por ejemplo, si crea una capa con Node.js 24, use el tiempo de ejecución de Node.js 24 para su función.
+ El archivo .zip de su capa debe usar una de estas estructuras de directorios:
  + `nodejs/node_modules`
  + `nodejs/nodeX/node_modules`(donde *X* es su versión de Node.js, por ejemplo `node22`)

  Para obtener más información, consulte [Rutas de capa para cada tiempo de ejecución de Lambda](packaging-layers.md#packaging-layers-paths).
+ Los paquetes de la capa deben ser compatibles con Linux. Las funciones de Lambda se ejecutan en Amazon Linux.

Puede crear capas que contengan bibliotecas de Node.js de terceros instaladas con `npm` (como `axios` o `lodash`) o sus propios módulos y paquetes de JavaScript.

### Dependencias de terceros
<a name="nodejs-layers-third-party-dependencies"></a>

**Creación de una capa con paquetes npm**

1. Cree la estructura de directorios necesaria e instale los paquetes directamente allí:

   ```
   mkdir -p nodejs
   npm install --prefix nodejs lodash axios
   ```

   Este comando instala los paquetes directamente en el directorio `nodejs/node_modules`, que es la estructura que Lambda requiere.
**nota**  
Para los paquetes con dependencias nativas o componentes binarios (como [sharp](https://www.npmjs.com/package/sharp) o [bcrypt](https://www.npmjs.com/package/bcrypt)), asegúrese de que sean compatibles con el entorno Lambda Linux y la [arquitectura](foundation-arch.md) de su función. Es posible que necesite usar la bandera `--platform`:  

   ```
   npm install --prefix nodejs --platform=linux --arch=x64 sharp
   ```
En el caso de dependencias nativas más complejas, es posible que deba compilarlas en un entorno Linux que coincida con el tiempo de ejecución de Lambda. Puede utilizar Docker para hacerlo.

1. Comprima en formato zip el contenido de la capa:

------
#### [ Linux/macOS ]

   ```
   zip -r layer.zip nodejs/
   ```

------
#### [ PowerShell ]

   ```
   Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip
   ```

------

   La estructura de directorios del archivo .zip debería ser similar a la siguiente:

   ```
   nodejs/
   ├── package.json
   ├── package-lock.json
   └── node_modules/
       ├── lodash/
       ├── axios/
       └── (dependencies of the other packages)
   ```
**nota**  
Asegúrese de que su archivo .zip incluya el directorio `nodejs` en el nivel raíz con `node_modules` en su interior. Esta estructura garantiza que Lambda pueda localizar e importar sus paquetes.
npm utiliza los archivos `package.json` y `package-lock.json` del directorio `nodejs/` para la administración de dependencias, pero Lambda no los requiere para la funcionalidad de las capas. Cada paquete instalado ya contiene su propio archivo `package.json` que define cómo Lambda importa el paquete.

### Módulos personalizados de JavaScript
<a name="custom-nodejs-modules"></a>

**Creación de una capa con su propio código**

1. Cree la estructura del directorio necesario para su capa:

   ```
   mkdir -p nodejs/node_modules/validator
   cd nodejs/node_modules/validator
   ```

1. Cree un archivo `package.json` para su módulo personalizado para definir cómo debe importarse:  
**Example nodejs/node\$1modules/validator/package.json**  

   ```
   {
     "name": "validator",
     "version": "1.0.0",
     "type": "module",
     "main": "index.mjs"
   }
   ```

1. Cree su archivo de módulo JavaScript:  
**Example nodejs/node\$1modules/validator/index.mjs**  

   ```
   export function validateOrder(orderData) {
     // Validates an order and returns formatted data
     const requiredFields = ['productId', 'quantity'];
     
     // Check required fields
     const missingFields = requiredFields.filter(field => !(field in orderData));
     if (missingFields.length > 0) {
       throw new Error(`Missing required fields: ${missingFields.join(', ')}`);
     }
     
     // Validate quantity
     const quantity = orderData.quantity;
     if (!Number.isInteger(quantity) || quantity < 1) {
       throw new Error('Quantity must be a positive integer');
     }
     
     // Format and return the validated data
     return {
       productId: String(orderData.productId),
       quantity: quantity,
       shippingPriority: orderData.priority || 'standard'
     };
   }
   
   export function formatResponse(statusCode, body) {
     // Formats the API response
     return {
       statusCode: statusCode,
       body: JSON.stringify(body)
     };
   }
   ```

1. Comprima en formato zip el contenido de la capa:

------
#### [ Linux/macOS ]

   ```
   zip -r layer.zip nodejs/
   ```

------
#### [ PowerShell ]

   ```
   Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip
   ```

------

   La estructura de directorios del archivo .zip debería ser similar a la siguiente:

   ```
   nodejs/              
   └── node_modules/
       └── validator/
           ├── package.json
           └── index.mjs
   ```

1. En su función, importe y utilice los módulos. Ejemplo:

   ```
   import { validateOrder, formatResponse } from 'validator';
   
   export const handler = async (event) => {
     try {
       // Parse the order data from the event body
       const orderData = JSON.parse(event.body || '{}');
       
       // Validate and format the order
       const validatedOrder = validateOrder(orderData);
       
       return formatResponse(200, {
         message: 'Order validated successfully',
         order: validatedOrder
       });
     } catch (error) {
       if (error instanceof Error && error.message.includes('Missing required fields')) {
         return formatResponse(400, {
           error: error.message
         });
       }
       
       return formatResponse(500, {
         error: 'Internal server error'
       });
     }
   };
   ```

   Puede usar el siguiente [evento de prueba](testing-functions.md#invoke-with-event) para invocar la función:

   ```
   {
       "body": "{\"productId\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}"
   }
   ```

   Respuesta esperada:

   ```
   {
     "statusCode": 200,
     "body": "{\"message\":\"Order validated successfully\",\"order\":{\"productId\":\"ABC123\",\"quantity\":2,\"shippingPriority\":\"express\"}}"
   }
   ```

## Creación de la capa en Lambda
<a name="publishing-layer"></a>

También puede publicar la capa con la AWS CLI o la consola de Lambda.

------
#### [ AWS CLI ]

Ejecute el comando [publish-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-layer-version.html) de la AWS CLI para crear la capa de Lambda:

```
aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes nodejs24.x
```

El parámetro [Tiempos de ejecución compatibles](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes) es opcional. Cuando se especifica, Lambda usa este parámetro para filtrar las capas en la consola de Lambda.

------
#### [ Console ]

**Para crear una capa (consola)**

1. Abra la página de [Capas](https://console.aws.amazon.com/lambda/home#/layers) de la consola de Lambda.

1. Elija **Crear capa**.

1. Elija **Cargar un archivo .zip** y, a continuación, cargue el archivo .zip que creó anteriormente.

1. (Opcional) En **Tiempos de ejecución compatibles**, elija el tiempo de ejecución de Node.js que corresponda a la versión de Node.js que utilizó para crear la capa.

1. Seleccione **Crear**.

------

## Adición de la capa a la función
<a name="nodejs-layer-adding"></a>

------
#### [ AWS CLI ]

Para adjuntar la capa a la función, ejecute el comando [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) de la AWS CLI. Para el parámetro `--layers`, use el ARN de la capa. El ARN debe especificar la versión (por ejemplo, `arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1`). Para obtener más información, consulte [Capas y versiones de capas](chapter-layers.md#lambda-layer-versions).

```
aws lambda update-function-configuration --function-name my-function --cli-binary-format raw-in-base64-out --layers "arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1"
```

La opción **cli-binary-format** es obligatoria si va a utilizar la versión 2 de la AWS CLI. Para que esta sea la configuración predeterminada, ejecute `aws configure set cli-binary-format raw-in-base64-out`. Para obtener más información, consulte [Opciones de la línea de comandos globales compatibles con AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) en la *Guía del usuario de la AWS Command Line Interface versión 2*.

------
#### [ Console ]

**Adición de una capa a una función**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija la función.

1. Desplácese hacia abajo hasta la sección **Capas** y, a continuación, elija **Agregar una capa**.

1. En **Elija una capa**, seleccione **Capas personalizadas** y, a continuación, elija su capa.
**nota**  
Si no agregó un [tiempo de ejecución compatible](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes) al crear la capa, su capa no aparecerá aquí. Puede especificar el ARN de la capa en su lugar.

1. Elija **Agregar**.

------

## Aplicación de ejemplo
<a name="nodejs-layer-sample-app"></a>

Para ver más ejemplos de cómo usar las capas de Lambda, consulte la aplicación de ejemplo [layer-nodejs](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/layer-nodejs) en el repositorio de GitHub de la Guía para desarrolladores de AWS Lambda. Esta aplicación incluye una capa que contiene la biblioteca [lodash](https://www.npmjs.com/package/lodash). Después de crear la capa, puede implementar e invocar las funciones correspondientes para confirmar que la capa funciona como se espera.

# Uso del objeto de contexto Lambda para recuperar la información de la función Node.js
<a name="nodejs-context"></a>

Cuando Lambda ejecuta su función, pasa un objeto context al [controlador](nodejs-handler.md). Este objeto proporciona métodos y propiedades que facilitan información acerca de la invocación, la función y el entorno de ejecución.

**Métodos de context**
+ `getRemainingTimeInMillis()`: devuelve el número de milisegundos que quedan antes del tiempo de espera de la ejecución.

**Propiedades de context**
+ `functionName`: el nombre de la función de Lambda.
+ `functionVersion`: la [versión](configuration-versions.md) de la función.
+ `invokedFunctionArn`: el nombre de recurso de Amazon (ARN) que se utiliza para invocar esta función. Indica si el invocador especificó un número de versión o alias.
+ `memoryLimitInMB`: cantidad de memoria asignada a la función.
+ `awsRequestId`: el identificador de la solicitud de invocación.
+ `logGroupName`: grupo de registros de para la función.
+ `logStreamName`: el flujo de registro de la instancia de la función.
+ `identity`: (aplicaciones móviles) Información acerca de la identidad de Amazon Cognito que autorizó la solicitud.
  + `cognitoIdentityId`: la identidad autenticada de Amazon Cognito.
  + `cognitoIdentityPoolId`: el grupo de identidad de Amazon Cognito que ha autorizado la invocación.
+ `clientContext`: (aplicaciones móviles) Contexto de cliente proporcionado a Lambda por la aplicación cliente.
  + `client.installation_id`
  + `client.app_title`
  + `client.app_version_name`
  + `client.app_version_code`
  + `client.app_package_name`
  + `env.platform_version`
  + `env.platform`
  + `env.make`
  + `env.model`
  + `env.locale`
  + `custom`: valores personalizados que establece la aplicación del cliente. 
+ `callbackWaitsForEmptyEventLoop`: de forma predeterminada (`true`), cuando se utiliza un controlador de funciones basado en la devolución de llamada, Lambda espera a que el bucle de eventos esté vacío una vez ejecutada la devolución de llamada antes de finalizar la invocación de la función. Establézcalo en `false` para enviar la respuesta y finalizar la invocación de forma inmediata después de la ejecución de la devolución de llamada, en lugar de esperar a que el bucle de eventos esté vacío. Los eventos pendientes seguirán ejecutándose durante la siguiente invocación. Tenga en cuenta que Lambda solo admite controladores de funciones basados en la devolución de llamada para Node.js 22 y tiempos de ejecución anteriores.

La siguiente función de ejemplo registra información de contexto y devuelve la ubicación de los registros.

**Example Archivo index.js**  

```
exports.handler = async function(event, context) {
  console.log('Remaining time: ', context.getRemainingTimeInMillis())
  console.log('Function name: ', context.functionName)
  return context.logStreamName
}
```

# Registro y supervisión de las funciones de Lambda de Node.js
<a name="nodejs-logging"></a>

AWS Lambda supervisa automáticamente funciones de Lambda en su nombre y envía registros a Amazon CloudWatch. Su función de Lambda viene con un grupo de registros de Registros de CloudWatch y con un flujo de registro para cada instancia de su función. El entorno de tiempo de ejecución de Lambda envía detalles sobre cada invocación al flujo de registro y retransmite los registros y otras salidas desde el código de la función. Para obtener más información, consulte [Envío de registros de funciones de Lambda a Registros de CloudWatch](monitoring-cloudwatchlogs.md).

Esta página describe cómo producir resultados de registro a partir del código de la función de Lambda o registros de acceso mediante AWS Command Line Interface, la consola de Lambda o la consola de CloudWatch.

**Topics**
+ [

## Crear una función que devuelve registros
](#node-logging-output)
+ [

## Uso de controles de registro avanzados de Lambda con Node.js
](#node-js-logging-advanced)
+ [

## Visualización de los registros en la consola de Lambda
](#nodejs-logging-console)
+ [

## Visualización de los registros de en la consola de CloudWatch
](#nodejs-logging-cwconsole)
+ [

## Visualización de los registros mediante la AWS Command Line Interface (AWS CLI)
](#nodejs-logging-cli)
+ [

## Eliminación de registros
](#nodejs-logging-delete)

## Crear una función que devuelve registros
<a name="node-logging-output"></a>

Para generar registros desde el código de las funciones, puede utilizar los métodos del [objeto de la consola](https://developer.mozilla.org/en-US/docs/Web/API/Console) o cualquier biblioteca de registro que escriba en `stdout` o en `stderr`. En el siguiente ejemplo, se registran los valores de las variables de entorno y el objeto de evento.

**nota**  
Le recomendamos que utilice técnicas como la validación de entrada y la codificación de salida al registrar las entradas. Si registra los datos de entrada directamente, un atacante podría usar el código para dificultar la detección de la manipulación, falsificar las entradas de registro u omitir los monitores de registro. Para obtener más información, consulte [Neutralización incorrecta de los resultados de los registros](https://cwe.mitre.org/data/definitions/117.html) en *Eenumeración de puntos débiles comunes*. 

**Example Archivo index.js: registro**  

```
exports.handler = async function(event, context) {
  console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2))
  console.info("EVENT\n" + JSON.stringify(event, null, 2))
  console.warn("Event not processed.")
  return context.logStreamName
}
```

**Example formato de registro**  

```
START RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac Version: $LATEST
2019-06-07T19:11:20.562Z	c793869b-ee49-115b-a5b6-4fd21e8dedac	INFO	ENVIRONMENT VARIABLES
{
  "AWS_LAMBDA_FUNCTION_VERSION": "$LATEST",
  "AWS_LAMBDA_LOG_GROUP_NAME": "/aws/lambda/my-function",
  "AWS_LAMBDA_LOG_STREAM_NAME": "2019/06/07/[$LATEST]e6f4a0c4241adcd70c262d34c0bbc85c",
  "AWS_EXECUTION_ENV": "AWS_Lambda_nodejs12.x",
  "AWS_LAMBDA_FUNCTION_NAME": "my-function",
  "PATH": "/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin",
  "NODE_PATH": "/opt/nodejs/node10/node_modules:/opt/nodejs/node_modules:/var/runtime/node_modules",
  ...
}
2019-06-07T19:11:20.563Z	c793869b-ee49-115b-a5b6-4fd21e8dedac	INFO	EVENT
{
  "key": "value"
}
2019-06-07T19:11:20.564Z	c793869b-ee49-115b-a5b6-4fd21e8dedac	WARN	Event not processed.
END RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac
REPORT RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac	Duration: 128.83 ms	Billed Duration: 296 ms	Memory Size: 128 MB	Max Memory Used: 74 MB	Init Duration: 166.62 ms	XRAY TraceId: 1-5d9d007f-0a8c7fd02xmpl480aed55ef0	SegmentId: 3d752xmpl1bbe37e	Sampled: true
```

El tiempo de ejecución de Node.js registra las líneas `START`, `END` y `REPORT` de cada invocación. Se agrega una marca de tiempo, un ID de solicitud y el nivel de registro en cada entrada registrada por la función. La línea del informe proporciona los siguientes detalles.

**Campos de datos de línea REPORT**
+ **RequestId**: el ID de solicitud único para la invocación.
+ **Duración**: la cantidad de tiempo que el método de controlador de función pasó procesando el evento.
+ **Duración facturada**: la cantidad de tiempo facturado por la invocación.
+ **Tamaño de memoria**: la cantidad de memoria asignada a la función.
+ **Máximo de memoria usada**: la cantidad de memoria utilizada por la función. Cuando las invocaciones comparten un entorno de ejecución, Lambda informa de la memoria máxima utilizada en todas las invocaciones. Este comportamiento puede dar como resultado un valor notificado superior al esperado.
+ **Duración de inicio**: para la primera solicitud servida, la cantidad de tiempo que tardó el tiempo de ejecución en cargar la función y ejecutar código fuera del método del controlador.
+ **TraceId de XRAY**: para las solicitudes rastreadas, el [ID de seguimientode AWS X-Ray](services-xray.md).
+ **SegmentId**: para solicitudes rastreadas, el ID del segmento de X-Ray.
+ **Muestras**: para solicitudes rastreadas, el resultado del muestreo.

Puede ver los registros en la consola de Lambda o en la de Registros de CloudWatch, o bien en la línea de comandos.

## Uso de controles de registro avanzados de Lambda con Node.js
<a name="node-js-logging-advanced"></a>

Para tener más control sobre cómo se capturan, procesan y consumen los registros de sus funciones, puede configurar las siguientes opciones de registro para los tiempos de ejecución de Node.js compatibles:
+ **Formato de registro**: seleccione entre texto sin formato y el formato JSON estructurado para los registros de su función
+ **Nivel de registro**: para los registros en formato JSON, elija el nivel de detalle de los registros que Lambda envía a Amazon CloudWatch, como ERROR, DEBUG o INFO
+ **Grupo de registro**: elija el grupo de registro de CloudWatch al que su función envía los registros

Para obtener más información sobre estas opciones de registro e instrucciones sobre cómo configurar la función para utilizarlas, consulte [Configuración de controles de registro avanzados para las funciones de Lambda](monitoring-logs.md#monitoring-cloudwatchlogs-advanced).

Para usar las opciones de formato y nivel de registro con las funciones de Lambda de Node.js, consulte las instrucciones de las siguientes secciones.

### Uso de registros JSON estructurados con Node.js
<a name="nodejs-logging-advanced-JSON"></a>

Si selecciona JSON para el formato de registro de la función, Lambda enviará los registros que obtenga mediante los métodos consola `console.trace`, `console.debug`, `console.log`, `console.info`, `console.error` y `console.warn` a CloudWatch como JSON estructurado. Cada objeto de registro JSON contiene, por lo menos, cuatro pares clave-valor con las siguientes claves:
+ `"timestamp"`: la hora en que se generó el mensaje de registro
+ `"level"`: el nivel de registro asignado al mensaje
+ `"message"`: el contenido del mensaje de registro
+ `"requestId"`: el ID de solicitud único para la invocación de la función

Según el método de registro que use la función, este objeto JSON también puede contener pares de claves adicionales. Por ejemplo, si la función usa métodos `console` para registrar objetos de error con varios argumentos, el objeto JSON contendrá pares clave-valor adicionales junto con las claves `errorMessage`, `errorType`, y `stackTrace`.

Si su código ya usa otra biblioteca de registro, como Powertools para AWS Lambda, para producir registros JSON estructurados, no necesita realizar ningún cambio. Lambda no codifica dos veces ningún registro que ya esté codificado en JSON, por lo que los registros de la aplicación de su función seguirán capturándose como antes.

Para obtener más información sobre el uso del paquete de registro de Powertools para AWS Lambda a fin de crear registros JSON estructurados en el tiempo de ejecución de Node.js, consulte [Registro y supervisión de las funciones de Lambda de TypeScript](typescript-logging.md).

#### Ejemplo de salidas de registro con formato JSON
<a name="nodejs-logging-examples"></a>

En los siguientes ejemplos, se muestra cómo se capturan en Registros de CloudWatch varias salidas de registro generadas con los métodos `console` con argumentos únicos y múltiples cuando se establece el formato de registro de la función en JSON.

En el primer ejemplo, se usa el método `console.error` para generar una cadena sencilla.

**Example Código de registro de Node.js**  

```
export const handler = async (event) => {
  console.error("This is a warning message");
  ...
}
```

**Example Entrada de registro JSON**  

```
{
    "timestamp":"2025-11-01T00:21:51.358Z",
    "level":"ERROR",
    "message":"This is a warning message",
    "requestId":"93f25699-2cbf-4976-8f94-336a0aa98c6f"
}
```

También se pueden generar mensajes de registro estructurados de manera más compleja mediante argumentos únicos o múltiples con los métodos `console`. En el siguiente ejemplo, se usa `console.log` para generar dos pares clave-valor con un único argumento. Tenga en cuenta que el campo `"message"` del objeto JSON que Lambda envía a Registros de CloudWatch no se representa en forma de cadena.

**Example Código de registro de Node.js**  

```
export const handler = async (event) => {
  console.log({data: 12.3, flag: false});
  ...
}
```

**Example Entrada de registro JSON**  

```
{
    "timestamp": "2025-12-08T23:21:04.664Z",
    "level": "INFO",
    "requestId": "405a4537-9226-4216-ac59-64381ec8654a",
    "message": {
        "data": 12.3,
        "flag": false
    }
}
```

En el siguiente ejemplo, se volverá a usar el método `console.log` para crear una salida de registro. Esta vez, el método utiliza dos argumentos: un mapa que contiene dos pares clave-valor y una cadena de identificación. Tenga en cuenta que, en este caso, dado que se proporcionaron dos argumentos, Lambda representa el campo `"message"` en forma de cadena.

**Example Código de registro de Node.js**  

```
export const handler = async (event) => {
  console.log('Some object - ', {data: 12.3, flag: false});
  ...
}
```

**Example Entrada de registro JSON**  

```
{
    "timestamp": "2025-12-08T23:21:04.664Z",
    "level": "INFO",
    "requestId": "405a4537-9226-4216-ac59-64381ec8654a",
    "message": "Some object -  { data: 12.3, flag: false }"
}
```

Lambda asigna a las salidas generadas mediante `console.log` el nivel de registro INFO.

En el último ejemplo, se muestra cómo los objetos de error se pueden enviar a Registros de CloudWatch mediante los métodos `console`. Tenga en cuenta que, cuando registra objetos de error con varios argumentos, Lambda agrega los campos `errorMessage`, `errorType` y `stackTrace` a la salida del registro.

**Example Código de registro de Node.js**  

```
export const handler = async (event) => {
  let e1 = new ReferenceError("some reference error");
  let e2 = new SyntaxError("some syntax error");
  console.log(e1);
  console.log("errors logged - ", e1, e2);
};
```

**Example Entrada de registro JSON**  

```
{
    "timestamp": "2025-12-08T23:21:04.632Z",
    "level": "INFO",
    "requestId": "405a4537-9226-4216-ac59-64381ec8654a",
    "message": {
        "errorType": "ReferenceError",
        "errorMessage": "some reference error",
        "stackTrace": [
            "ReferenceError: some reference error",
            "    at Runtime.handler (file:///var/task/index.mjs:3:12)",
            "    at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1173:29)"
        ]
    }
}

{
    "timestamp": "2025-12-08T23:21:04.646Z",
    "level": "INFO",
    "requestId": "405a4537-9226-4216-ac59-64381ec8654a",
    "message": "errors logged -  ReferenceError: some reference error\n    at Runtime.handler (file:///var/task/index.mjs:3:12)\n    at Runtime.handleOnceNonStreaming 
    (file:///var/runtime/index.mjs:1173:29) SyntaxError: some syntax error\n    at Runtime.handler (file:///var/task/index.mjs:4:12)\n    at Runtime.handleOnceNonStreaming 
    (file:///var/runtime/index.mjs:1173:29)",
    "errorType": "ReferenceError",
    "errorMessage": "some reference error",
    "stackTrace": [
        "ReferenceError: some reference error",
        "    at Runtime.handler (file:///var/task/index.mjs:3:12)",
        "    at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1173:29)"
    ]
}
```

Al registrar varios tipos de error, los campos adicionales `errorMessage`, `errorType` y `stackTrace` se extraen del primer tipo de error suministrado al método `console`.

### Uso de bibliotecas cliente de formato de métricas integradas (EMF) con registros JSON estructurados
<a name="nodejs-logging-advanced-emf"></a>

AWS proporciona bibliotecas cliente de código abierto para Node.js que puede utilizar para crear registros de [formato de métricas integradas](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Libraries.html) (EMF). Si tiene ya tiene funciones que utilizan estas bibliotecas y cambia el formato de registro de la función a JSON, es posible que CloudWatch deje de reconocer las métricas emitidas por el código.

Si, en este momento, su código emite registros EMF directamente con `console.log` o Powertools para AWS Lambda (TypeScript), CloudWatch tampoco podrá analizarlos si cambia el formato de registro de la función a JSON.

**importante**  
Para asegurarse de que CloudWatch siga analizando correctamente los registros de EMF de sus funciones, actualice sus bibliotecas de [EMF](https://www.npmjs.com/package/aws-embedded-metrics) y [Powertools para AWS Lambda](https://github.com/aws-powertools/powertools-lambda-typescript) a las versiones más recientes. Si cambia al formato de registro JSON, también le recomendamos que realice pruebas para garantizar la compatibilidad con las métricas integradas de su función. Si su código emite registros de EMF directamente con `console.log`, cámbielo para que genere esas métricas de forma directa a `stdout`, como se muestra en el siguiente ejemplo de código.

**Example Código que emite métricas integradas a `stdout`**  

```
process.stdout.write(JSON.stringify(
    {
        "_aws": {
            "Timestamp": Date.now(),
            "CloudWatchMetrics": [{
                "Namespace": "lambda-function-metrics",
                "Dimensions": [["functionVersion"]],
                "Metrics": [{
                    "Name": "time",
                    "Unit": "Milliseconds",
                    "StorageResolution": 60
                }]
            }]
        },
        "functionVersion": "$LATEST",
        "time": 100,
        "requestId": context.awsRequestId
    }
) + "\n")
```

### Uso del filtrado a nivel de registro con Node.js
<a name="nodejs-logging-advanced-level"></a>

Para que AWS Lambda filtre los registros de las aplicaciones según su nivel de registro, la función debe usar registros con formato JSON. Puede lograr esto de dos maneras:
+ Cree salidas de registro con los métodos consola estándar y configure su función para que utilice el formato de registro JSON. A continuación, AWS Lambda filtra las salidas de registro con el par clave-valor “nivel” del objeto JSON descrito en [Uso de registros JSON estructurados con Node.js](#nodejs-logging-advanced-JSON). Para obtener información sobre cómo configurar el formato de registro de la función, consulte [Configuración de controles de registro avanzados para las funciones de Lambda](monitoring-logs.md#monitoring-cloudwatchlogs-advanced).
+ Utilice otra biblioteca o método de registro para crear registros estructurados en JSON en su código que incluyan un par clave-valor “nivel” que defina el nivel de la salida del registro. Por ejemplo, puede utilizar Powertools para AWS Lambda con el objetivo de generar salidas de registros JSON estructurados a partir de su código. Consulte [Registro y supervisión de las funciones de Lambda de TypeScript](typescript-logging.md) para obtener más información sobre el uso de Powertools con el tiempo de ejecución de Node.js.

  Para que Lambda filtre los registros de la función, también debe incluir un par clave-valor `"timestamp"` en la salida del registro JSON. La hora debe especificarse con un formato de marca de tiempo [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) válido. Si no proporciona una marca de tiempo válida, Lambda asignará al registro el nivel INFO y agregará una marca de tiempo por usted.

Cuando configura la función para que utilice el filtrado a nivel de registro, selecciona el nivel de registros que desea que AWS Lambda envíe a Registros de Amazon CloudWatch de las siguientes opciones:


| Nivel de registro | Uso estándar | 
| --- | --- | 
| TRACE (más detallado) | La información más detallada que se utiliza para rastrear la ruta de ejecución del código | 
| DEBUG | Información detallada para la depuración del sistema | 
| INFO | Mensajes que registran el funcionamiento normal de su función | 
| WARN | Mensajes sobre posibles errores que pueden provocar un comportamiento inesperado si no se abordan | 
| ERROR | Mensajes sobre problemas que impiden que el código funcione según lo esperado | 
| FATAL (menos detallado) | Mensajes sobre errores graves que hacen que la aplicación deje de funcionar | 

Lambda envía los registros del nivel seleccionado y en un nivel inferior a CloudWatch. Por ejemplo, si configura un nivel de registro de WARN, Lambda enviará los registros correspondientes a los niveles WARN, ERROR y FATAL.

## Visualización de los registros en la consola de Lambda
<a name="nodejs-logging-console"></a>

Puede utilizar la consola de Lambda para ver la salida del registro después de invocar una función de Lambda.

Si su código se puede probar desde el editor de **código** integrado, encontrará los registros en los **resultados de ejecución**. Cuando utilice la característica de prueba de la consola para invocar una función, encontrará la **Salida de registro** en la sección de **Detalles**.

## Visualización de los registros de en la consola de CloudWatch
<a name="nodejs-logging-cwconsole"></a>

Puede utilizar la consola Amazon CloudWatch para ver los registros de todas las invocaciones de funciones de Lambda.

**Visualización de los registros en la consola CloudWatch**

1. En la consola de CloudWatch, abra la [página de grupos de registro](https://console.aws.amazon.com/cloudwatch/home?#logs:).

1. Seleccione el grupo de registros para su función (**/aws/lambda/*your-function-name***).

1. Elija una secuencia de registro.

Cada flujo de registro se corresponde con una [instancia de su función](lambda-runtime-environment.md). Aparece un flujo de registro cuando actualiza la función de Lambda y cuando se crean instancias adicionales para gestionar invocaciones simultáneas. Para encontrar registros para una invocación específica, le recomendamos que interfiera su función con AWS X-Ray. X-Ray registra los detalles sobre la solicitud y el flujo de registro en el seguimiento.

## Visualización de los registros mediante la AWS Command Line Interface (AWS CLI)
<a name="nodejs-logging-cli"></a>

La AWS CLI es una herramienta de código abierto que lo habilita para interactuar con los servicios de AWS mediante el uso de comandos en el intérprete de comandos de la línea de comandos. Para completar los pasos de esta sección, debe disponer de la [versión 2 de la AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Puede utilizar la [CLI de AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) para recuperar registros de una invocación mediante la opción de comando `--log-type`. La respuesta contiene un campo `LogResult` que contiene hasta 4 KB de registros con codificación base64 a partir de la invocación.

**Example recuperar un ID de registro**  
En el ejemplo siguiente se muestra cómo recuperar un *ID de registro* del campo `LogResult` para una función denominada `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
Debería ver los siguientes datos de salida:  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example decodificar los registros**  
En el mismo símbolo del sistema, utilice la utilidad `base64` para decodificar los registros. En el ejemplo siguiente se muestra cómo recuperar registros codificados en base64 para `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
La opción **cli-binary-format** es obligatoria si va a utilizar la versión 2 de la AWS CLI. Para que esta sea la configuración predeterminada, ejecute `aws configure set cli-binary-format raw-in-base64-out`. Para obtener más información, consulte [Opciones de la línea de comandos globales compatibles con AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) en la *Guía del usuario de la AWS Command Line Interface versión 2*.  
Debería ver los siguientes datos de salida:  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
La utilidad `base64` está disponible en Linux, macOS y [Ubuntu en Windows](https://docs.microsoft.com/en-us/windows/wsl/install-win10). Es posible que los usuarios de macOS necesiten usar `base64 -D`.

**Example get-logs.sh script**  
En el mismo símbolo del sistema, utilice el siguiente script para descargar los últimos cinco eventos de registro. El script utiliza `sed` para eliminar las comillas del archivo de salida y permanece inactivo durante 15 segundos para dar tiempo a que los registros estén disponibles. La salida incluye la respuesta de Lambda y la salida del comando `get-log-events`.   
Copie el contenido de la siguiente muestra de código y guárdelo en su directorio de proyecto Lambda como `get-logs.sh`.  
La opción **cli-binary-format** es obligatoria si va a utilizar la versión 2 de la AWS CLI. Para que esta sea la configuración predeterminada, ejecute `aws configure set cli-binary-format raw-in-base64-out`. Para obtener más información, consulte [Opciones de la línea de comandos globales compatibles con AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) en la *Guía del usuario de la AWS Command Line Interface versión 2*.  

```
#!/bin/bash
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out
sed -i'' -e 's/"//g' out
sleep 15
aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name stream1 --limit 5
```

**Example macOS y Linux (solamente)**  
En el mismo símbolo del sistema, es posible que los usuarios de macOS y Linux necesiten ejecutar el siguiente comando para asegurarse de que el script es ejecutable.  

```
chmod -R 755 get-logs.sh
```

**Example recuperar los últimos cinco eventos de registro**  
En el mismo símbolo del sistema, ejecute el siguiente script para obtener los últimos cinco eventos de registro.  

```
./get-logs.sh
```
Debería ver los siguientes datos de salida:  

```
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{
    "events": [
        {
            "timestamp": 1559763003171,
            "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n",
            "ingestionTime": 1559763003309
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r  \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r  \"key\": \"value\"\r}\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n",
            "ingestionTime": 1559763018353
        }
    ],
    "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795",
    "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080"
}
```

## Eliminación de registros
<a name="nodejs-logging-delete"></a>

Los grupos de registro no se eliminan automáticamente cuando se elimina una función. Para evitar almacenar registros indefinidamente, elimine el grupo de registros o [configure un periodo de retención](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#SettingLogRetention) después de lo cual los registros se eliminan automáticamente.

# Instrumentación del código Node.js en AWS Lambda
<a name="nodejs-tracing"></a>

Lambda se integra con AWS X-Ray para permitirle seguir, depurar y optimizar aplicaciones de Lambda. Puede utilizar X-Ray para seguir una solicitud mientras atraviesa los recursos de la aplicación, que pueden incluir funciones de Lambda y otros servicios de AWS.

Para enviar datos de seguimiento a X-Ray, puede utilizar una de estas dos bibliotecas de SDK:
+ [AWS Distro for OpenTelemetry (ADOT)](https://aws.amazon.com/otel): distribución segura, lista para producción y con soporte de AWS del OpenTelemetry (OTel) SDK.
+ [AWS X-Ray SDK para Node.js](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs.html) – un SDK para generar y enviar datos de seguimiento a X-Ray.

Cada uno de los SDK ofrecen formas de enviar los datos de telemetría al servicio X-Ray. Tras ello, se puede utilizar X-Ray para consultar, filtrar y obtener información sobre las métricas de rendimiento de la aplicación con el fin de identificar problemas y oportunidades de optimización.

**importante**  
Los SDK de X-Ray y Powertools para AWS Lambda son parte de una solución de instrumentación completamente integrada que ofrece AWS. Las capas Lambda de ADOT forman parte de un estándar que abarca todo el sector para la instrumentación de seguimiento que recopila más datos en general, pero es posible que no sean adecuadas para todos los casos de uso. Puede implementar el seguimiento integral en X-Ray con cualquiera de las soluciones. Para obtener más información sobre cuál elegir, consulte [Elegir entre SDK de AWS Distro para OpenTelemetry y X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/xray-instrumenting-your-app.html#xray-instrumenting-choosing).

**Topics**
+ [

## Uso de ADOT para instrumentar las funciones de Node.js
](#nodejs-adot)
+ [

## Uso del SDK de X-Ray para instrumentar las funciones de Node.js
](#nodejs-xray-sdk)
+ [

## Activación del seguimiento con la consola de Lambda
](#nodejs-tracing-console)
+ [

## Activación del seguimiento con la API de Lambda
](#nodejs-tracing-api)
+ [

## Activación del seguimiento con CloudFormation
](#nodejs-tracing-cloudformation)
+ [

## Interpretación de un seguimiento de X-Ray
](#nodejs-tracing-interpretation)
+ [

## Almacenamiento de dependencias de tiempo de ejecución en una capa (X-Ray SDK)
](#nodejs-tracing-layers)

## Uso de ADOT para instrumentar las funciones de Node.js
<a name="nodejs-adot"></a>

ADOT proporciona [capas](chapter-layers.md) de Lambda completamente administradas que empaquetan todo lo necesario para recopilar datos de telemetría mediante el OTel SDK. Utilizando esta capa, se pueden instrumentar las funciones de Lambda sin tener que modificar el código de ninguna función. También se puede configurar la capa para que realice una inicialización personalizada de OTel. Para obtener más información, consulte [Configuración personalizada del recopilador de ADOT en Lambda](https://aws-otel.github.io/docs/getting-started/lambda#custom-configuration-for-the-adot-collector-on-lambda) en la documentación de ADOT.

Para los tiempos de ejecución de Node.js, puede agregar la **capa de Lambda administrada por AWS para ADOT Javascript** a fin de instrumentar de forma automática las funciones. Para obtener instrucciones detalladas sobre cómo agregar esta capa, consulte [Soporte de Lambda de AWS Distro for OpenTelemetry para JavaScript](https://aws-otel.github.io/docs/getting-started/lambda/lambda-js) en la documentación de ADOT.

## Uso del SDK de X-Ray para instrumentar las funciones de Node.js
<a name="nodejs-xray-sdk"></a>

Para registrar detalles sobre las llamadas que realiza la función Lambda a otros recursos de la aplicación, también se puede utilizar el AWS X-Ray SDK para Node.js. Para obtener el SDK, agregue el paquete `aws-xray-sdk-core` a las dependencias de la aplicación.

**Example [blank-nodejs/package.json](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/package.json)**  

```
{
  "name": "blank-nodejs",
  "version": "1.0.0",
  "private": true,
  "devDependencies": {
    "jest": "29.7.0"
  },
  "dependencies": {
    "@aws-sdk/client-lambda": "3.345.0",
    "aws-xray-sdk-core": "3.5.3"
  },
  "scripts": {
    "test": "jest"
  }
}
```

Para instrumentar los clientes del AWS SDK en la [AWS SDK para JavaScriptversión 3](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html), empaquete la instancia del cliente con el método `captureAWSv3Client`.

**Example [blank-nodejs/function/index.js](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/function/index.js): seguimiento de un cliente SDK de AWS.**  

```
const AWSXRay = require('aws-xray-sdk-core');
const { LambdaClient, GetAccountSettingsCommand } = require('@aws-sdk/client-lambda');

// Create client outside of handler to reuse
const lambda = AWSXRay.captureAWSv3Client(new LambdaClient());

// Handler
exports.handler = async function(event, context) {
    event.Records.forEach(record => {
  ...
```

El tiempo de ejecución de Lambda establece algunas variables de entorno para configurar el SDK de X-Ray. Por ejemplo, Lambda establece `AWS_XRAY_CONTEXT_MISSING` para `LOG_ERROR` a fin de evitar arrojar errores de tiempo de ejecución desde el SDK de X-Ray. Para establecer una estrategia de falta de contexto personalizada, invalide la variable de entorno en la configuración de la función para que no tenga valor y, a continuación, puede establecer la estrategia de falta de contexto mediante programación.

**Example Ejemplo de código de inicialización**  

```
const AWSXRay = require('aws-xray-sdk-core');

// Configure the context missing strategy to do nothing
AWSXRay.setContextMissingStrategy(() => {});
```

Para obtener más información, consulte [Trabajar con variables de entorno de Lambda](configuration-envvars.md).

Una vez agregadas las dependencias correctas y realizados los cambios de código necesarios, active el seguimiento en la configuración de la función mediante la consola de Lambda o la API.

## Activación del seguimiento con la consola de Lambda
<a name="nodejs-tracing-console"></a>

Para activar el seguimiento activo de la función Lambda mediante la consola, siga estos pasos:

**Cómo activar el seguimiento activo**

1. Abra la [página de Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija una función.

1. Elija **Configuration** (Configuración), y luego **Monitoring and operations tools** (Herramientas de supervisión y operaciones).

1. En **Herramientas de monitorización adicionales**, elija **Editar**.

1. En **CloudWatch Application Signals y AWS X-Ray**, seleccione **Habilitar** para **Seguimientos de servicios de Lambda**.

1. Seleccione **Save**.

## Activación del seguimiento con la API de Lambda
<a name="nodejs-tracing-api"></a>

Configure el rastreo en la función Lambda con AWS CLI o SDK de AWS, utilice las siguientes operaciones de API:
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)

El siguiente comando de ejemplo de la AWS CLI habilita el seguimiento activo en una función llamada **my-function**.

```
aws lambda update-function-configuration --function-name my-function \
--tracing-config Mode=Active
```

El modo de seguimiento forma parte de la configuración específica de la versión, cuando se publica una versión de la función. No se puede cambiar el modo de seguimiento de una versión publicada.

## Activación del seguimiento con CloudFormation
<a name="nodejs-tracing-cloudformation"></a>

Para activar el seguimiento en un recurso de `AWS::Lambda::Function` de una plantilla de CloudFormation, utilice la propiedad `TracingConfig`.

**Example [función-inline.yml](https://github.com/awsdocs/aws-lambda-developer-guide/blob/master/templates/function-inline.yml): configuración de rastreo**  

```
Resources:
  function:
    Type: [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)
    Properties:
      TracingConfig:
        Mode: Active
      ...
```

Para un recurso AWS Serverless Application Model de AWS SAM (`AWS::Serverless::Function`) , utilice la propiedad `Tracing`.

**Example [template.yml](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/template.yml): configuración de rastreo**  

```
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Tracing: Active
      ...
```

## Interpretación de un seguimiento de X-Ray
<a name="nodejs-tracing-interpretation"></a>

La función necesita permiso para cargar datos de rastreo en X-Ray. Cuando activa el rastreo activo en la consola de Lambda, Lambda agrega los permisos necesarios al [rol de ejecución](lambda-intro-execution-role.md) de la función. De lo contrario, agregue la política [AWSXRayDaemonWriteAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess) al rol de ejecución.

Después de configurar el seguimiento activo, se pueden observar solicitudes específicas a través de la aplicación. El [gráfico de servicios de X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html#xray-concepts-servicegraph) muestra información sobre la aplicación y todos sus componentes. En el siguiente ejemplo, se muestra una aplicación con dos funciones. La función principal procesa eventos y, a veces, devuelve errores. La segunda función de la cadena procesa los errores que aparecen en el primer grupo de registros y utiliza el SDK de AWS para llamar a X-Ray, Amazon Simple Storage Service (Amazon S3) y Registros de Amazon CloudWatch.

![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/sample-errorprocessor-servicemap.png)


X-Ray no sigue todas las solicitudes realizadas a la aplicación. X-Ray aplica un algoritmo de muestreo para garantizar que el seguimiento sea eficiente, a la vez que proporciona una muestra representativa de todas las solicitudes. La tasa de muestreo es 1 solicitud por segundo y un 5 por ciento de las solicitudes adicionales. La frecuencia de muestreo de X-Ray no se puede configurar para las funciones.

En X-Ray, un *seguimiento* registra información sobre una solicitud procesada por uno o varios *servicios*. Lambda registra 2 segmentos por seguimiento, lo que crea dos nodos en el gráfico de servicios. La siguiente imagen resalta estos dos nodos:

![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/xray-servicemap-function.png)


El primer nodo, situado a la izquierda, representa el servicio de Lambda, que recibe la solicitud de invocación. El segundo nodo representa la función Lambda específica. En el siguiente ejemplo, se muestra un seguimiento con estos dos segmentos. Ambos se denominan **my-function**, pero uno tiene un origen de `AWS::Lambda` y el otro tiene origen de `AWS::Lambda::Function`. Si el segmento `AWS::Lambda` muestra un error, el servicio Lambda tuvo un problema. Si el segmento `AWS::Lambda::Function` muestra un error, la función tuvo un problema.

![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/V2_sandbox_images/my-function-2-v1.png)


En este ejemplo, el segmento `AWS::Lambda::Function` aparece ampliado para mostrar los tres subsegmentos.

**nota**  
AWS está implementando cambios en el servicio Lambda. Debido a estos cambios, es posible que vea pequeñas diferencias entre la estructura y el contenido de los mensajes de registro del sistema y los segmentos de rastro emitidos por diferentes funciones de Lambda en su Cuenta de AWS.  
El rastro de ejemplo que se muestra aquí ilustra el segmento de función de estilo antiguo. Las diferencias entre los segmentos de estilo antiguo y nuevo se describen en los párrafos siguientes.  
Estos cambios se implementarán en las próximas semanas y todas las funciones de todas las Regiones de AWS, excepto en las regiones de China y GovCloud, pasarán a utilizar el nuevo formato de mensajes de registro y segmentos de rastro.

El segmento de función de estilo antiguo contiene los siguientes subsegmentos:
+ **Inicialización**: representa el tiempo dedicado a cargar la función y ejecutar el [código de inicialización](foundation-progmodel.md). Este subsegmento aparece únicamente para el primer evento que procesa cada instancia de la función.
+ **Invocación**: representa el tiempo dedicado a ejecutar el código del controlador.
+ **Sobrecarga**: representa el tiempo que el tiempo de ejecución de Lambda dedica a prepararse para gestionar el siguiente evento.

El segmento de función de estilo nuevo no contiene ningún subsegmento de `Invocation`. En cambio, los subsegmentos de clientes se adjuntan directamente al segmento de la función. Para obtener más información sobre la estructura de los segmentos de funciones de estilo antiguo y nuevo, consulte [Comprensión de los rastros](services-xray.md#services-xray-traces).

También puede instrumentar clientes HTTP, registrar consultas SQL y crear subsegmentos personalizados con anotaciones y metadatos. Para obtener más información, consulte [AWS X-Ray SDK para Node.js](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs.html) en la *Guía para desarrolladores de AWS X-Ray*.

**Precios**  
Puede utilizar el seguimiento de X-Ray de manera gratuita cada mes hasta un límite determinado como parte del nivel Gratuito de AWS. A partir de ese umbral, X-Ray realiza cargos por almacenamiento y recuperación del seguimiento. Para más información, consulte [Precios de AWS X-Ray](https://aws.amazon.com/xray/pricing/).

## Almacenamiento de dependencias de tiempo de ejecución en una capa (X-Ray SDK)
<a name="nodejs-tracing-layers"></a>

Si utiliza el X-Ray SDK para instrumentar el código de las funciones de los clientes del SDK de AWS, el paquete de implementación puede llegar a ser bastante grande. Para evitar que se carguen dependencias en tiempo de ejecución cada vez que se actualice el código de las funciones, empaquete el X-Ray SDK en una [capa de Lambda](chapter-layers.md).

El siguiente ejemplo muestra un recurso `AWS::Serverless::LayerVersion` que almacena el AWS X-Ray SDK para Node.js.

**Example [template.yml](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/template.yml): capa de dependencias.**  

```
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      CodeUri: function/.
      Tracing: Active
      Layers:
        - !Ref libs
      ...
  libs:
    Type: [AWS::Serverless::LayerVersion](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-layerversion.html)
    Properties:
      LayerName: blank-nodejs-lib
      Description: Dependencies for the blank sample app.
      ContentUri: lib/.
      CompatibleRuntimes:
        - nodejs24.x
```

Con esta configuración, solo se actualiza la capa de la biblioteca si se modifican las dependencias del tiempo de ejecución. Dado que el paquete de implementación de la función contiene únicamente el código, esto puede ayudar a reducir los tiempos de carga.

Para crear una capa de dependencias, es necesario realizar cambios en la compilación para generar el archivo de capas antes de la implementación. Para ver un ejemplo de trabajo, consulte la aplicación de ejemplo [blank-nodejs](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs) .