takashiskiのブログ

覚書の殴り書き

cloud functionsでplaywrightを動かす

「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 });
      }
    );
....

github.com

github.com

PubSubトリガーならそのまま動いた

今回やりたかったのは、実はスクレイピングのコードを定期的に呼ぶことでした。 Cloud SchedulerからCloud FunctionsをHTTPで呼び出せばいいかなと思ってたのですが、権限のあれこれなどがあってPubSubトリガーが推奨のようでした。 なので、PubSubトリガーに置き換えたところ、chromiumが見つからないという最初に出ていたエラーで動作しなくなりました。

色々追っかけた結果、前述のchrome-aws-lambdaで置き換えていることが問題で、単純なchromium.launch()に置き換えたところあっさり動作しました。

  • メモリは512MB以上
  • PubSubトリガーならローカルで動くコードがそのまま移植できる
  • HTTPトリガーだとそのまま移植はできないが、一部書き換えることで動作させられる