如何用AWS SAM(NodeJS)配置含npm依赖的自定义Lambda Layer函数?
AWS SAM配置Lambda Layer调用带npm依赖的自定义函数
问题描述
我的Lambda处理文件index.mjs导入自定义函数的代码:
import { myCustomFunc } from './opt/my-layer/myCustomFunc.mjs' // 原导入路径存疑 export async function handler() { myCustomFunc(); }
自定义函数文件./layers/my-layer/myCustomFunc.mjs(sam build后生成./opt/myCustomFunc.mjs):
import { joi } from 'joi'; // 依赖npm包joi export function myCustomFunc() { console.log(joi.version()); // 预期输出'17.11.0' }
本地执行sam build和sam local invoke MyLambdaName -e my-event.json时,报错:
"Cannot find module '/var/opt/nodejs/node_modules/joi' imported from ..."
已尝试调整文件结构(如将所有文件放入layers/nodejs层、把node_modules放在layers/shared根目录),并在template.yaml中给Lambda引用两个Layer,但均无法解决自定义函数找不到依赖的问题。
需求:通过AWS SAM实现本地快速构建测试(可完整访问npm依赖),测试通过后直接部署云端,避免手动打包上传层的低效操作。
验证可行的配置方案
1. 标准项目文件结构
├── template.yaml ├── src/ │ └── index.mjs # Lambda主处理函数 └── layers/ └── shared-utils/ # 自定义函数+依赖的Layer └── nodejs/ ├── myCustomFunc.mjs └── package.json
注:如果多个Lambda需要共享通用npm依赖,可以单独抽一个
node-deps层,但单Layer承载自定义函数+自身依赖是最直接的解决方式。
2. Layer的package.json配置
在layers/shared-utils/nodejs/package.json中声明依赖:
{ "name": "shared-utils", "version": "1.0.0", "dependencies": { "joi": "17.11.0" } }
3. template.yaml完整配置
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: # 自定义工具函数Layer SharedUtilsLayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: SharedUtilsLayer Description: Custom utility functions with dependencies ContentUri: layers/shared-utils/ CompatibleRuntimes: - nodejs18.x - nodejs20.x RetentionPolicy: Retain MyLambdaFunction: Type: AWS::Serverless::Function Properties: FunctionName: MyLambdaName CodeUri: src/ Handler: index.handler Runtime: nodejs20.x Layers: - !Ref SharedUtilsLayer
4. 修正Lambda导入路径
修改src/index.mjs的导入路径,因为SAM构建后Layer的nodejs目录会被挂载到/opt/nodejs:
import { myCustomFunc } from '/opt/nodejs/myCustomFunc.mjs' export async function handler() { myCustomFunc(); }
5. 构建与本地测试步骤
- 安装Layer依赖:
cd layers/shared-utils/nodejs npm install
- 执行SAM构建:
sam build
- 本地调用测试:
sam local invoke MyLambdaFunction -e my-event.json
关键原理
- Lambda运行时会将每个Layer的内容挂载到
/opt目录,Node.js运行时自动把/opt/nodejs/node_modules加入模块搜索路径 - 将自定义函数和其依赖放在同一Layer的
nodejs目录下,SAM构建时会自动处理依赖的安装与路径映射,避免跨Layer的依赖查找问题
内容的提问来源于stack exchange,提问作者mepley
相关产品推荐
相关产品推荐

