LoginSignup
2
3

AWS Lambdaでseleniumを使う方法

Posted at

はじめに

備忘録がてらAWS Lambdaでseleniumを使う方法を記載していきます。

  • seleniumはサードパーティのライブラリなのでlambda layerでの利用が必須
  • また、headless chromium (GUIがないgoogle chromeのようなもの)とchromedriverの導入も必須
  • 以下のウェブサイトが非常に参考になるので基本的にはこれを見ればいい
  • ライブラリ等の条件
    • Python 3.7 (3.7はAmazon Linux、3.8以降はAmazon Linux 2という違いがあり、それが影響しているのか3.8以降では上手く動作しない)
    • Selenium 4.1.0(他のバージョンは未検証だが、おそらく動くのではないか)
    • severless-chromium v1.0.0.37
    • chromedriver 2.37
    • 上記のウェブページで言及があるが、chromiumとchromdriverの組み合わせは上記以外はほぼ動かない
  • AWS Cloud9でlambda用のレイヤーを準備する方法が上記のウェブページで述べられているが、WindowsのWSLでも問題ない。自分はそれで実施した。

自分が実行したコード

lambdaのレイヤーは、seleniumと、headless-chromium+chromedriverの2つがある。

1. selenium

mkdir python
pip3 install selenium==4.1.0 -t ./python/lib/python3.7/site-packages
zip -r python.zip python

2. headless-chromium+chromedriver

mkdir headless
cd headless
curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
unzip -o chromedriver.zip -d .
unzip -o headless-chromium.zip -d .
rm chromedriver.zip
rm headless-chromium.zip
cd ..
zip -r headless.zip headless

lambdaのコード

from selenium import webdriver

def lambda_handler(event, context):

    URL = "https://news.yahoo.co.jp/"

    options = webdriver.ChromeOptions()
    options.add_argument("--headless")
    options.add_argument("--disable-gpu")
    options.add_argument("--hide-scrollbars")
    options.add_argument("--single-process")
    options.add_argument("--ignore-certificate-errors")
    options.add_argument("--window-size=880x996")
    options.add_argument("--no-sandbox")
    options.add_argument("--homedir=/tmp")
    options.binary_location = "/opt/headless/headless-chromium"

    # ブラウザの定義
    browser = webdriver.Chrome(
        "/opt/headless/chromedriver",
        options=options
    )

    browser.get(URL)
    title = browser.title
    browser.close()

    return title

エラー一覧

  • chromedriver unexpectedly exited. Status code was 127
    • -> ランタイムがpython3.7以外になっている
  • Unable to import module 'lambda_function': No module named 'selenium'
    • -> レイヤーのzipの階層を作るとき、seleniumを入れるパスが間違っている。./python/lib/python3.7/site-packagesが正解

最後に

実はlambdaでseleniumを使えるようにするまで2週間丸々かかりました。原因は、pip3 installするときのインストール先が、「python」という名前のフォルダ以下でなくてはならないのを忘れていて、
自分で勝手に名付けたフォルダに入れていたのが原因でした。いや~~~疲れた。
この備忘録が、同じ課題を抱えている人の助けになれば幸いです。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3