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

AWS Lambda部署后使用Playwright导航浏览器失败求助

问题:AWS Lambda部署后Playwright浏览器提前关闭(本地SAM测试正常)

我用Langchain和Python构建了带工具的LLM代理,通过AWS SAM结合Docker构建Lambda。本地基于M1 Max芯片用sam local invoke测试Docker镜像时,Lambda能正常调用Langchain的Playwright工具启动无头异步Chromium浏览器;但部署到AWS Lambda后,在UI测试中出现错误:Target page, context or browser has been closed,本地测试无此问题。

另外,若LLM代理不使用Playwright工具,Lambda可正常执行,说明问题仅出现在已部署的Lambda环境中使用Playwright(通过Langchain包)的场景。

已尝试的解决方案(均未解决)

  • 使用Playwright官方镜像mcr.microsoft.com/playwright/python:v1.21.0-focal构建Docker镜像,预期浏览器配置正常,但仍出现提前关闭问题
  • 将Lambda内存提升至2048MB,问题依旧
  • 按照指南配置Dockerfile,添加aws-lambda-cpp构建依赖,无改善
  • 分别指定--platform=linux/x86_64和--platform=linux/arm64构建镜像,并对应设置Lambda架构,错误仍存在

可能的解决方向

1. 确保异步操作完整等待

Lambda执行环境对异步任务生命周期有严格限制,需确认在Lambda handler中正确等待Playwright的所有异步操作完成。比如在Langchain的Playwright工具封装里,所有浏览器、页面相关操作都要用await等待结束,避免因异步任务未完成就触发Lambda函数终止,导致浏览器被提前销毁。

2. 显式配置Chromium适配Lambda的启动参数

Lambda环境的资源和权限有特殊限制,为Chromium添加针对性启动参数:

from playwright.async_api import async_playwright

async def run_browser():
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=True,
            args=[
                "--no-sandbox",
                "--disable-dev-shm-usage",
                "--single-process",
                "--disable-gpu",
                "--disable-setuid-sandbox"
            ]
        )
        # 页面操作逻辑...

这些参数可规避Lambda环境中因权限、资源不足导致的浏览器异常退出。

3. 升级Playwright版本

当前使用的v1.21.0版本较旧,可能存在与Lambda环境的兼容性问题。尝试使用较新的官方镜像,比如mcr.microsoft.com/playwright/python:v1.40.0-jammy,新版本对容器环境下的无头浏览器适配更完善。

4. 调整Lambda超时时间

Lambda默认超时时间为3秒,若页面加载耗时较长,会导致函数提前终止。将超时时间调整至30秒以上,确保页面有足够时间完成加载。

5. 添加日志定位问题节点

在Playwright关键步骤添加详细日志,通过CloudWatch查看具体哪个环节触发了浏览器关闭:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

async def run_browser():
    async with async_playwright() as p:
        logger.info("启动浏览器中...")
        browser = await p.chromium.launch(...)
        logger.info("浏览器启动完成,创建上下文...")
        context = await browser.new_context()
        logger.info("上下文创建完成,打开页面...")
        page = await context.new_page()
        logger.info("页面打开完成,开始导航...")
        await page.goto("目标URL")
        logger.info("导航完成")
        # 后续操作

内容的提问来源于stack exchange,提问作者Sean Bearden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:33:11