AWS LambdaでSeleniumとActiveRecordを扱う

気付いたらもう9月ですね。 最近、AWS Lambdaでいろいろと遊ぶ機会があったのでメモとして残します。 はじめに とあるセキュリティゲームの運営用に、SeleniumでWebスクレイピングをやっているRubyのスクリプトをEC2で運用していたのですが、Headless Chromeを扱うため大量に起動するとメモリ食っちゃうし、スケールしようにもEC2インスタンスのAutoScaling組むのもちょっとなあ。とか、インスタンスの起動まで待ってられないからある程度多めにインスタンスを実行したりするのも余分にコストが。。。 1実行に15分もかからないスクリプトだし、ということでLambdaに移行することにしました。 Lambda Layerについて Headless Chromeを扱う場合、単純にFunctionのデプロイパッケージにバイナリを含めると50MBを超えてしまうため、Lambdaのクォータ(制限)にかかります。 今ではLambda Layerという仕組みができていてFunctionとは別に、Functionの実行に必要なライブラリやバイナリファイルをデプロイパッケージとして作成できます。それをアップロードし、Layerとして追加することでコンテナ内の/optとして展開されます。ただし、Layerの展開後のサイズが250MBに収まっている必要があります。 デプロイパッケージの作成 Layerに追加するためのデプロイパッケージを作成します。 ここでは、Layerの再利用性を考慮し、3つのパッケージに分割します。 Headless Chrome font Ruby Gems Headless Chromeのデプロイパッケージ作成 serverless chromeとchromedriverを用意。serverless-chromeとchroomedriverのバージョンは合わせる感じで、chromedriverは chromedriver_linux64.zip をダウンロード。 https://github.com/adieuadieu/serverless-chrome/releases https://chromedriver.storage.googleapis.com/index.html ディレクトリは以下のような感じで作成し、zipで圧縮する。 bin ├── chromedriver └── headless-chromium zip -r headless-chrome.zip bin .fontsのデプロイパッケージ作成 日本語用フォントがインストールされてないと、日本語のページを表示した場合に文字化けしてしまうためフォントパッケージを作成します。 wget https://ipafont.ipa.go.jp/IPAexfont/IPAexfont00201.zip unzip IPAexfont00201.zip mkdir .fonts cp IPAexfont00201/*.ttf .fonts zip -r .fonts.zip .fonts Ruby Gemsパッケージの作成 ActiveRecordなり、rubyでseleniumを扱うためにいろいろとライブラリが必要なのでパッケージを作成します。 ActiveRecordがmysql2を使用するため、mysql2のライブラリもまとめてパッケージにする必要があります。 作成方法は以下が参考になります。 AWS LambdaからRuby + Mysql2でAmazon RDSにつないでみた Using Mysql2 gem in AWS Lambda for Ruby - Medium 上記参考資料からの変更点は、Gemfileのみ。以下のGemfileを作成しました。 »