@seo-maru  2021/02/15更新

AWS LambdaでHeadless Chrome + Seleniumを動かす


LambdaでChromeを実行するには

以下2種類の方法がある。

  1. LambdaLayerを使う
  2. コンテナをLambdaにデプロイ

結論

  1. LambdaLayerを使う → 昔はできたが、最近のライタイムではできない。
  2. コンテナをLambdaにデプロイ → 未検証だけど、こっちならイケるはず。

LambdaLayerではNGな理由

LambdaはランタイムによってOSが異なる

最近のランタイムには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はコンテナデプロイに対応していないので、
今回はコンテナデプロイも採用できない。

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