如何在AWS Lambda Node.js 20.x中使用本地自定义模块?
解决AWS Lambda Node.js 20.x无法找到本地自定义模块的问题
问题原因
Lambda部署后,/var/task对应你打包的my_lambda_func目录内容。你原本将local_util放在lambda根目录下,与my_lambda_func同级,打包时未将其包含进压缩包;同时../local_util的相对路径在Lambda环境中指向/var/local_util,这个路径根本不存在,因此触发ERR_MODULE_NOT_FOUND错误。此外,你使用--install-links创建的是软链接,zip打包默认不会跟随软链接复制实际文件,导致Lambda环境中node_modules里的模块引用无效。
可行解决方案
方法1:将自定义模块移至Lambda函数目录内
- 调整目录结构,把
local_util移入my_lambda_func:lambda/ |__my_lambda_func/ |__index.js |__package.json |__local_util/ |__index.js |__package.json - 修改
my_lambda_func/index.js的导入语句:import { lock } from './local_util/index.js'; - 回到
my_lambda_func目录,重新打包部署:zip -qr function.zip .
方法2:打包时包含上级目录的自定义模块(适合不想移动目录的场景)
- 回到
lambda根目录,执行打包命令同时包含两个目录:zip -qr function.zip my_lambda_func/ local_util/ - 保持
my_lambda_func/index.js的导入语句不变:
此时Lambda环境中import { lock } from '../local_util/index.js';/var/task对应lambda根目录,../local_util会指向/var/task/local_util,可正确找到模块。
方法3:通过npm本地安装并确保模块被打包
- 编辑
local_util/package.json,设置name字段(比如@my/local-util); - 在
my_lambda_func目录下执行安装命令(无需--install-links,默认会复制模块文件到node_modules):npm install ../local_util - 修改导入语句为模块名称:
import { lock } from '@my/local-util'; - 重新打包
my_lambda_func目录并部署。
内容的提问来源于stack exchange,提问作者Matt Miller
相关产品推荐
相关产品推荐

