在AWS Lambda中使用Puppeteer实现HTML转PDF的问题求助
在Node.js 16的AWS Lambda环境中使用Puppeteer进行HTML转PDF时遇到稳定性问题,本地及常规服务器环境运行正常,但部署到无服务器环境后无法正常启动Chromium,尝试过puppeteer、chrome-aws-lambda等库仍未解决。以下是代码及报错信息:
我的代码
const chromium = require('chrome-aws-lambda'); const puppeteer = require('puppeteer-core'); exports.handler = async (event) => { try { const browser = await puppeteer.launch({ executablePath: await chromium.executablePath, args: chromium.args, headless: true, }); const page = await browser.newPage(); await page.setContent("<html><body><h5>Hello World!</h5></body></html>") const pdf = await page.pdf({ format: "A4", path: "output.pdf" }); return {statusCode: 200}; } catch (error) { console.error(error); return {statusCode: 500}; } };
报错信息
Failed to launch the browser process! /tmp/chromium: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory TROUBLESHOOTING:
解决建议
匹配依赖版本兼容性:Node.js 16需使用适配的chrome-aws-lambda和puppeteer-core版本,建议安装指定版本:
npm install chrome-aws-lambda@10.1.0 puppeteer-core@10.1.0高版本库已不再支持Node.js 16,版本不匹配会导致依赖缺失。
补充系统依赖库:Lambda默认环境缺少部分Chromium运行所需的系统库,可通过Lambda层补充包含libnss3等依赖的层,或使用预打包的Chromium Lambda层。
优化Puppeteer启动参数:Lambda环境资源有限,需添加必要启动参数规避限制,修改后的启动配置如下:
const browser = await puppeteer.launch({ executablePath: await chromium.executablePath, args: [...chromium.args, '--disable-gpu', '--single-process', '--disable-dev-shm-usage'], headless: chromium.headless, ignoreHTTPSErrors: true, });--disable-dev-shm-usage可避免Lambda临时内存不足问题,chromium.headless是库适配无服务器环境的最佳设置。修正文件写入路径:Lambda仅允许写入/tmp临时目录,代码中
path: "output.pdf"会因权限问题失败,需改为path: "/tmp/output.pdf";若无需本地保存,可直接省略path参数,让page.pdf()返回Buffer后处理(如上传至S3)。提升Lambda内存配置:Chromium运行需要足够内存,建议将Lambda内存设置为至少512MB,最优为1024MB,内存不足会导致Chromium启动失败。
清理部署包冗余:部署时使用
npm ci --production安装生产依赖,避免打包本地Chromium二进制文件或多余依赖,确保部署包体积符合Lambda限制。
内容的提问来源于stack exchange,提问作者rahulfaujdar

