【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くらいは設定する
・タイムアウト時間を延ばす

画像2

サンプルコード

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

以上です。


いいなと思ったら応援しよう!