「playwrightでスクレイピングするコード」をcloud functionsに置こうとしたらハマったりハマらなかったりしたので覚え書き。
全体
メモリは256MBだとメモリ不足で落ちます。 512MB以上に設定してください。
HTTPトリガーは癖がある
HTTPトリガーは、chromiumが見つからないというエラーでそのままでは動作しません。 幸い、playwrightリポジトリのissueにもいくらか投稿があり、暫定対策手段の言及がありました。
結論から言うと、chrome-aws-lambdaを依存関係に追加して、ブラウザ作成部分を以下のコードに置き換えれば動作します。
npm install -S chrome-aws-lambda
import { chromium } from 'playwright-core'; import * as bundledChromium from 'chrome-aws-lambda'; .... const browser = await Promise.resolve(bundledChromium.executablePath).then( (executablePath) => { if (!executablePath) { // local execution return chromium.launch({}); } return chromium.launch({ executablePath }); } ); ....
PubSubトリガーならそのまま動いた
今回やりたかったのは、実はスクレイピングのコードを定期的に呼ぶことでした。 Cloud SchedulerからCloud FunctionsをHTTPで呼び出せばいいかなと思ってたのですが、権限のあれこれなどがあってPubSubトリガーが推奨のようでした。 なので、PubSubトリガーに置き換えたところ、chromiumが見つからないという最初に出ていたエラーで動作しなくなりました。
色々追っかけた結果、前述のchrome-aws-lambdaで置き換えていることが問題で、単純なchromium.launch()に置き換えたところあっさり動作しました。
〆
- メモリは512MB以上
- PubSubトリガーならローカルで動くコードがそのまま移植できる
- HTTPトリガーだとそのまま移植はできないが、一部書き換えることで動作させられる