You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda中Playwright启动Chromium报TargetClosedError求助

解决AWS Lambda中Playwright启动Chromium报TargetClosedError的问题

针对你在AWS Lambda环境中遇到的playwright._impl._errors.TargetClosedError: Browser.new_page: Target page, context or browser has been closed错误,结合Lambda环境特性,给出以下可行解决办法:

1. 提升Lambda内存配置

Lambda的内存与CPU配额正相关,默认内存(如128MB/256MB)不足以支撑Chromium启动运行。建议将Lambda函数内存调整至1024MB及以上(可尝试2048MB),更高的内存能分配更多CPU资源,降低浏览器启动时的资源耗尽风险。

2. 对齐Playwright与Chromium版本

确保Lambda环境中Playwright依赖的Chromium版本与本地测试环境完全一致:

  • 构建自定义镜像时,指定固定版本安装:
    pip install playwright==1.37.0
    playwright install chromium --version=1.37.0
    
  • 避免使用latest版本,防止自动更新后出现环境兼容性问题。

3. 优化Chromium启动参数

你的现有参数中部分配置可能在Lambda环境不稳定,建议调整为以下参数:

async with async_playwright() as playwright:
    browser_path = find_chromium_path()
    executable_path = f"{browser_path}/chrome-linux/chrome"
    if not os.path.exists(executable_path):
        executable_path = None

    browser = await playwright.chromium.launch(
        headless="new",  # 使用Playwright新无头模式,更稳定
        executable_path=executable_path,
        args=[
            "--no-sandbox",
            "--disable-setuid-sandbox",
            "--disable-dev-shm-usage",  # 解决Lambda共享内存不足问题
            "--disable-gpu",
            "--no-zygote",
            "--disable-audio-output",
            "--disable-webgl",
            "--disable-extensions",  # 禁用扩展减少资源占用
            "--disable-plugins",
            "--disable-background-networking"
        ]
    )

关键调整点:

  • 移除--single-process:单进程模式会大幅降低浏览器稳定性,极易导致崩溃
  • 改用headless="new":Playwright 1.32+推出的新无头模式,内存占用更低、兼容性更好
  • 增加--disable-extensions/--disable-plugins:减少不必要的资源消耗

4. 添加启动重试机制

Lambda执行环境可能存在临时资源波动,添加重试逻辑可降低偶发失败概率:

from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
async def launch_browser(playwright):
    browser_path = find_chromium_path()
    executable_path = f"{browser_path}/chrome-linux/chrome"
    if not os.path.exists(executable_path):
        executable_path = None
    return await playwright.chromium.launch(
        # 上述优化后的参数
    )

# 使用方式
async with async_playwright() as playwright:
    try:
        browser = await launch_browser(playwright)
        # 后续逻辑
    except Exception as e:
        # 错误处理

5. 检查自定义镜像依赖

如果使用自定义Docker镜像部署Lambda:

  • 基于Amazon Linux 2镜像构建,确保系统库与Lambda执行环境兼容
  • 安装Chromium所需的系统依赖:
    yum install -y atk cups-libs gtk3 libXcomposite libXcursor libXdamage libXext libXi libXrandr libXScrnSaver libXtst pango at-spi2-atk libXt alsa-lib libdrm mesa-libgbm
    

内容的提问来源于stack exchange,提问作者Shriyash Sutar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:12:22