在AWS Lambda中运行Puppeteer时缺失libnss3.so库的问题
问题:AWS Lambda运行Puppeteer时缺失libnss3.so共享库
我尝试用chrome-aws-lambda包在AWS Lambda上运行Puppeteer,结果启动Chromium浏览器进程失败,提示共享库libnss3.so缺失。我的Lambda函数基于Node.js,用来处理PDF,目前没配置包含额外二进制文件或库的Lambda层。我怀疑是Lambda环境缺Chromium依赖库导致的,想确认是不是没配置Lambda层的问题,以及怎么配置Lambda层来包含Puppeteer需要的库。
错误信息详情
{ "errorType": "Error", "errorMessage": "Failed to launch the browser process!\n/tmp/chromium: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory\n\n\nTROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md\n", "trace": [ "Error: 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: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md", "", " at onClose (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js:197:20)", " at Interface.<anonymous> (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js:187:68)", " at Interface.emit (node:events:526:35)", " at Interface.close (node:internal/readline/interface:527:10)", " at Socket.onend (node:internal/readline/interface:253:10)", " at Socket.emit (node:events:526:35)", " at endReadableNT (node:internal/streams/readable:1589:12)", " at process.processTicksAndRejections (node:internal/process/task_queues:82:21)" ] }
报错代码片段
const browser = await chromium.puppeteer.launch({ args: chromium.args, defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath, headless: chromium.headless, ignoreHTTPSErrors: true, });
解答
问题原因确认
没错,就是因为未配置Lambda层导致的。AWS Lambda默认的Node.js运行时环境不包含Chromium运行所需的系统依赖库(比如libnss3.so属于NSS安全套件的一部分),chrome-aws-lambda仅提供适配Lambda的Chromium二进制文件,但其依赖的底层系统库必须通过Lambda层补充到运行环境中。
配置Lambda层的两种方法
方法一:使用预构建的现成层
直接用社区维护的适配Puppeteer的Lambda层,步骤如下:
- 打开AWS Lambda控制台,进入你的函数页面
- 切换到「层」标签页,点击「添加层」
- 选择「从AWS Lambda层存储库中选择」,搜索
chrome-aws-lambda或puppeteer dependencies - 选择与你的Node.js版本、Lambda运行时架构(x86_64/arm64)匹配的层版本,点击「添加」
方法二:手动构建自定义层
如果需要自定义依赖或找不到合适的预构建层,可手动构建:
- 创建临时目录,比如
lambda-puppeteer-layer - 在目录内创建
lib文件夹(Lambda会自动加载该目录下的系统库) - 基于Amazon Linux 2环境(Lambda默认运行时的基础系统)安装依赖:
yum install -y nss libX11 libXcomposite libXcursor libXdamage libXext libXi libXrandr libXrender libXtst cups-libs libXScrnSaver pango atk gtk3 - 使用
rpm -ql <包名>(比如rpm -ql nss)查询安装的库文件路径,将所有相关文件复制到lambda-puppeteer-layer/lib目录 - 将
lambda-puppeteer-layer目录打包为zip文件(确保zip根目录直接是lib,无多余层级) - 回到Lambda控制台,点击「创建层」,上传该zip文件并保存
- 将这个自定义层添加到你的Lambda函数中
额外注意事项
- 确保
chrome-aws-lambda版本与Lambda层中的Chromium依赖版本兼容,避免版本不匹配 - 保持现有Puppeteer启动配置不变,
chromium.args等预设参数已经适配了Lambda的环境限制(比如内存、权限) - Lambda内存建议至少设为512MB,Chromium运行需要足够内存,内存不足也可能导致启动失败
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

