AWS Lambda上でheadless-chromiumを動かすときのchromedriverとheadless-chromiumのバージョンの組み合わせ調査

調査
スポンサーリンク

AWS Lambda上でheadless-chromiumを動かすときに、chromedriverとheadless-chromiumの組み合わせによっては動作しなかったので、いろいろなバージョンの組み合わせで動作するか調査しました。

・Python 3.7
・Selenium 4.1.0(2021年11月22日リリース)

 

目次

 


 

chromedriverとheadless-chromiumのバージョンの組み合わせ 動作確認結果まとめ

chromedriverとheadless-chromiumのバージョンの組み合わせで動作する/しないものがあったので調べました。
検証環境は次の章以降を参照ください!

headless-chromium
のバージョン
chromedriver
のバージョン
動作結果
v1.0.0-57※1
・chromium 86.0.4240.111
97.0.4692.36※1
・ChromeDriver 97.0.4692.36
・Supports Chrome v97
「(unknown error: DevToolsActivePort file doesn't exist」
で動作せず。
v1.0.0-55
・chromium 69.0.3497.81
97.0.4692.36
・ChromeDriver 97.0.4692.36
・Supports Chrome v97
「(unknown error: DevToolsActivePort file doesn't exist」
で動作せず。
v1.0.0-37
・chromium 64.0.3282.167
2.37
・ChromeDriver v2.37
・Supports Chrome v64-66
正常動作完了
v1.0.0-57
・chromium 86.0.4240.111
2.37
・ChromeDriver v2.37
・Supports Chrome v64-66
「[ERROR] WebDriverException: Message: unknown error:
Chrome failed to start: exited abnormally」でエラー
v1.0.0-55
・chromium 69.0.3497.81
2.37
・ChromeDriver v2.37
・Supports Chrome v64-66
「[ERROR] WebDriverException: Message: unknown error:
Chrome failed to start: exited abnormally」でエラー
v1.0.0-55
・chromium 69.0.3497.81
2.46
・ChromeDriver v2.46
・Supports Chrome v71-73
「[ERROR] WebDriverException: Message: unknown error:
Chrome failed to start: exited abnormally」、
「chrome not reachable」でエラー
v1.0.0-57
・chromium 86.0.4240.111
86.0.4240.22
・ChromeDriver 86.0.4240.22
・Supports Chrome v86
「[ERROR] WebDriverException: Message: unknown error:
Chrome failed to start: exited abnormally」、
「chrome not reachable」でエラー
v1.0.0-55
・chromium 69.0.3497.81
2.44
・ChromeDriver v2.44
・Supports Chrome v69-71
「[ERROR] WebDriverException: Message: unknown error:
Chrome failed to start: exited abnormally」、
「chrome not reachable」でエラー
v1.0.0-54
・chromium 68.0.3440.106
2.42
・ChromeDriver v2.42
・Supports Chrome v68-70
「[ERROR] WebDriverException: Message: unknown error:
Chrome failed to start: exited abnormally」、
「chrome not reachable」でエラー
v1.0.0-51
・chromium 68.0.3440.75
2.42
・ChromeDriver v2.42
・Supports Chrome v68-70
「[ERROR] WebDriverException: Message: unknown error:
Chrome failed to start: exited abnormally」、
「chrome not reachable」でエラー
v1.0.0-50
・chromium 67.0.3396.99
2.41
・ChromeDriver v2.41
・Supports Chrome v67-69
Lamdbaの実行は成功したが、
titleのデータが正しく取れていない。
v1.0.0-47
・chromium 67.0.3396.62
2.41
・ChromeDriver v2.41
・Supports Chrome v67-69
Lamdbaの実行は成功したが、
titleのデータが正しく取れていない。
v1.0.0-46
・chromium 66.0.3359.181
2.40
・ChromeDriver v2.40
・Supports Chrome v66-68
Lamdbaの実行は成功したが、
titleのデータが正しく取れていない。
v1.0.0-46
・chromium 66.0.3359.181
2.37
・ChromeDriver v2.37
・Supports Chrome v64-66
Lamdbaの実行は成功したが、
titleのデータが正しく取れていない。
v1.0.0-41
・chromium 65.0.3325.181
2.38
・ChromeDriver v2.38
・Supports Chrome v65-67
Lamdbaの実行は成功したが、
titleのデータが正しく取れていない。
v1.0.0-41
・chromium 65.0.3325.181
2.37
・ChromeDriver v2.37
・Supports Chrome v64-66
Lamdbaの実行は成功したが、
titleのデータが正しく取れていない。
v1.0.0-39
・chromium 65.0.3325.146
2.38
・ChromeDriver v2.38
・Supports Chrome v65-67
Lamdbaの実行は成功したが、
titleのデータが正しく取れていない。
v1.0.0-38
・cchromium 64.0.3282.186
2.37
・ChromeDriver v2.37
・Supports Chrome v64-66
正常動作完了
  • ※1 2021年12月最新のバージョン

 

調査環境の構築

AWS LambdaではデフォルトPythonの実行環境はありますが、pipやaptなどでインストールした外部ライブラリについては事前にその実行環境にインストールされるように設定しないといけません。
その設定方法として、AWS Lambdaでは「Lambdaレイヤ」と呼ばれるものがあります。

ここではまず、Selenium、chromedriver、headless-chromiumはAWS Cloud9で構築し、それをZIPファイル化し、AWS LambdaレイヤによってそのZIPファイルをAWS Lambda関数にアタッチします。

用途ZIPファイルの名前Lambdaレイヤの名前
PythonのSeleniumライブラリpython.zipselenium
(レイヤにZIPファイルを紐づけ)
headless-chromiumと
chromedriver
headless
_[headless-chromiumのバージョン]
_[chromedriverのバージョン].zip
headless
(ZIPファイルはS3に格納し、
レイヤにはS3のURLを紐づけ)

以下に簡単な構築手順をまとめました。

AWS LambdaレイヤにアタッチするZIPファイルを作成する

AWS LambdaレイヤにアタッチするZIPファイルを2つ作成します。

  • python.zip
    • Seleniumを格納したZIPファイル
    • [python/lib/python3.7/site-packages/*]にSeleniumをインストールします。
  • headless_[headless-chromiumのバージョン]_[chromedriverのバージョン].zip
    • headless-chromiumとchromedriverを格納したZIPファイル
    • [headless/*]に各ファイルをダウンロードします。

 

以下に、AWS Lambdaレイヤ用の環境を準備する方法をまとめました。

  1. AWSマネージメントコンソールにログインする。
  2. AWS Cloud9」にアクセスして、[Create environment]をクリックする。
  3. [Name environment]画面が開いたら、Name、Descriptionを入力して[Next step]をクリックする。
  • Name: 任意のCloud9の環境名(例: python_for_lambda)
  • Description: Cloud9の環境の説明(オプションのため空欄でも可)

 

  1. [Configure settings]画面が開いたら、EC2の最小構成を選択して[Next step]をクリックする。
  • Environment type: [Create a new EC2 instance for environment(direct access)]
  • Instance type: [t2.micro (1 GiB RAM + 1 vCPU)]
  • Platform: [Amazon Linux 2 (recommended)]
  • Cost-saving setting: [After 30 minutes (default)]
  • LAM role: [AWSServiceRoleForAWSCloud9](固定)

 

  1. [Review]画面が開いたら、内容を確認して問題なければ、[Create environment]をクリックする。
  2. EC2の生成が完了したら、以下のようにEC2の編集画面が出てくる。

 

  1. 下部にあるコマンドコンソール部分で以下のコマンドを実行し、Seleniumをインストールする。
$ pip install selenium==4.1.0 -t python/lib/python3.7/site-packages

 

  1. 同じく下部にあるコマンドコンソール部分で以下のコマンドを実行し、headless-chromiumとchromedriverをダウンロードする。
【headless-chromiumのダウンロード】
$ mkdir -p headless
$ curl -SL [stable-headless-chromium-amazonlinuxのダウンロードURL] > headless/headless-chromium.zip
$ unzip -o headless/headless-chromium.zip -d ./headless 
$ rm headless/headless-chromium.zip

【chromedriverのダウンロード】
$ curl -SL [chromedriver_linux64のダウンロードURL] > chromedriver.zip
$ unzip -o chromedriver.zip -d ./headless 
$ rm headless/chromedriver.zip

 

  1. pythonフォルダをpython.zipという名前でダウンロードする。
  2. headlessフォルダをheadless_[headless-chromiumのバージョン]_[chromedriverのバージョン].zipという名前でダウンロードする。

Selenium、headless-chromiumとchromedriverをダウンロード完了すると、Cloud9のフォルダ構成は以下のようになっていると思います。
各フォルダを[右クリック > ダウンロード]を選択することでZIPファイルとしてダウンロードできます。

 

 

補足 headless-chromiumのダウンロードURL

以下のheadless-chromiumのダウンロードページにアクセスします。
https://github.com/adieuadieu/serverless-chrome/releases

 

ダウンロードしたいバージョンのstable + amazonlinuxのリンクをコピーします。
このリンクが[headless-chromiumのダウンロードURL]になります。

 

 

補足 chromedriverのダウンロードURL

以下のchromedriverのダウンロード先がまとまっているページにアクセスします。
https://chromedriver.storage.googleapis.com/

 

ダウンロードしたいバージョンをF12キーでページ内検索して、<Key>~</Key>で囲まれたlinux64版のファイルパスを確認します。
例) バージョン2.38の場合、[2.38/chromedriver_linux64.zip]となります。

このファイルパスに
https://chromedriver.storage.googleapis.com/
を前方につけたものが[chromedriverのダウンロードURL]になります。
例) バージョン2.38の場合、
https://chromedriver.storage.googleapis.com/2.38/chromedriver_linux64.zip
となります。

 

 

Selenium用のLambdaレイヤを作成する

前手順で作成したSeleniumライブラリが格納された「python.zip」を起動させるLambdaレイヤを作成します。

以下に、AWS Lambdaレイヤ用の環境を準備する方法をまとめました。

  1. AWSマネージメントコンソールにログインする。
  2. AWS Lambda」にアクセスする。
  3. 左側のメニューから「その他のリソース > レイヤー」を選択し、「レイヤーの作成」をクリックする。
  4. 「レイヤー設定」画面が表示されるので、以下の設定例を参考に入力し、下部の「作成」ボタンをクリックする。
設定項目設定例
名前selenium
説明任意のものを記入
アップロード方法「.zipファイルをアップロード」にチェック
アップロード対象「python.zip」をアップロード
互換性のあるアーキテクチャ「x86_64」にチェック
互換性のあるランタイム「Python 3.7」を選択

 

  

「レイヤー seleniumのバージョン*が正常に作成されました。」と表示されれば、作成完了です。

 

chrome関連ファイル用のLambdaレイヤを作成する

headless-chromiumとchromedriverをまとめたZIPファイルはサイズが大きいため、AWS Lambdaレイヤの「.zipファイルをアップロード」で設定するとエラーとなってしまいます。

 

そのため、headless-chromiumとchromedriverをまとめたZIPファイルはS3に格納したうえで、「Amazon S3からファイルをアップロードする」でLambdaレイヤの設定を行います。

 

chrome関連のZIPファイルをS3に格納する

  1. AWSマネージメントコンソールにログインする。
  2. AWS S3」にアクセスする。
  3. メニューから「バケット」を選択して、「バケットを作成」ボタンをクリックする。
  4. 「一般的な設定」画面が開くので、以下の設定値を入力し、下部にある「バケットを作成」ボタンをクリックする。
設定項目設定例
バケット名headless-chromium-yyyymmddhhmm
※「yyyymmddhhmm」に日付を入れて一意な名称にしてます
AWSリージョンアジアパシフィック(東京) ap-northeast-1

※自分は、上記設定以外はデフォルトのままに設定しましたが、ご自分の環境に合わせて設定してください。

 

パケット「headless-chromium-yyyymmddhhmm」が正常に作成されました。」と表示され、バケット一覧に作成したバケット名が表示されれば、バケット作成は完了です。
次に、そのバケットにchrome関連のZIPファイルを格納します。

 

  1. バケット一覧の中から、上で作成したバケット名をクリックする。
  2. オブジェクトタブを選択し、「アップロード」ボタンをクリックする。

 

  1. 「アップロード」画面が開いたら、ファイルとフォルダの「ファイルを追加」をクリックして、前章で作成した「headless.zip」をアップロードする。
  2. 「アップロード」画面右下の「アップロード」ボタンをクリックする。

「アップロードが成功しました。」と表示されれば、S3の設定完了です。

 

  1. S3にアップロードした「headless.zip」のオブジェクトURLをメモする。

 

chrome関連ファイル用のLambdaレイヤを作成する

前章で作成したChrome関連ファイルが格納された「headless.zip」を起動させるLambdaレイヤを作成します。

以下に、AWS Lambdaレイヤ用の環境を準備する方法をまとめました。

  1. AWSマネージメントコンソールにログインする。
  2. AWS Lambda」にアクセスする。
  3. 左側のメニューから「その他のリソース > レイヤー」を選択し、「レイヤーの作成」をクリックする。
  4. 「レイヤー設定」画面が表示されるので、以下の設定例を参考に入力し、下部の「作成」ボタンをクリックする。
設定項目設定例
名前headless
説明任意のものを記入
アップロード方法「Amazon S3からファイルをアップロードする」にチェック
Amazon S3のリンクURLS3にアップロードした「headless.zip」のオブジェクトURL
互換性のあるアーキテクチャ「x86_64」にチェック
互換性のあるランタイム「Python 3.7」を選択

 

  

「レイヤー headlessのバージョン*が正常に作成されました。」と表示されれば、作成完了です。

 

AWS Lamda関数を作成する

調査環境用にAWS Lambda関数を作成します。
これまで作成したAWS Lambdaレイヤーを紐づけるような設定を行います。

以下に、調査環境用のAWS Lambda関数を作成する方法をまとめました。

  1. AWSマネージメントコンソールにログインする。
  2. AWS Lambda」にアクセスする。
  3. ダッシュボード画面の右上にある「関数を作成」ボタンをクリックする。
  4. 「関数の作成」画面が表示されるので、以下の設定例を参考に入力し、下部の「関数の作成」ボタンをクリックする。
設定項目設定例
関数の作成 オプション「一から作成」を選択
関数名任意のものを記入 (例:testLambdaFunc)
ランタイムPython 3.7
アーキテクチャ「x86_64」にチェック
デフォルトの実行ロールの変更「AWSポリシーテンプレートから新しいロールを作成」にチェック
ロール名任意のものを記入 (例LambdaTestPolicy)
ポリシーテンプレート オプション「Amazon S3 オブジェクトの読み取り専用アクセス権限」を選択

※「headless.zip」をS3にアップロードしたため、ポリシーにAmazon S3の読み取り専用アクセス権限を付与してます。

 

「関数xxxxxを正常に作成しました。」と表示されれば、Lambda関数の作成はできています。

次に、Lambda関数で実行するコードの記入と、Lambdaレイヤを設定します。

  1. 先ほど作成した関数のページを開き、コードタブを選択する。
  2. 以下のサンプルコードを入力し、「Deploy」をクリックする。
import json
# 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/headless-chromium"
	
    #ブラウザの定義
    browser = webdriver.Chrome(
        "/opt/headless/chromedriver",
        options=options
    )
	
	
    browser.get(URL)
    title = browser.title
    browser.close()
	
    return title
  • Lambdaレイヤは「/opt」ディレクトリ配下に格納されるため/opt/headless/headless-chromium/opt/headless/chromedriverでheadless.zip内のファイルを指定しています。

 

 

  1. 下部にあるレイヤーで「レイヤーの追加」をクリックする。
  2. 「レイヤを追加」画面が開いたら、以下のようにSelenium用のLambdaレイヤを設定して、右下の「追加」ボタンをクリックする。
設定項目設定例
レイヤーソース「カスタムレイヤー」を選択
カスタムレイヤSelenium用のLambdaレイヤで設定したレイヤ名(例:selenium)
バージョン1
(最大5つまで登録できる、レイヤに紐づけているZIPファイルがかわると
バージョンが自動で上がっていく)

 

  1. Lambda関数の設定画面に戻ったら、同様に下部にあるレイヤーで「レイヤーの追加」をクリックする。
  2. 「レイヤを追加」画面が開いたら、以下のようにchrome関連ファイル用のLambdaレイヤを設定して、右下の「追加」ボタンをクリックする。
設定項目設定例
レイヤーソース「カスタムレイヤー」を選択
カスタムレイヤchrome関連ファイル用のLambdaレイヤで設定したレイヤ名(例:headless)
バージョン1
(最大5つまで登録できる、レイヤに紐づけているZIPファイルがかわると
バージョンが自動で上がっていく)

 

  1. Lambda関数の設定画面で、「設定」タブを開き、「編集」ボタンをリリックする。
  2. 「基本設定を編集」画面が開いたら、以下のように設定を変更して右下の「保存」をクリックする。
設定項目設定例
メモリ256MB
タイムアウト3分3秒
それ以外デフォルトの設定のまま

※デフォルトの設定だとタイムアウトやメモリ不足となるため、少し多めに変更しています。

 

以上で調査環境の構築は完了です。

 

サンプルプログラムの動作確認

上で構築した調査環境でテストを実施します。

  1. Lambda関数の設定画面で、「テスト」タブを開き、特に変更せず「テスト」ボタンをクリックする。

 

実行結果が成功となれば動作しています!

 

 

以上!

コメント

タイトルとURLをコピーしました