概要
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に指定する
同様の問題に遭遇した方の参考になれば幸いです。