AWS Lambda中Protocol error (Page.navigate): Target closed问题排查咨询
错误详情
{ "errorType": "TargetCloseError", "errorMessage": "Protocol error (Page.navigate): Target closed", "name": "TargetCloseError", "cause": { "errorType": "ProtocolError", "errorMessage": "", "name": "ProtocolError", "stack": [ "ProtocolError", " at <instance_members_initializer> (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:42:14)", " at new Callback (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:46:16)", " at CallbackRegistry.create (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:86:26)", " at Connection._rawSend (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:208:26)", " at CdpCDPSession.send (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/CDPSession.js:62:33)", " at navigate (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Frame.js:164:51)", " at CdpFrame.goto (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Frame.js:142:17)", " at CdpFrame. (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/util/decorators.js:108:27)", " at CdpPage.goto (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/api/Page.js:724:43)", " at exports.handler (/var/task/index.js:38:18)" ] }, "stack": [ "TargetCloseError: Protocol error (Page.navigate): Target closed", " at CallbackRegistry.clear (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:139:36)", " at CdpCDPSession._onClosed (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/CDPSession.js:97:25)", " at #onClose (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Connection.js:285:21)", " at WebSocket. (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.js:57:30)", " at callListener (/var/task/node_modules/ws/lib/event-target.js:290:14)", " at WebSocket.onClose (/var/task/node_modules/ws/lib/event-target.js:220:9)", " at WebSocket.emit (node:events:517:28)", " at WebSocket.emitClose (/var/task/node_modules/ws/lib/websocket.js:260:10)", " at Socket.socketOnClose (/var/task/node_modules/ws/lib/websocket.js:1272:15)", " at Socket.emit (node:events:517:28)" ] }
初步排查方向
- 检查CloudWatch日志,查看Lambda执行过程中是否有内存不足、超时或Chrome启动失败的前置错误
- 检查Lambda运行时版本与Puppeteer、Chrome二进制文件的兼容性:比如Node.js版本是否符合Puppeteer要求,避免版本不匹配导致的通信异常
进一步排查与解决方法
1. 内存与超时配置
Lambda默认内存配置较低,运行Chrome/Puppeteer需要足够资源:
- 将Lambda内存调整至至少512MB(建议1GB以上),内存提升同时会增加CPU配额,减少Chrome崩溃概率
- 延长Lambda超时时间至至少30秒,避免页面加载未完成时函数被终止
2. Puppeteer启动参数优化
添加以下参数确保Chrome在Lambda环境稳定运行:
const browser = await puppeteer.launch({ headless: 'new', // 使用新版无头模式,兼容性更好 args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', // 解决Lambda临时空间不足问题 '--disable-gpu', '--single-process', '--no-zygote' ], timeout: 60000 // 延长浏览器启动超时时间 });
3. 页面加载错误处理
在page.goto时添加超时和错误捕获,避免目标页面异常导致连接中断:
try { await page.goto('目标URL', { waitUntil: 'networkidle2', // 等待网络空闲再继续 timeout: 30000 // 页面加载超时时间 }); } catch (error) { console.error('页面加载失败:', error); // 必要时关闭浏览器并抛出错误 await browser.close(); throw error; }
4. Chrome二进制文件兼容性
- 确保使用的Puppeteer版本对应的Chrome二进制文件与Lambda环境兼容,可使用
chrome-aws-lambda库自动适配Lambda的Chrome版本 - 避免手动打包Chrome二进制文件,优先使用适配Lambda的Puppeteer封装库
5. 资源清理
在Lambda函数结束前,确保关闭浏览器实例,避免资源泄漏:
exports.handler = async (event) => { let browser; try { browser = await puppeteer.launch(/* 配置 */); // 业务逻辑 } catch (error) { console.error('执行失败:', error); throw error; } finally { if (browser) { await browser.close(); } } };
内容的提问来源于stack exchange,提问作者santhosh kumar
相关产品推荐
相关产品推荐

