在AWS Lambda中用Playwright和@sparticuz/chromium遇net::ERR_INSUFFICIENT_RESOURCES错误
解决AWS Lambda中Playwright+@sparticuz/chromium的net::ERR_INSUFFICIENT_RESOURCES错误
1. 修复浏览器实例复用导致的资源泄漏
Lambda执行环境存在复用特性,若跨请求复用浏览器实例,之前请求耗尽资源的异常实例会被保留,后续请求复用后持续报错。
- 禁止跨请求复用浏览器:每次API请求都重新启动全新的浏览器实例,而非复用旧实例。
- 强制清理残留进程:在Lambda函数结束时,除了关闭上下文和浏览器,额外杀死Chromium相关进程,避免资源残留:
import { execSync } from 'child_process'; // 关闭浏览器后执行 execSync('pkill -f chromium');
2. 优化Chromium启动参数
针对Lambda环境添加资源精简参数,减少内存与进程开销:
const browser = await chromium.launch({ args: [ '--disable-gpu', '--disable-dev-shm-usage', '--no-sandbox', '--single-process', '--disable-zygote', '--disable-extensions', '--disable-background-networking', '--disable-renderer-throttling', '--disable-notifications', '--no-first-run', '--password-store=basic' ], headless: true, });
3. 调整重试策略与资源释放逻辑
现有重试逻辑复用旧浏览器创建上下文,若浏览器已资源不足,新上下文仍会报错:
- 重试时重启浏览器:每次重试都关闭当前浏览器,重新启动新实例,而非复用旧实例。
- 实时释放资源:每次爬取(含重试)后立即关闭页面、上下文,不等到所有重试结束再统一清理:
async function crawlPage(url) { let browser, context, page; try { browser = await chromium.launch({ /* 启动参数 */ }); context = await browser.newContext(); page = await context.newPage(); await page.goto(url, { timeout: 30000, waitUntil: 'domcontentloaded' }); // 爬取逻辑 return result; } catch (error) { throw error; } finally { if (page) await page.close(); if (context) await context.close(); if (browser) await browser.close(); execSync('pkill -f chromium'); } } async function withRetry(url, retries = 2) { for (let i = 0; i < retries; i++) { try { return await crawlPage(url); } catch (error) { if (i === retries - 1) throw error; } } }
4. 清理Chromium缓存与调整Lambda配置
- 清理临时缓存:Chromium会在/tmp目录写入缓存,每次启动前清理指定缓存目录:
import fs from 'fs'; import path from 'path'; const cacheDir = path.join('/tmp', 'chromium-cache'); if (fs.existsSync(cacheDir)) fs.rmSync(cacheDir, { recursive: true }); // 启动参数添加缓存目录指定 '--disk-cache-dir=' + cacheDir, - 延长执行超时:Lambda默认超时3秒,爬取网页需设置为5-10分钟,避免因超时导致资源未正常释放。
5. 减少目标网页资源加载
拦截非必要资源,降低页面加载的资源消耗:
await context.route('**/*.{png,jpg,jpeg,gif,svg,mp4,css}', route => route.abort());
内容的提问来源于stack exchange,提问作者user17991685
相关产品推荐
相关产品推荐

