Seleniumを使ってスクレイピングをするスクリプトをAWS lambda上で動作させる際にハマったのでメモします。
ちなみにLambdaのPythonバージョンが3.9だと以下の方法を実施してもSeleniumは動作しないようです。Seleniumの実行エラーになります。
Python3.7にすると動作するようになりましたのでご注意ください。
1. 前提
- 開発環境としてWindows10にPythonをインストールしている
- Lambda関数はPython3.7で作成
2. SeleniumをLambdaで実行する方法
Lambdaをそのままアップして利用してもLambda上の標準ライブラリにSeleniumは入っていないのでエラーになります。
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'selenium'
アップロードするlambadフォルダ内に含んでもよいのですが、ChromeDriverとHeadless-chromiumだけでもLambdaのデプロイサイズ上限である50MBになってしまうので、今回はLambda Layersを利用したいと思います。
3. AWS Lambda Layersの作成
3.1. AWS Lambda Layersとは?
AWS Lambda Layers とはlamda から共通的に使える共通関数のようなもので、ライブラリのような共通で使用するモジュールをLayerにすることで、デプロイパッケージにライブラリを含める必要がなくなります。
Lambdaでサードパーティ製のライブラリやモジュールを使用する際に、Layerに格納して各Lambda関数から呼び出して使用するというような使い方ができます。
3.2. SeleniumのLambda Layers作成
pipコマンドでSeleniumを任意のディレクトリにダウンロードしてからzip化します。
> pip install -t ./python/lib/python3.7/site-packages selenium
> zip -r ./python python.zip
3.3. Headless-chromiumのLambda Layers作成
以下のサイトからそれぞれダウンロードしていきます。
ダウンロードするのはLinux版です。念のため。
Chromdriver:
https://chromedriver.chromium.org/downloads
headless-chromium
https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip
ダウンロードしたファイルに実行権をつける必要があります。
Windowsの場合にはできないので一旦Linuxにファイルを移動してからパーミッションを変更してください。
<<Linux上で実施>>
# chmod 755 chromedriver
# chmod 755 headless-chronium
# zip chromedriver.zip chromedriver headless-chronium

4. AWS Lambda Layersへのアップロード
作成した2つのzipファイルを順にLambda Laypersとしてアップしていきます。
最終的に以下のようになります(バージョンは違ってもOKです)

5. Lambda関数に Lambda Layersを追加する
実際に利用しているLambda関数側で先ほど作成したLambda Layersを利用するように設定します。

6. ChromeDriverの呼び出しパス(executable_path)の指定
Lambda側の準備はできましたので、最後にスクリプト側の修正を行います。
AWS Lambda layersは読み込んだ際に、「/opt」 に配置されるようになりますのでChromedriverを下記のように指定します。
options.binary_location = '/opt/headless-chromium'
driver = webdriver.Chrome(executable_path ="/opt/chromedriver", chrome_options=options
ちなみに私は以下のように実行する環境がローカル(Windows)かLambda(Linux)かで読み込む内容を自動的に変更するようにしました。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--single-process')
options.add_argument('--disable-dev-shm-usage')
if os.name == 'nt':
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
else:
options.binary_location = '/opt/headless-chromium'
driver = webdriver.Chrome(executable_path="/opt/chromedriver", chrome_options=options)
7. タイムアウト値の変更
初期作成時のLambdaのタイムアウトは5秒です。
スクレイピングには時間がかかるのでタイムアウト値も変更しましょう。

8. まとめ
今回はSeleniumをAWS Lambda上で動作させる際の手順についてまとめました。
PC上ではなくて、Lambda上で実施できるのはかなりメリットがありますね。
Pythonのオススメ勉強方法
私がオススメするPythonの効果的な学習方法は「Udemy(ユーデミー)」によるビデオ学習です。
「Udemy」は、オンライン学習の提供サイトです。学びたい人は多くある講座の中から受講したいコースを選択することができ、動画で学べるのが特徴です。
多くあるPythonのコースの中でもオススメするPythonのコースは以下となります!!
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
このコースでは合計で28.5時間のビデオ講座があって、それらを受講するだけで、Pythonの基礎から応用まで学ぶことができます。
私も購入して受講していますが、内容としては初心者の方から上級者まで対応する幅広い内容になっています。
下手な書籍を何冊か購入するより、この動画コースを最初からじっくりと受けることで総合的なスキルを習得することができるできます。おそらくこれ以上の教材はないと思いますので、絶対おすすめです。
今回は以上となります。
コメント