PuppeteerをFirebase Cloud Functionsで動かす

Thursday, March 21, 2019

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

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

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",
        });
    });

以上!

programmingpuppeteerfirebasescraping

Seita Uchimura

Software Engineer in Tokyo

バルセロナに来てアウトプットは大事だなと思った話

PolyglotとGoogle Cloud Functionで形態素解析apiを作る