【Python】AWS Lambdaでheadless chrome+seleniumを実行する方法
すでに色々と記事があるネタですが。
半年くらい前に環境を構築したのでその際にハマった点などが書ければと思います。
AWS Lambdaとは
利用者は実行したいプログラムコードを書くだけでよくて、実行環境はAWSでそのプログラムを実行する都度用意してくれるサービス。課金は実行した回数および時間で決まります。
無期限の無料枠があって100万リクエスト/月または最大320万秒の実行時間/月。実行時間は、実行環境のメモリ量によって変動します。
本記事の前提
・AWSのアカウントが準備できていること
・Linux/Unix環境が準備できていること(Dockerでも可)
・上記のLinux/Unix環境にPython3.7でpipが実行できる環境ができていること
参考までにdocker環境の構築メモは本記事の一番下に記載しています。
事前準備
1.headless chromeとchrome driverをダウンロードしてLayer用にzipで固める
headless chromeはv1.0.0-55
chrome driverは2.37 ※2.43でも動くみたいですが未確認
になります。
# mkdir -p headless/python/bin
# cd headless/python
# wget https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip
# unzip stable-headless-chromium-amazonlinux-2017-03.zip -d bin/
# wget https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip
# unzip chromedriver_linux64.zip -d bin/
# ls -l bin
total 106800
-rwxr-xr-x 1 root root 7874704 Mar 20 2018 chromedriver
-rwxr-xr-x 1 root root 101478960 Feb 15 2018 headless-chromium
# rm stable-headless-chromium-amazonlinux-2017-03.zip
# rm chromedriver_linux64.zip
# cd ../../
# zip -r headless.zip ./headless
参考に載せた一つ目の記事を元に作業していたのですが、chrome driverをダウンロードする手順がなくてハマりました。
2.seleniumをLayer用にzipで固める
# mkdir -p selenium/python
# cd selenium/python
# pip install selenium -t .
# cd ..
# zip -r selenium.zip ./python
# ls -l
total 1320
drwxr-xr-x 6 root root 4096 Sep 15 09:51 python
-rw-r--r-- 1 root root 1345584 Sep 15 09:52 selenium.zip
Lambdaのレイヤー作成
事前準備で作成したheadless.zipとselenium.zipを使ってレイヤーを作成します。
・名前はわかるような名前であれば何でもOK
・アップロードするzipファイルは事前準備で用意したもの
・ランタイムはPython3.6またはPython3.7を指定してください。
※Python3.8はOSがAmazon Linux2になっている関係上、うまく動作しませんでした。Pythonのバージョン毎のOSはこちらで確認してください。
Lambda関数作成
ポイント
・メモリを512MBくらいは設定する
・タイムアウト時間を延ばす
サンプルコード
import json
from selenium import webdriver
def headless_chrome():
options = webdriver.ChromeOptions()
options.binary_location = "/opt/headless/python/bin/headless-chromium"
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--single-process")
options.add_argument("--disable-gpu")
options.add_argument("--window-size=1280x1696")
options.add_argument("--disable-application-cache")
options.add_argument("--disable-infobars")
options.add_argument("--hide-scrollbars")
options.add_argument("--enable-logging")
options.add_argument("--log-level=0")
options.add_argument("--ignore-certificate-errors")
options.add_argument("--homedir=/tmp")
driver = webdriver.Chrome(
executable_path="/opt/headless/python/bin/chromedriver",
chrome_options=options
)
return driver
def lambda_handler(event, context):
driver = headless_chrome()
driver.get("https://www.google.co.jp")
result = {
'statusCode': 200,
'body': driver.title
}
driver.quit()
return result
参考
(おまけ)Dockerで事前準備の環境を用意するには
前提:Windows10 Proでの場合
※Windows10 Homeでdocker環境を準備する場合は、こちらを参考にしてください。
1.dockerをインストール
ここからWindows版をダウンロードしてインストール
2.ubuntuのイメージをpull
docker pull ubuntu:latest
3.コンテナ作成&実行
docker run --rm -it --name ubuntu --mount type=bind,source=c:/docker,target=/mnt/local ubuntu:latest /bin/bash
windows上にc:\dockerというフォルダがある前提で、そのフォルダをコンテナの/mnt/localで参照できるようにしています。(作ったファイルをWindows環境へ持ち出すため)
「--rm」を指定しているのでコンテナを抜けると、コンテナが破棄されます。
4.必要なライブラリを準備(コンテナ環境での作業)
wgetとzipのインストールとpython3.7およびpipの導入
# apt-get update
# apt-get -y install zip wget python3.7 python3.7-distutils
# wget https://bootstrap.pypa.io/get-pip.py
# python3.7 get-pip.py
以上です。