Firebase FunctionsでPuppeteerを動かす

公開日時

Firebase Functions上でPuppeteerを動かしたかったので対応した。

デフォルトだとメモリ割り当てが256MBになっておりメモリ不足でPuppeteerが起動しないため、512MB以上に設定する必要がある。

import puppeteer from 'puppeteer'
import * as functions from 'firebase-functions'

let browser: puppeteer.Browser | null = null

const runtimeOpts: functions.RuntimeOptions = {
  timeoutSeconds: 60,
  memory: '512MB',
}

const puppeteerTest = functions
  .runWith(runtimeOpts)
  .https.onRequest(async (req, resp) => {
    browser = await puppeteer.launch({
      args: [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '-–disable-dev-shm-usage',
        '--disable-gpu',
        '--no-first-run',
        '--no-zygote',
        '--single-process',
        '--lang=en',
      ],
      headless: true,
    })

    const page = await browser.newPage()
    await page.goto('http://example.com', {
      waitUntil: 'networkidle2',
    })

    // DOM操作など

    await browser.close()

    resp.send({
      message: 'ok'
    })
  })

export default puppeteerTest

参考


Related #firebase

SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 92

クロスオリジン分離対応を実施

Firebase Emulator Suiteで起動しているFunctionsから本番のFirestoreにアクセスする

functionsのみエミュレータを使うようにするとできる

Firebase Functions呼び出し時に Error: function terminated. が発生した場合

firebase functions:logで詳細を確認できる

Cloud BuildでFirebase Hostingのデプロイを行う

リポジトリへのpush以外をトリガーにしたい場合に使用

Firebase FunctionsでonCallで実装しているにも関わらずCORSエラーが発生した場合

Cloud Functions(GCP)の管理画面を確認してみる

JestでFirestoreセキュリティルールのテストを書く

Github ActionsでCIを回せるようになった