在AWS Lambda中调用Puppeteer page.goto出现net::ERR_INSUFFICIENT_RESOURCES错误
我之前在Lambda上跑旧版本Puppeteer时也碰到过一模一样的net::ERR_INSUFFICIENT_RESOURCES问题,大概率是资源限制和环境适配的锅。给你几个针对性的解决方案,按优先级尝试:
Lambda的内存和CPU是绑定的,默认128MB内存完全不够跑Chromium。至少要把内存调到512MB以上,推荐直接拉到1024MB——内存上去了,CPU资源也会同步提升,能直接缓解大部分资源不足的问题。你可以在Lambda控制台的「函数配置」里直接调整内存参数。
旧版本Puppeteer默认的Chromium启动参数太吃资源,必须加上这些优化参数:
const browser = await puppeteer.launch({ args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', // 重点!Lambda的/dev/shm分区只有64MB,Chromium默认会耗尽它 '--disable-gpu', '--single-process', '--no-zygote' ], headless: true });
其中--disable-dev-shm-usage是解决这个错误的核心——它会让Chromium改用临时文件替代/dev/shm,彻底避开小分区的资源限制。
像www.gov.uk这类政府网站加载的资源很多,你可以拦截非必要请求来降低内存压力:
await page.setRequestInterception(true); page.on('request', (req) => { // 拦截图片、样式、字体、媒体文件 if (['image', 'stylesheet', 'font', 'media'].includes(req.resourceType())) { req.abort(); } else { req.continue(); } });
这样能大幅减少页面加载时的资源占用。
你用的Node.js 6.10.3和Puppeteer 1.2.0都是比较老的版本,虽然理论上兼容,但可能存在隐性的环境适配问题。如果条件允许,建议把Node.js升级到8.x(Lambda 2017.03支持),或者把Puppeteer升级到1.x系列的稳定版本(比如1.19.0),能减少不少奇怪的bug。
旧版本Lambda默认缺少Chromium运行所需的系统依赖(比如libatk、libgtk等),如果前面的方法都没用,你需要把这些依赖打包到部署包里,或者用专门的插件(比如serverless-plugin-chrome)来自动处理依赖问题。
先试前三个方案,尤其是内存调整和--disable-dev-shm-usage参数,应该能快速解决问题。
内容的提问来源于stack exchange,提问作者joeformd

