先日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",
});
});
以上!