Лямбда на основе изображения не работает с Selenium Webdriver

Я хотел бы знать причину, по которой мой проект работает локально, но не как лямбда-функция на основе изображений в моей учетной записи?

Следующие команды я выполняю локально:

       docker build -t lambda-repository .
 docker run -p 9001:8080 lambda-repository:latest

И в другом терминале:

      curl -XPOST "http://localhost:9001/2015-03-31/functions/function/invocations" -d '{}'

Это приводит к:

      "Google"%  

Что происходит в моем аккаунте AWS:

  • Я создаю репозиторий ecr
  • Я подталкиваю к нему свой образ
  • Я использую изображение для создания лямбда-функции
  • вызов лямбды приводит к следующему

ОШИБКА:

      START RequestId: 2a8b9cf9-f1f0-48cb-8a5d-eb86c2dddcc0 Version: $LATEST
[ERROR] WebDriverException: Message: unknown error: Chrome failed to start: crashed.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

Traceback (most recent call last):
  File "/var/task/app.py", line 14, in handler
    driver = webdriver.Chrome(options=options)
  File "/var/lang/lib/python3.8/site-packages/selenium/webdriver/chrome/webdriver.py", line 76, in __init__
    RemoteWebDriver.__init__(
  File "/var/lang/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/var/lang/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/var/lang/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/var/lang/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
END RequestId: 2a8b9cf9-f1f0-48cb-8a5d-eb86c2dddcc0
REPORT RequestId: 2a8b9cf9-f1f0-48cb-8a5d-eb86c2dddcc0  Duration: 2736.59 ms    Billed Duration: 3752 ms    Memory Size: 2048 MB    Max Memory Used: 168 MB Init Duration: 1014.78 ms   

Dockerfile:

      FROM public.ecr.aws/lambda/python:3.8

RUN pwd
WORKDIR /tmp
RUN yum -y update
RUN yum -y install wget unzip
RUN yum -y install GConf2 libX11
RUN yum -y install curl

COPY download-chromedriver.sh ./
RUN /bin/bash -c "source ./download-chromedriver.sh"
RUN unzip chromedriver_linux64.zip
RUN mv chromedriver /usr/bin/chromedriver
RUN chromedriver -version

RUN curl https://intoli.com/install-google-chrome.sh | bash
RUN mv /usr/bin/google-chrome-stable /usr/bin/google-chrome
RUN google-chrome -version && which google-chrome

WORKDIR /var/task
COPY app.py ./
COPY requirements.txt ./
RUN pip3 install -r requirements.txt

CMD ["app.handler"]

скачать-chromedriver.sh:

      #!/usr/bin/env bash

CHROME_DRIVER_VERSION=`curl -sS https://chromedriver.storage.googleapis.com/LATEST_RELEASE`
wget -N https://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip

app.py:

      from selenium.webdriver.chrome.options import Options
from selenium import webdriver


    def handler(event, context):
        options = Options()
        options.add_argument('--headless')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
        options.add_argument('--disable-gpu')
        options.add_argument("window-size=1280,1024")
    
        url = 'http://www.google.com'
        driver = webdriver.Chrome(options=options)
        driver.get(url)
        text = driver.title
        return text

requirements.txt:

      selenium==3.141.0
urllib3==1.26.2

1 ответ

Это не решение

Я использовал этот способ в lambda zip. но, может быть, вы получите больше подсказок.

когда ты бежишь chromedriver -version (я думаю, это должно быть chromedriver --verseion) означает выполнение локально.

так что вы должны ввести chromedriver --versionв lambda_function.handler.
подобно os.system('<chromedriver_path>/chromedriver --version').

и вам нужно установить executable_path.
Я не уверен, что тебе нужно options.binary_location также.

         def handler(event, context):
        os.system('/usr/bin/chromedriver --version')

        options = Options()
        options.add_argument('--headless')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
        options.add_argument('--disable-gpu')
        options.add_argument("window-size=1280,1024")
        options.binary_location = "/usr/bin/google-chrome"
    
        url = 'http://www.google.com'
        driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", options=options)
        driver.get(url)
        text = driver.title
        return text

и после того, как вам удастся запустить Python3.8 с chrome88, я надеюсь поделится, как это работает.

Другие вопросы по тегам