Amazon LambdaでSeleniumを動かしたいとき どうすればいいか調べてみた。

調査
スポンサーリンク

Amazon LambdaでSeleniumを動かすために、やり方を調べました。

 

目次

 


 

「aws lambda chromedriver python」でググってみた

「aws lambda chromedriver python」でググってみた。

 

参考元1:【AWS Lambda】でseleniumを使ってスクレイピングをサーバーレスで行う~前編~

【AWS Lambda】でseleniumを使ってスクレイピングをサーバーレスで行う~前編~ - Qiita
Lambda awsが提供するサーバーレスにコードを実行できるコンピューティングサービスです。 リクエスト数い応じてスケーリングする機能もあり環境構築や負荷分散、メンテナンスの必要もありません。 料金は実行した時間に応じて支払...

AWS Lambdaではサーバレスのため、直接接続して環境をセットアップすることはできない。
⇒事前にLamdaと同じLinux環境下でSeleniumやChromedriverなどをセットアップして、それをZIPにして、Lamdaの起動時にそのZIPを展開することで環境セットアップを行うみたい。

やり方としては以下があるとのこと。

  • DockerでPython環境を立ち上げてインストールする
  • Cloud9を使用する

 

参考元2:AWS Lambda(Python)でSelenium + Headless Chromeの実行

AWS Lambda(Python)でSelenium + Headless Chromeの実行
AWS Lambda(Python)でSelenium + Headless Chromeを動かせてみた際の作業メモです。

Cloud9を使った方法でAWS Lamda環境にSeleniumやChromedriverをインストールしている

 

参考元3:AWS Lambda(Python)でSelenium + Headless Chromeの実行

AWS Lambda(Python)でSelenium + Headless Chromeの実行
AWS Lambda(Python)でSelenium + Headless Chromeを動かせてみた際の作業メモです。

アップロードするlambadフォルダ内に含んでもよいのですが、
ChromeDriverとHeadless-chromiumだけでもLambdaのデプロイサイズ上限である50MBになってしまうので、今回はLambda Layersを利用したいと思います。

AWS Lambda PythonでSeleniumとheadless-chromiumを使ってスクレイピングする方法

Linux上でSeleniumやヘッドレスcheomiumを環境セットアップしているが、このLinuxがどこから出てきたかよくわからない。

Lamda Layerを使う理由として、ChromiumのサイズがLamdaデプロイサイズよりも大きいって言っている。

 

「aws lambda 環境構築」でググってみた

「aws lambda 環境構築」でググってみた。

 

参考元4:Lambda の開始方法

Lambda の開始方法 - AWS Lambda
Lambda の使用を開始するには、Lambda コンソールを使用して関数を作成します。関数の作成は数分で完了し、その呼び出し、ログやメトリクスの表示、データの追跡を行えるようになります。

Lambda の開始方法

デプロイパッケージを使用して、関数コードを Lambda にデプロイします。Lambda では、次の 2 種類のデプロイパッケージがサポートされます。
・関数コードとその依存関係を含む .zip ファイルアーカイブ。
・Open Container Initiative (OCI) の仕様に準拠したコンテナーイメージ。

(AWS公式ドキュメント)Lambda の開始方法

AWS Lamda関数のデプロイ方法として、ZIPファイルのアーカイブ / コンテナイメージ の2パターンある。
※AWSドキュメントをよく読むと、コンテナイメージはAWS ECR上で動くコンテナイメージでないといけないみたい。

 

 

AWS Lambda関数の設定画面から読み解く

AWS Lamdaの関数作成ページでLamda関数の作成方法は以下の4パターンがある。(2021年12月時点)

  • コンテナイメージの場合、Amazon ECRイメージのURIが必要。
  • 一から作成の場合、選択できるPythonのバージョンは「Python 3.9」以外にもPython3.6,3.7,3.8もある。Ladbaレイヤを作る場合は、このバージョンに合わせて作る必要がある。

 

 

AWS Lambdaレイヤについて

参考元5:Lambda レイヤーの作成と共有

Lambda レイヤーの作成と共有 - AWS Lambda
組織内またはパブリックにコードを共有するための Lambda レイヤーを作成します。レイヤーには、ライブラリ、カスタムランタイム、またはその他の依存関係を含めることができます。

Lambda レイヤーは、追加のコードやデータを含めることができる .zip ファイルアーカイブです。レイヤーには、ライブラリ、 カスタムランタイム 、データ、または設定ファイルを含めることができます。レイヤーは、.zip ファイルアーカイブとしてデプロイされた Lambda 関数でのみ使用できます。

Lambda ランタイムごとに、PATH 変数に /opt ディレクトリ内の特定のフォルダが含まれます。レイヤー .zip ファイルアーカイブに同じフォルダ構造を定義すると、関数コードはパスを指定しなくても、レイヤーコンテンツにアクセスできます。

Pythonは以下のパスであれば、特にPATH変数にパスを追加しなくても使える。
・python
・python/lib/python3.9/site-packages (サイトディレクトリ)

Lambda レイヤーの作成と共有

Lambda レイヤーを使えば、AWS Lamda関数に追加のコードやデータを入れることができる。Pythonのライブラリや使いたいソフト/データをLamdaレイヤーで追加することができる。

Pythonは以下のパスであれば、特にPATH変数にパスを追加しなくても使える。
・python
・python/lib/python3.9/site-packages (サイトディレクトリ)

 

 

まとめ

AWS Lambdaではサーバレスのため、直接接続して環境をセットアップすることはできない。
セットアップするには以下の2通りのやり方で対応する必要がありそう。

  1. Lamda LayerにZIPファイルをアーカイブする。
  2. コンテナイメージから作成する。

コンテナイメージから作るには、事前にAWS ECS上に環境をセットアップしてそれをイメージ化する必要があるため、1の「Lamda LayerにZIPファイルをアーカイブする」方法が良さそう。

1の「Lamda LayerにZIPファイルをアーカイブする」方法としては、Cloud9を使う方法、DockerでPython環境を立ち上げてそれをZIP化する方法があるみたい。
Cloud9はAWSのサービスみたいなので、Cloud9でLamda LayerにZIPファイルを作成することにする。

 

本調査の結果、AWS Lambda関数でSeleniumを動かすことができました。
その方法を以下のブログにまとめたので、よろしければご覧ください。

AWS Lambda関数でSeleniumを動かす!
AWS Lambda関数でSeleniumを動かすのに非常に苦労しました。どうにか動作することができたので、備忘録をまとめておきます。

 

 

参考元

  1. 【AWS Lambda】でseleniumを使ってスクレイピングをサーバーレスで行う~前編~
  2. AWS Lambda(Python)でSelenium + Headless Chromeの実行
  3. AWS Lambda PythonでSeleniumとheadless-chromiumを使ってスクレイピングする方法
  4. (AWS公式ドキュメント)Lambda の開始方法
  5. Lambda レイヤーの作成と共有

 

以上!

コメント

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