【AWS Lambda】Pythonのseleniumで定期実行する

AWS Lambdaを利用することでPythonのプログラムを定期実行することが可能になります。
本記事ではAWS LambdaにPythonプログラムをデプロイ、定期実行までの設定を行う方法を解説します。
AWSにサインイン
自身のアカウントでサインインします。
地域を選択
東京リージョンを選択します。

Cloud9で環境作成
Cloud9にアクセス
cloud9と入力してCloud9をクリックします。

Create environment
Create environmentをクリックします。

環境名を入力します。

Configure settingsはデフォルトのままでNext Stepをクリックします。
Review画面でCreate environmentをクリックします。
Pythonバージョン確認
Cloud9上でpython -Vを入力してPython3.7であることを確認します。

ライブラリのインストール
Cloud9上で個人的によく使用しているライブラリをインストールしています。インストールするライブラリはご自身の環境に合わせてインストールしてください。
pip install selenium==3.141.0 -t python/lib/python3.7/site-packages
pip install pandas -t python/lib/python3.7/site-packages
pip install tweepy -t python/lib/python3.7/site-packages
pip install beautifulsoup4 -t python/lib/python3.7/site-packages
pip install oauth2client -t python/lib/python3.7/site-packages
pip install gspread -t python/lib/python3.7/site-packages
pip install pytz -t python/lib/python3.7/site-packages
pip install Pillow -t python/lib/python3.7/site-packages
chromedriver、headless-chromiumのインストール
Cloud9上で保存用ディレクトリを作成します。
mkdir -p headless/python/bin
カレントディレクトリを変更します。
cd headless/python/bin
headless-chromiumをインストールします。
curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
ファイルを展開してzipを削除します。
unzip -o headless-chromium.zip -d .
rm headless-chromium.zip
chromedriverをインストールします。
curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
ファイルを展開してzipを削除します。
unzip -o chromedriver.zip -d .
rm chromedriver.zip
python、headlessフォルダをローカル環境にダウンロード
selenium等のライブラリが入っているpythonフォルダおよびchromedriver、headless-chromiumが入っているheadlessフォルダをダウンロードします。

AWS lambdaにライブラリ、chromedriver・headless-chromiumをアップロード
lambdaにアクセス
lambdaと入力してLambdaをクリックします

レイヤーをクリック
レイヤーをクリックします。

headless(chromedriver、headless-chromium)レイヤーの作成
レイヤーの作成をクリックします。

名前:headless
.zipファイルをアップロードにチェックし、headless.zipをアップロード
ランタイム:Python3.7
作成をクリックします。

いずれかの方法でライブラリ用のレイヤーを作成してください
ライブラリ用レイヤーの作成①
レイヤーの作成をクリックします。

名前:selenium
.zipファイルをアップロードにチェックし、python.zipをアップロード
ランタイム:Python3.7
作成をクリックします。

Amazon S3によるライブラリ用レイヤーの作成(50MBを超える場合)②
S3をクリックします。

バケットを作成をクリックします。

バケット名を入力してバケットを作成をクリックします。

作成したバケットをクリックします。

アップロードをクリックします。

アップロードするフォルダ(画像はzipだが、展開しているPythonフォルダ)をドラッグ&ドロップしてアップロードをクリックします。

アップロードしたファイル(画像はzipだが、展開しているPythonフォルダ)をクリックします。

オブジェクトURLをコピーします。

レイヤーの作成をクリックします。

名前:selenium(python-libraryとなっていますが、後述の内容に合わせてseleniumとします。)
Amazon S3からファイルをアップロードするにチェックし、python.zipをアップロード
ランタイム:Python3.7
作成をクリックします。

AWS lambda selenium動作確認
関数を選択
関数をクリックします。

関数の作成
関数の作成をクリックします。

関数名:test
ランタイム:python3.7

レイヤーを追加
レイヤーの追加をクリックします。

カスタムレイヤーにチェック
カスタムレイヤー:headless
バージョン:適用したいバージョン(今回は1)

カスタムレイヤーにチェック
カスタムレイヤー:selenium
バージョン:適用したいバージョン(今回は1)

いずれかの方法でコードをデプロイしてください
コードの記入後Deployクリック①
lambda_function.pyに動作させたいコードを記述します。

テスト用として使用したコードを下記に記載します。
# python配下自動でimport
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/python/bin/headless-chromium"
#ブラウザの定義
browser = webdriver.Chrome(
"/opt/headless/python/bin/chromedriver",
options=options
)
browser.get(URL)
title = browser.title
browser.close()
return title
ローカル環境のファイルをアップロード②
ファイルのアップロード方法は
①フォルダをzip化
②アップロード元 > .zipファイル
③zipファイル選択
です。
基本設定の変更
設定タブから編集をクリックします。

メモリ:256MB(メモリ不足の場合は増やしてください。)
タイムアウト:3分3秒

動作テスト
Testをクリックします。

適当にイベント名を入力して作成をクリックします。

もう一度Testをクリックします。

正常に実行できることを確認します。

定期実行設定
設定方法
トリガーを追加をクリックします。

CloudWatch Eventsをクリックします。

新規ルールの作成にチェック
ルール名:rule-1hour
スケジュール式:rate(1 hour)
追加をクリックします。
こちらでは1時間ごとに定期実行するように設定しています。

定期実行のログ確認
モニタリングタブ > ログ > 1時間を選択
直近1時間のログが確認できます。

これで設定した間隔でPythonのプログラムが動作するようになりました。
以上でAWS LambdaへのPythonプログラムのデプロイは完了です。
良かったら他の記事も見てください。
Discussion