Aws lambda Pyppeteer:浏览器在AWS Lambda中意外关闭

Aws lambda Pyppeteer:浏览器在AWS Lambda中意外关闭,aws-lambda,puppeteer,pyppeteer,Aws Lambda,Puppeteer,Pyppeteer,我在AWS Lambda中遇到了这个错误。devtools websocket似乎未启动。我不知道怎么修。有什么想法吗?谢谢你抽出时间 由于websocket响应超时,异常源于get\u ws\u endpoint() Lambda代码: import os import json import asyncio import logging import boto3 import pyppeteer from pyppeteer import launch logger = logging.g

我在AWS Lambda中遇到了这个错误。devtools websocket似乎未启动。我不知道怎么修。有什么想法吗?谢谢你抽出时间

由于websocket响应超时,异常源于
get\u ws\u endpoint()

Lambda代码:

import os
import json
import asyncio
import logging
import boto3
import pyppeteer
from pyppeteer import launch

logger = logging.getLogger()
logger.setLevel(logging.INFO)

pyppeteer.DEBUG = True  # print suppressed errors as error log

def lambda_handler(event, context):
    asyncio.get_event_loop().run_until_complete(main())

async def main():
    browser = await launch({
        'headless': True,
        'args': [
            '--no-sandbox'
            ]
    })
    page = await browser.newPage()
    await page.goto('http://example.com')
    await page.screenshot({'path': '/tmp/example.png'})
    await browser.close()
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
例外情况:

    Response:
{
  "errorMessage": "Browser closed unexpectedly:\n",
  "errorType": "BrowserError",
  "stackTrace": [
    "  File \"/var/task/lambda_handler.py\", line 23, in lambda_handler\n    asyncio.get_event_loop().run_until_complete(main())\n",
    "  File \"/var/lang/lib/python3.8/asyncio/base_events.py\", line 616, in run_until_complete\n    return future.result()\n",
    "  File \"/var/task/lambda_handler.py\", line 72, in main\n    browser = await launch({\n",
    "  File \"/opt/python/pyppeteer/launcher.py\", line 307, in launch\n    return await Launcher(options, **kwargs).launch()\n",
    "  File \"/opt/python/pyppeteer/launcher.py\", line 168, in launch\n    self.browserWSEndpoint = get_ws_endpoint(self.url)\n",
    "  File \"/opt/python/pyppeteer/launcher.py\", line 227, in get_ws_endpoint\n    raise BrowserError('Browser closed unexpectedly:\\n')\n"
  ]
}

Request ID:
"06be0620-8b5c-4600-a76e-bc785210244e"

Function Logs:
START RequestId: 06be0620-8b5c-4600-a76e-bc785210244e Version: $LATEST
---- files in /tmp ----
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.

  0%|          | 0/108773488 [00:00<?, ?it/s]
 11%|█▏        | 12267520/108773488 [00:00<00:00, 122665958.31it/s]
 27%|██▋       | 29470720/108773488 [00:00<00:00, 134220418.14it/s]
 42%|████▏     | 46172160/108773488 [00:00<00:00, 142570388.86it/s]
 58%|█████▊    | 62607360/108773488 [00:00<00:00, 148471487.93it/s]
 73%|███████▎  | 79626240/108773488 [00:00<00:00, 154371569.93it/s]
 88%|████████▊ | 95754240/108773488 [00:00<00:00, 156353972.12it/s]
100%|██████████| 108773488/108773488 [00:00<00:00, 161750092.47it/s]
[W:pyppeteer.chromium_downloader] 
chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: /tmp/local-chromium/588429
-----
/tmp/local-chromium/588429/chrome-linux/chrome
[ERROR] BrowserError: Browser closed unexpectedly:

