使用AWS Lambda与Puppeteer动态截图失败:依赖库缺失报错求助
解决AWS Lambda + Puppeteer-Core 截图时的libnss3.so缺失问题
问题根源
Lambda的Amazon Linux 2运行时默认缺少Chromium运行所需的系统依赖库,即便使用了Chromium封装包,若启动参数或依赖版本搭配不当,就会触发这类库缺失错误。
分步解决方案
1. 锁定兼容的依赖版本
针对Node.js 20,用这套经过验证的依赖组合:
puppeteer-core@23.8.0@sparticuz/chromium@131.0.0
执行安装命令:
npm install puppeteer-core@23.8.0 @sparticuz/chromium@131.0.0
2. 编写正确的Lambda代码
必须正确加载Chromium路径、配置强制的启动参数,示例代码如下:
const chromium = require("@sparticuz/chromium"); const puppeteer = require("puppeteer-core"); exports.handler = async (event) => { let browser = null; try { // 获取Lambda运行时Chromium的可执行路径 const executablePath = await chromium.executablePath(); // 启动浏览器,沙箱禁用参数是Lambda环境必须的 browser = await puppeteer.launch({ executablePath, args: chromium.args.concat([ "--no-sandbox", "--disable-setuid-sandbox", "--disable-dev-shm-usage", // 规避Lambda临时存储空间不足的问题 "--single-process" // 降低资源占用,适配Lambda环境 ]), headless: chromium.headless, defaultViewport: chromium.defaultViewport, }); // 执行截图逻辑 const page = await browser.newPage(); await page.goto(event.url || "https://example.com"); const screenshotBuffer = await page.screenshot({ fullPage: true }); return { statusCode: 200, headers: { "Content-Type": "image/png" }, body: screenshotBuffer.toString("base64"), isBase64Encoded: true, }; } catch (error) { return { statusCode: 500, body: JSON.stringify({ error: error.message }), }; } finally { // 确保浏览器资源释放 if (browser) await browser.close(); } };
3. 打包部署的关键注意事项
- 别在Windows/macOS本地打包:本地环境安装的依赖包含与Lambda不兼容的系统库,建议用两种方式打包:
- 用Lambda层:将
node_modules打包为层,上传后关联到你的Lambda函数 - 用Docker镜像:基于
public.ecr.aws/lambda/nodejs:20镜像构建,在容器内安装依赖后打包上传,确保依赖适配Amazon Linux 2环境
- 用Lambda层:将
- 调整Lambda内存配置:Chromium至少需要1GB内存,建议设为2GB,避免运行时因资源不足崩溃
4. 额外排查点
如果还是报错,检查这几点:
- Lambda执行角色权限:无需特殊权限,基础执行权限即可
/tmp目录权限:Lambda默认允许写入该目录,无需额外配置- 尝试添加
--disable-gpu、--no-zygote到启动参数中
内容的提问来源于stack exchange,提问作者Shweta Sawkar
相关产品推荐
相关产品推荐

