概要

Google Cloud Run functionsで動的コンテンツをスクレイピングするために、Node.jsとPuppeteerを使用する方法を検証しました。
最新バージョンでの情報が少なかったため、情報をまとめます。

初期実装

旧バージョンのサンプルなどを参考に、Puppeteer の最新バージョンを指定したソースコードを作成しました。
index.js:

const puppeteer = require('puppeteer')

exports.puppeteerTest = async (req, res) => {
  const browser = await puppeteer.launch({
    headless: 'new',
  })
  const page = await browser.newPage()
  await page.goto('https://www.iret.co.jp')
  res.send(await page.content())
  await browser.close()
}

package.json:

{
  "name": "puppeteer-test",
  "version": "0.0.1",
  "dependencies": {
    "puppeteer": "^24.4.0"
  }
}

こちらをランタイムNode.js22でデプロイ、実行、ログを確認したところ、以下のエラーが発生しました。

Error: Could not find Chrome (ver. 134.0.6998.35). This can occur if either
1. you did not perform an installation before running the script (e.g. npx puppeteer browsers install chrome) or
2. your cache path is incorrectly configured (which is: /www-data-home/.cache/puppeteer).
For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.

Cloud Functions向けの設定

調査したところ、キャッシュディレクトリに問題があるようです。
対処方法は公式ドキュメントのトラブルシューティングに記載がありました。
こちらを参考に、以下の設定ファイルを追加しました。
.puppeteerrc.cjs:

const {join} = require('path');

/*
 * @type {import("puppeteer").Configuration}
 */
module.exports = {
  cacheDirectory: join(__dirname, 'node_modules', '.puppeteer_cache'),
};

再度実行したところ、別のエラーが発生しました。

Error: Failed to launch the browser process!
/workspace/node_modules/.puppeteer_cache/chrome/linux-134.0.6998.35/chrome-linux64/chrome: error while loading shared libraries: libgobject-2.0.so.0: cannot open shared object file: No such file or directory
TROUBLESHOOTING: https://pptr.dev/troubleshooting

chromeを動作させるライブラリが足りていないようです。

ベースイメージの変更

設定を確認したところ、ベースイメージは以下の設定となっていました。

gcr.io/serverless-runtimes/google-22/runtimes/nodejs22

デフォルトでは、google-22というスタックが使用されていますが、こちらを確認するとgoogle-22-fullも指定できるようです。

gcr.io/serverless-runtimes/google-22-full/runtimes/nodejs22

こちらに変更して実行したところ、実行に成功してページ内容を取得するところまで確認できました。

まとめ

今回の検証では、Google Cloud Run functions上でPuppeteerを動作させるために、以下の2点の設定が必要でした。

  • キャッシュディレクトリの設定を行う
  • ベースイメージをgoogle-22-fullに指定する

同様の問題に遭遇した方の参考になれば幸いです。