Traceback (most recent call last):
  File "/var/task/lambda_handler.py", line 23, in lambda_handler
    asyncio.get_event_loop().run_until_complete(main())
  File "/var/lang/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "/var/task/lambda_handler.py", line 72, in main
    browser = await launch({
  File "/opt/python/pyppeteer/launcher.py", line 307, in launch
    return await Launcher(options, **kwargs).launch()
  File "/opt/python/pyppeteer/launcher.py", line 168, in launch
    self.browserWSEndpoint = get_ws_endpoint(self.url)
  File "/opt/python/pyppeteer/launcher.py", line 227, in get_ws_endpoint
    raise BrowserError('Browser closed unexpectedly:\n')END RequestId: 06be0620-8b5c-4600-a76e-bc785210244e
REPORT RequestId: 06be0620-8b5c-4600-a76e-bc785210244e  Duration: 33370.61 ms   Billed Duration: 33400 ms   Memory Size: 3008 MB    Max Memory Used: 481 MB Init Duration: 445.58 ms    
响应:
{
“errorMessage”:“浏览器意外关闭:\n”,
“errorType”:“BrowserError”,
“stackTrace”:[
“文件\“/var/task/lambda_handler.py\”,第23行,lambda_handler\n asyncio.get_event_loop()。运行_直到_完成(main())\n”,
“File\”/var/lang/lib/python3.8/asyncio/base\u events.py\”,第616行,在运行\u直到\u完成\n返回future.result()\n“,
“File\”/var/task/lambda_handler.py\”,第72行,在主浏览器中=等待启动({\n“,
“File\”/opt/python/pyppeteer/launcher.py\”,第307行,在launch\n return wait launcher(选项**kwargs.launch()\n“,
“File\”/opt/python/pyppeteer/launcher.py\”,第168行,在launch\n self.browserWSEndpoint=get\u ws\u endpoint(self.url)\n中,
“文件\“/opt/python/pyppeteer/launcher.py\”,第227行,在get_ws_端点\n raise BROWSERERERERROR('浏览器意外关闭:\\n')\n”
]
}
请求ID:
“06be0620-8b5c-4600-a76e-bc785210244e”
功能日志:
启动请求ID:06be0620-8b5c-4600-a76e-bc785210244e版本:$LATEST
----/tmp中的文件----
[W:pyppeteer.chromiu downloader]启动chromium下载。
下载可能需要几分钟。

0%| | 0/108773488[00:00回答我自己的问题

最后,在将chromium二进制绑定到lambda层之后,我能够使用Python3.6和3.7(而不是3.8)运行Pypetteer(v0.2.2)

总之,它似乎只有在配置为使用用户提供的chrome可执行路径而不是自动下载的chrome时才起作用。可能是某些竞争条件或其他原因

从…那里得到铬


在repo上发布的问题

我认为浏览器错误:浏览器意外关闭
正是当Chrome因任何原因崩溃时所出现的错误。如果Pypetteer打印出错误就好了,但事实并非如此

要了解情况,可以调出Pypetteer运行的确切命令。您可以通过以下方式执行此操作:

>>> from pyppeteer.launcher import Launcher
>>> ' '.join(Launcher().cmd)
/root/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome --disable-background-networking --disable-background-timer-throttling --disable-breakpad --disable-browser-side-navigation --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=site-per-process --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --disable-translate --metrics-recording-only --no-first-run --safebrowsing-disable-auto-update --enable-automation --password-store=basic --use-mock-keychain --headless --hide-scrollbars --mute-audio about:blank --no-sandbox --remote-debugging-port=33423 --user-data-dir=/root/.local/share/pyppeteer/.dev_profile/tmp5cj60q6q
在Docker映像中运行该命令时,出现以下错误:

$ /root/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome # ...
/root/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome:
error while loading shared libraries:
libnss3.so: cannot open shared object file: No such file or directory
所以我安装了
libnss3

apt-get install -y libnss3
然后我再次运行该命令,并得到一个不同的错误:

$ /root/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome # ...
[0609/190651.188666:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
因此,我需要将启动命令更改为:

browser=wait launch(headless=True,args=['--no sandbox'])

现在它工作了!

我一直在尝试在Docker容器中运行Pypetteer,但遇到了相同的问题

多亏了这句话,终于修复了它:

我通过apt手动安装了Chrome

curl -sSL https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
echo "deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list
apt update -y && apt install -y google-chrome-stable
然后在启动浏览器时指定路径。 您还必须在headless和args中运行它——“无沙箱”


希望这会有所帮助!

如果有人在Heroku上运行并且面临相同的错误:

添加构建包:构建包的url如下:

https://github.com/jontewks/puppeteer-heroku-buildpack

确保您使用的是
--无沙箱模式

launch({args:['--no sandbox']})

你是对的。3.8不起作用。但3.6和3.7很好。谢谢你的提示。我如何解决AWS lambda上的libnss3问题?无法直接在lambda上安装低级DEP。
curl -sSL https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
echo "deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list
apt update -y && apt install -y google-chrome-stable
browser = await launch(executablePath='/usr/bin/google-chrome-stable', headless=True, args=['--no-sandbox'])