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.
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 axiosEsse 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 sharpNo 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/ ├── package.json ├── package-lock.json └── node_modules/ ├── lodash/ ├── axios/ └── (dependencies of the other packages)nota
Garanta que o arquivo .zip inclua o diretório
nodejsno nível raiz comnode_modulesdentro dele. Essa estrutura garante que o Lambda consiga localizar e importar seus pacotes.-
Os arquivos
package.jsonepackage-lock.jsonno diretórionodejs/são usados pelo npm para gerenciamento de dependências, mas não são exigidos pelo Lambda para a funcionalidade da camada. Cada pacote instalado já contém seu próprio arquivopackage.jsonque define como o Lambda importa o pacote.
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 cd nodejs/node_modules/validator -
Crie um arquivo
package.jsonpara seu módulo personalizado a fim de definir como ele deve ser importado:exemplo nodejs/node_modules/validator/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