AWS LambdaでHeadless Chrome + Seleniumを動かす
LambdaでChromeを実行するには
以下2種類の方法がある。
- LambdaLayerを使う
- コンテナをLambdaにデプロイ
結論
- LambdaLayerを使う → 昔はできたが、最近のライタイムではできない。
- コンテナをLambdaにデプロイ → 未検証だけど、こっちならイケるはず。
LambdaLayerではNGな理由
最近のランタイムにはChromeに必要なライブラリが含まれておらず、
かと言ってLambdaLayerでライブラリを差し込んでも依存性の解決が難しくChromeがクラッシュしてしまう。
詳細は以下。
古いランタイムの場合 (Ruby2.5以前)
Amazon Linux OSを使用している。
このイメージには、Chrome動作に必要なライブラリが含まれているため、
ChromeのバイナリをLambdaLayerで差し込んであげれば、
Lambda上でChromeを動作させることが可能だった。
ネットでググって見つかる記事は、全てこっちのパターン。
新しいランタイムの場合 (Ruby2.7以降)
Amazon Linux2 OSを使用している。
このイメージには、Chrome動作に必要なライブラリが含まれていない。
無理矢理ライブラリを差し込んでみたがダメ
Lambda上でapt-get等のパッケージ管理ツールは使えないので、
AmazonLinuxのEC2を立ち上げて、不足しているライブラリをzipで固めて
LambdaLayerとして差し込んでみた。
結果、chromeドライバを起動させるところまでは成功したが、
chromeがクラッシュして起動しなかった。
依存性管理ツールを使っていないので、無理もない...
コンテナデプロイもダメ
Jetsはコンテナデプロイに対応していないので、
今回はコンテナデプロイも採用できない。