はじめに
備忘録がてら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」という名前のフォルダ以下でなくてはならないのを忘れていて、
自分で勝手に名付けたフォルダに入れていたのが原因でした。いや~~~疲れた。
この備忘録が、同じ課題を抱えている人の助けになれば幸いです。