AWS Lambda部署后使用Playwright导航浏览器失败求助
我用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

