Uso de capas para funciones de Lambda en Node.js
Utilice capas de Lambda 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 o archivos de configuración. La creación de una capa implica tres pasos generales:
-
Empaquete el contenido de su capa. Esto significa crear un archivo de archivo. zip que contenga las dependencias que desea usar en sus funciones.
-
Cree la capa en Lambda.
-
Agregue la capa a sus funciones.
Temas
Empaquete el contenido de su capa.
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 22, use el tiempo de ejecución de Node.js 22 para su función.
-
El archivo .zip de su capa debe usar una de estas estructuras de directorios:
-
nodejs/node_modules
-
nodejs/node
(dondeX
/node_modulesX
es su versión de Node.js, por ejemplonode22
)
Para obtener más información, consulte Rutas de capa para cada tiempo de ejecución de Lambda.
-
-
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.
Creación de una capa con paquetes npm
-
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
o bcrypt), asegúrese de que sean compatibles con el entorno Lambda Linux y la arquitectura 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.
-
Comprima en formato zip el contenido de la capa:
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 connode_modules
en su interior. Esta estructura garantiza que Lambda pueda localizar e importar sus paquetes.-
npm utiliza los archivos
package.json
ypackage-lock.json
del directorionodejs/
para la administración de dependencias, pero Lambda no los requiere para la funcionalidad de las capas. Cada paquete instalado ya contiene su propio archivopackage.json
que define cómo Lambda importa el paquete.
Creación de una capa con su propio código
-
Cree la estructura del directorio necesario para su capa:
mkdir -p nodejs/node_modules/validator cd nodejs/node_modules/validator
-
Cree un archivo
package.json
para su módulo personalizado para definir cómo debe importarse:ejemplo nodejs/node_modules/validator/package.json
{ "name": "validator", "version": "1.0.0", "type": "module", "main": "index.mjs" }
-
Cree su archivo de módulo JavaScript:
ejemplo nodejs/node_modules/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) }; }
-
Comprima en formato zip el contenido de la capa:
La estructura de directorios del archivo .zip debería ser similar a la siguiente:
nodejs/ └── node_modules/ └── validator/ ├── package.json └── index.mjs
-
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 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
También puede publicar la capa con la AWS CLI o la consola de Lambda.
Adición de la capa a la función
Aplicación de ejemplo
Para ver más ejemplos de cómo usar las capas de Lambda, consulte la aplicación de ejemplo layer-nodejs