Trabalho com camadas para funções do Lambda com Node.js
Use camadas do Lambda para empacotar o código e as dependências que você quiser reutilizar em várias funções. As camadas geralmente contêm dependências de biblioteca, um runtime personalizado ou arquivos de configuração. A criação de uma camada envolve três etapas gerais:
-
Empacotar o conteúdo da sua camada. Isso significa criar um arquivo .zip contendo as dependências que você deseja usar em suas funções.
-
Criar a camada no Lambda.
-
Adicionar a camada às suas funções.
Tópicos
Empacotar o conteúdo da sua camada
Para criar uma camada, reúna os pacotes em um arquivo .zip que atenda aos seguintes requisitos:
-
Crie a camada usando a mesma versão do Node.js que você planeja usar para a função do Lambda. Por exemplo, se você compilar a camada usando o Node.js 22, use o runtime do Node.js 22 para a função.
-
O arquivo .zip da camada deve usar uma destas estruturas de diretório:
-
nodejs/node_modules
-
nodejs/node
(em queX
/node_modulesX
é a versão do Node.js, comonode22
)
Para obter mais informações, consulte Caminhos da camada para cada runtime do Lambda.
-
-
Os pacotes da camada devem ser compatíveis com o Linux. As funções do Lambda são executadas no Amazon Linux.
-
Se a sua camada incluir binários nativos ou arquivos executáveis, estes deverão ter como destino a mesma arquitetura (x86_64 ou arm64) que a sua função.
Você pode criar camadas que contenham bibliotecas Node.js de terceiros instaladas com npm
(como axios
ou lodash
) ou seus próprios módulos JavaScript.
Para criar uma camada usando pacotes npm
-
Crie a estrutura de diretório necessária e instale pacotes nela diretamente:
mkdir -p nodejs npm install --prefix nodejs lodash axios
Esse comando instala pacotes diretamente no diretório
nodejs/node_modules
, que é a estrutura exigida pelo Lambda.nota
Para pacotes com dependências nativas ou componentes binários (como sharp
ou bcrypt), certifique-se de que sejam compatíveis com o ambiente Linux do Lambda e com a arquitetura da função. Talvez seja necessário usar o sinalizador --platform
:npm install --prefix nodejs --platform=linux --arch=x64 sharp
No caso de dependências nativas mais complexas, talvez seja necessário compilá-las em um ambiente Linux que corresponda ao runtime do Lambda. É possível usar o Docker para essa finalidade.
-
Crie um arquivo .zip do conteúdo da camada:
A estrutura de diretórios do arquivo zip deve ser assim:
nodejs/ └── node_modules/ ├── lodash/ ├── axios/ └── (dependencies of the other packages)
nota
Garanta que o arquivo .zip inclua o diretório
nodejs
no nível raiz comnode_modules
dentro dele. Essa estrutura garante que o Lambda consiga localizar e importar seus pacotes.
Para criar uma camada usando seu próprio código
-
Crie a estrutura de diretório necessária para sua camada:
mkdir -p nodejs/node_modules/validator
-
Crie um arquivo
package.json
para seu módulo personalizado a fim de definir como ele deve ser importado:exemplo package.json
{ "name": "validator", "version": "1.0.0", "type": "module", "main": "index.mjs" }
-
Crie o arquivo do módulo JavaScript:
exemplo 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) }; }
-
Crie um arquivo .zip do conteúdo da camada:
A estrutura de diretórios do arquivo zip deve ser assim:
nodejs/ └── node_modules/ └── validator/ ├── package.json └── index.mjs
-
Na função, importe e use os módulos. Exemplo:
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' }); } };
Você pode usar os seguinte evento de testepara invocar a função:
{ "body": "{\"productId\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}" }
Resposta esperada:
{ "statusCode": 200, "body": "{\"message\":\"Order validated successfully\",\"order\":{\"productId\":\"ABC123\",\"quantity\":2,\"shippingPriority\":\"express\"}}" }
Criar a camada no Lambda
Você pode publicar a camada usando a AWS CLI ou o console do Lambda.
Adicionar a camada à função
Aplicação de amostra
Para obter mais exemplos de como usar camadas do Lambda, consulte a aplicação de amostra layer-nodejs