NodeJS AWS多Lambda共享通用函数的更优实现方案咨询
解决AWS Lambda复用Node.js通用函数的简洁方案
方案1:用AWS Lambda Layer共享代码与依赖
这是AWS官方推荐的代码复用方案,能彻底解决重复安装依赖的问题:
- 操作步骤:
- 单独创建通用代码目录,比如
layers/common,结构如下:layers/common/nodejs/ ├── package.json ├── node_modules/ └── utils/ └── common-functions.js - 进入
nodejs目录执行npm install,只安装一次通用依赖 - 把
nodejs目录打包成zip,通过AWS CLI或控制台创建Lambda层 - 在需要复用代码的Lambda函数中关联该层,代码里直接引入:
const { myCommonFunc } = require('/opt/utils/common-functions'); - Github Actions自动化发布层的示例脚本:
cd layers/common/nodejs npm ci cd ../.. zip -r common-layer.zip nodejs/ aws lambda publish-layer-version --layer-name common-utils --zip-file fileb://common-layer.zip --compatible-runtimes nodejs18.x
- 单独创建通用代码目录,比如
方案2:Monorepo统一管理多Lambda项目
如果项目本身是多Lambda结构,用单仓库多包模式更便于维护:
- 操作步骤:
- 根目录
package.json启用npm workspaces:{ "private": true, "workspaces": [ "packages/common", "packages/lambda-order", "packages/lambda-user" ] } packages/common存放通用函数与依赖,各Lambda目录的package.json将common作为本地依赖:{ "dependencies": { "@my-project/common": "workspace:*" } }- 根目录执行
npm install,所有依赖统一安装到根目录node_modules,打包Lambda时可通过esbuild/webpack将通用代码合并进业务包,或结合Lambda层复用依赖 - Github Actions只需在根目录执行一次
npm ci,再分别打包各Lambda即可
- 根目录
方案3:用构建工具打包Lambda代码
如果不想用层或Monorepo,用构建工具直接把通用代码打包进Lambda部署包:
- 操作步骤:
- 每个Lambda目录配置esbuild脚本(示例
package.json):{ "scripts": { "build": "esbuild index.js --bundle --platform=node --outfile=dist/index.js" } } - 通用代码作为本地模块引入,构建时esbuild会自动将其打包进输出文件,无需手动复制
- 可通过
external配置排除公共依赖,把这些依赖放到Lambda层进一步压缩包体积
- 每个Lambda目录配置esbuild脚本(示例
额外优化
- 在Github Actions中缓存
node_modules,大幅减少依赖安装时间:- name: Cache node modules uses: actions/cache@v3 with: path: '**/node_modules' key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - 创建Lambda层时,务必指定与Lambda函数一致的Node.js runtime版本
内容的提问来源于stack exchange,提问作者Romain
相关产品推荐
相关产品推荐

