部署NestJS Lambdalith到AWS Lambda遇模块找不到错误求助
问题分析
你遇到的Runtime.ImportModuleError核心原因是serverless.yaml的package配置排除了编译后的dist目录,导致部署包中没有Lambda需要执行的lambda.js文件;但直接移除exclude后,node_modules全部打包又会超出Lambda部署包体积限制(压缩后50MB,解压后250MB)。
解决方案
下面提供两种可行的优化方案,优先推荐方案二(webpack打包),这是NestJS部署Lambda的行业通用做法。
方案一:手动调整package排除规则(适合简单项目)
修改serverless.yaml的package配置,移除dist的排除规则,同时只保留生产依赖,排除开发依赖和无用文件:
package: exclude: - node_modules/**/*dev* # 排除所有带dev标识的开发依赖文件 - src/** # 排除TypeScript源码,只留编译后的产物 - .git/** - .github/** - README.md - package-lock.json include: - dist/** # 强制包含编译后的dist目录
同时,需要在GitHub Action中添加编译步骤,确保dist目录生成后再部署:
修改GitHub Action的deploy步骤:
- run: npm ci - run: npm run build # 确保package.json中有"build": "tsc"的脚本 - run: node_modules/.bin/sls deploy --verbose --stage dev
检查你的package.json是否包含build脚本:
"scripts": { "build": "tsc", // 其他脚本... }
方案二:使用serverless-webpack打包(推荐,适合复杂项目)
通过webpack做tree-shaking和依赖优化,将代码与必要的生产依赖打包成单个文件,大幅减小部署包体积。
1. 安装依赖
npm install --save-dev serverless-webpack webpack webpack-node-externals ts-loader typescript
2. 创建webpack配置文件
在项目根目录新建webpack.config.js:
const path = require('path'); const nodeExternals = require('webpack-node-externals'); module.exports = { entry: './src/lambda.ts', target: 'node', mode: process.env.NODE_ENV || 'production', externals: [nodeExternals()], // 排除node_modules中Lambda环境已支持的核心模块,私有包可调整 module: { rules: [ { test: /\.ts$/, use: 'ts-loader', exclude: /node_modules/, }, ], }, resolve: { extensions: ['.ts', '.js'], }, output: { filename: 'lambda.js', path: path.resolve(__dirname, '.webpack'), libraryTarget: 'commonjs2', }, };
3. 修改serverless.yaml配置
service: service-name plugins: - serverless-offline - serverless-dotenv-plugin - serverless-webpack # 添加webpack插件 provider: name: aws runtime: nodejs18.x stage: ${opt:stage, 'dev'} region: ${opt:region, 'region-here'} memorySize: 512 logRetentionInDays: 1 package: individually: false excludeDevDependencies: true # 自动排除开发依赖 functions: main: handler: src/lambda.handler # 直接指向源码,webpack会自动编译打包 events: - http: method: ANY path: /{proxy+} custom: webpack: webpackConfig: ./webpack.config.js includeModules: true # 自动处理生产依赖的打包
4. 调整GitHub Action
无需额外添加build步骤,serverless-webpack会在部署时自动编译TypeScript代码:
- run: npm ci - run: node_modules/.bin/sls deploy --verbose --stage dev
验证方式
部署完成后,可通过AWS Lambda控制台查看部署包的文件结构,确认包含lambda.js(或dist/lambda.js)和必要的依赖文件;调用API时即可正常执行。
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

