使用 Node.js Lambda 函数的层
使用 Lambda 层来打包要在多个函数中重复使用的代码和依赖项。层通常包含库依赖项、自定义运行时系统或配置文件。创建层涉及三个常见步骤:
-
打包层内容。此步骤需要创建 .zip 文件存档,其中包含要在函数中使用的依赖项。
-
在 Lambda 中创建层。
-
将层添加到函数。
打包层内容
要创建层,请将您的包捆绑到满足以下要求的 .zip 文件存档中:
-
使用计划用于 Lambda 函数的相同 Node.js 版本来构建层。例如,如果您使用 Node.js 22 来构建层,则您的函数应使用 Node.js 22 运行时。
-
您层的 .zip 文件必须使用以下目录结构之一:
-
nodejs/node_modules
-
nodejs/node
(例如,其中X
/node_modulesX
是您的 Node.js 版本node22
)
有关更多信息,请参阅 每个 Lambda 运行时的层路径。
-
-
您的层中的包必须与 Linux 兼容。Lambda 函数在 Amazon Linux 上运行。
-
如果您的层包含原生二进制文件或可执行文件,则它们必须与您的函数针对相同的架构(x86_64 或 arm64)。
您可以创建包含使用 npm
安装的第三方 Node.js 库(例如 axios
或 lodash
)或者您自己的 JavaScript 模块。
要使用 npm 包创建层
-
创建所需的目录结构,并将包直接安装到其中:
mkdir -p nodejs npm install --prefix nodejs lodash axios
此命令是将包直接安装到
nodejs/node_modules
目录中,这是 Lambda 所需的结构。 -
压缩层内容:
您的 .zip 文件的目录结构应如下所示:
nodejs/ └── node_modules/ ├── lodash/ ├── axios/ └── (dependencies of the other packages)
注意
请确保您的 .zip 文件包含位于根级别下的
nodejs
目录,且该目录内包含node_modules
。此结构旨在确保 Lambda 可以找到并导入您的包。
使用您自己的代码创建层
-
为您的层创建所需的目录结构:
mkdir -p nodejs/node_modules/validator
-
为您的自定义模块创建一个
package.json
文件,以定义其导入方式:例 package.json
{ "name": "validator", "version": "1.0.0", "type": "module", "main": "index.mjs" }
-
创建您的 JavaScript 模块文件:
例 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) }; }
-
压缩层内容:
您的 .zip 文件的目录结构应如下所示:
nodejs/ └── node_modules/ └── validator/ ├── package.json └── index.mjs
-
在您的函数中导入并使用这些模块。示例:
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' }); } };
您可以使用以下测试事件调用函数:
{ "body": "{\"productId\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}" }
预期的回应:
{ "statusCode": 200, "body": "{\"message\":\"Order validated successfully\",\"order\":{\"productId\":\"ABC123\",\"quantity\":2,\"shippingPriority\":\"express\"}}" }
在 Lambda 中创建层
您可以使用 AWS CLI 或 Lambda 控制台发布层。
将层添加到函数
示例应用程序
有关如何使用 Lambda 层的更多示例,请参阅 AWS Lambda Developer Guide GitHub 存储库中的 layer-nodejs