PuppeteerをFirebase Cloud Functionsで動かす

先日Puppeteer入門の記事を書きましたが、今回はその続きで、Puppeteerを用いたスクレイピングプログラムをfirebase cloud functionsにデプロイしたいと思います。

PuppeteerでHeadlessブラウザ入門

大好きなgoogle cloud functionsでheadlessブラウザを動かしてスクレイピングできると聞きつけたので早速入門。

firebase cloud functionsの環境はtypescriptを使用しています。

参考記事

How to Use Puppeteer With Firebase Cloud Functions

Use puppeteer in Firebase Cloud Functions to perform serverside rendering of web applications.

Node8を指定する

Puppeteerを使用するにはNodeのバージョンが8かそれ以上である必要があるため、firebase functionsのプロジェクトにあるpackage.jsonでベータ版であるNode8ランタイムを指定します。

{
    // 省略
    "engines": {
        "node": "8"
    }
}

要参照: Node.js のバージョンを設定する - firebase

tsconfigにdom libraryを追加する

Puppeteerはウェブブラウザーなので、domの操作が必要になります。デフォルトではtsconfig.jsonにDOM libは含まれていないので、追記しましょう。

{
    "compilerOptions": {
        "lib": ["es7", "dom"], // <-- ここ
            // ...
    }
}

メモリ割り当てを指定する

Puppeteerはメモリを多く消費するため、メモリの割り当てを指定しましょう。 自分の作った関数は処理に時間がかかったため、defaultのtimeoutである1分を超えるようであればmemoryと一緒にrunWithで指定しましょう。

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


export default functions.runWith({
  timeoutSeconds: 200,
  memory: '1GB'
}).// 省略

firebaseのタイムアウトとメモリ割り当てを設定するによると、memoryとtimeoutは以下の値まで設定できるようです。

timeoutSeconds の最大値は 540(9 分)です。memory に有効な値は次のとおりです。

  • 128MB
  • 256MB
  • 512MB
  • 1GB
  • 2GB

要参照: タイムアウトとメモリ割り当てを設定する - firebase

関数を作成する

あとは自由にpuppeteerの処理を関数に記述するだけです。

export functions
    .runWith({
        timeoutSeconds: 200,
        memory: '1GB'
    })
    .https.onRequest(async (req, res) => {

        // headlessブラウザー指定と'--no-sandbox'のオプションを忘れずに
        const browser = await puppeteer.launch({
            headless: true,
            args: ['--no-sandbox', '--disable-setuid-sandbox'],
        });
        const page = await browser.newPage();

        // puppeteerの処理を記述する

        return res.status(200).json({
            result: "finished",
        });
    });

以上!

Share Comments
comments powered by Disqus