AWS Lambda+Puppeteer报错:无法找到/var/task/puppeteer/lib/Browser模块
核心原因:版本不兼容
你使用的chrome-aws-lambda@10.1.0与puppeteer-core@21.7.0版本差距过大,二者完全不兼容。chrome-aws-lambda的版本需要与puppeteer-core严格对应:chrome-aws-lambda@10.x仅支持puppeteer-core@10.x系列,高版本的puppeteer-core内部模块路径结构已变更,导致chrome-aws-lambda错误地尝试从/var/task目录查找模块(实际该模块在层的/opt/nodejs/node_modules/puppeteer-core/lib下)。
解决步骤
1. 匹配依赖版本
修改层的package.json,将puppeteer-core降级到与chrome-aws-lambda@10.1.0兼容的版本,推荐使用puppeteer-core@10.4.0(与chrome-aws-lambda@10.1.0完全适配):
{ "dependencies": { "chrome-aws-lambda": "10.1.0", "puppeteer-core": "10.4.0" } }
重新安装依赖并构建层:
cd src/layers/chromium/nodejs npm install
2. 确认Lambda层结构与打包方式
确保你的层目录结构正确,src/layers/chromium下直接包含nodejs文件夹:
src/layers/chromium/ └── nodejs/ └── node_modules/ ├── chrome-aws-lambda/ └── puppeteer-core/
使用CDK的Code.fromAsset时,指定的路径是../../src/layers/chromium,这会正确打包nodejs目录到层中。避免将chromium文件夹本身作为层根(否则Lambda无法识别nodejs目录)。
3. 强制CDK排除函数包中的冲突依赖
在NodejsFunction配置中添加externalModules,确保CDK不会将chrome-aws-lambda和puppeteer-core打包进函数部署包,强制使用层中的版本:
this.createDownloadPDF = new NodejsFunction(this, "createDownloadPDF", { runtime: Runtime.NODEJS_20_X, // 其他配置... layers: [this.chromiumLayer], externalModules: ['chrome-aws-lambda', 'puppeteer-core'], });
4. 验证Lambda环境变量(可选)
如果上述步骤仍未解决问题,手动设置Lambda的NODE_PATH环境变量,确保Node.js能同时加载函数包和层中的模块:
NODE_PATH=/var/task/node_modules:/opt/nodejs/node_modules
额外排查点
- 检查Lambda控制台中函数的Layers标签,确认
chromiumLayer已正确附加,且版本为最新构建版本。 - 下载层的部署包,解压后确认
nodejs/node_modules下存在完整的chrome-aws-lambda和puppeteer-core目录。
内容的提问来源于stack exchange,提问作者Luke

