docker AWS Lambda在使用Playwright导航浏览器时失败(Python)

a11xaf1n  于 10个月前  发布在  Docker
关注(0)|答案(1)|浏览(217)

我使用Langchain和Python工具创建了一个LLM代理。我使用AWS SAM和Docker构建了我的Lambda。构建后,我使用sam local invoke测试Docker镜像,Lambda函数按预期执行(在M1 Max芯片上),使用Langchain的Playwright工具包来导航无头的异步 chrome 浏览器。在我使用SAM部署之后,我在AWS Lambda UI中测试了该功能,但是浏览器的导航有一个问题:Target page, context or browser has been closed。我在用sam local invoke本地测试lambda时没有遇到这个错误。
此外,如果LLM代理不使用Playwright工具,则Lambda会按预期执行。这证实了在部署的AWS Lambda函数中使用Playwright(通过Langchain包)存在本地测试未遇到的问题。

  • 在Dockerfile:mcr.microsoft.com/playwright/python:v1.21.0-focal中与Playwright一起使用的图像。预期Playwright浏览器已正确配置。浏览器仍然过早关闭。
  • 增加到2048 MB。我希望更多的内存可以解决这个问题,但错误仍然发生。
  • 遵循Dockerfile的这个指南。我以为通过添加aws-lambda-cpp构建依赖关系可以解决这个问题,但它没有。
  • 尝试--platform=linux/x86_64--platform=linux/arm64,并在Docker中设置Playwright image. Architecture以对应选择。错误仍然发生。
snz8szmq

snz8szmq1#

该问题与Langchain对AWS Playwright浏览器的初始化有关。导入的函数from langchain.tools.playwright.utils import create_async_playwright_browser不允许将参数传递给browser.chromium.launch()。为了使浏览器在AWS上正常运行,browser.chromium.launch(headless=True, args=["--disable-gpu", "--single-process"])
以下是我为让Playwright浏览器在AWS Lambda中正常运行而做的修改:

from playwright.async_api import async_playwright
from playwright.async_api import Browser as AsyncBrowser
from typing import List
from langchain.tools.playwright.utils import run_async

def create_async_playwright_browser(headless: bool = True, args: List[str] = None) -> AsyncBrowser:
    """
    Create an async playwright browser.

    Args:
        headless: Whether to run the browser in headless mode. Defaults to True.
        args: A list of arguments for the browser instance.

    Returns:
        AsyncBrowser: The playwright browser.
    """
    browser = run_async(async_playwright().start())
    if args:
        return run_async(browser.chromium.launch(headless=headless, args=args))
    else:
        return run_async(browser.chromium.launch(headless=headless))

字符串
使用此函数创建浏览器而不是找到的langchain.tools.playwright.utils,可使AWS Lambda按需运行

相关问题