はじめに
Firebase Functionsで定期実行をできることを知ったので今回はそれを試してみる。
TL;DR.
試したソースコード
(既存のプロジェクトでやったため、最小構成ではない)
Firebase(+ GCP)の設定
プロジェクト作成
UIからポチポチ設定していく。
名前決めるくらいなのでサクッとすすめる。
アナリティクスはいらなかったので無効にする。
作成したプロジェクトが無料プラン(Spark)だった場合、従量課金制のBlazeにしておく。
(定期実行するのに必要)
GCPの設定
Cloud Scheduler API
とCloud Pub/Sub API
を有効にする必要がある。
APIライブラリ
から有効にしておく。
Firebase CLIの設定
# firebaseにログイン
$ firebase login
# firebase functions 初期設定
$ firebase init functions
> 色々聞かれるので好みの設定をする
> .firebasercとfirebase.json、functionsディレクトリが作成されていればOK
デプロイするフォルダを変更する
デフォルトの設定では作成されたfunctions
ディレクトリにあるpackage.json
を参照してデプロイされる。
このpackage.json
で依存とか解決しているらしい。
※初期設定だとfunctions/lib/index.js
がデプロイ先になる。
ただ、今回はすでにあるプロジェクトをデプロイしたかったので、そのへんを変更していく。
(+階層が1段ずれるのもデプロイのためだけに変更するのも嫌だったので)
変更するにはfirebase.json
に"source": "."
を追加すれば良い。
(今回はカレントディレクトリにしたかったため.
)
合わせてpredeploy
がfunctions
配下のpackage.json
を見るようprefixが付いていたので消しておく。
{
"functions": {
"source": ".",
"predeploy": "npm run build"
}
}
定期実行するコードを書いていく
公式のサンプルを参考にしながら書いていく。
export const sampleJob = functions
// regionはGCPリソース ロケーションと合わせる
.region('asia-northeast1')
// 時間設定。よくあるcronの書き方もできる
.pubsub.schedule('every day 07:00')
// 時間指定しているので、一応タイムゾーンを設定しておく
.timeZone('Asia/Tokyo')
.onRun(context => {
// 処理
}
webpackの設定
webpackでバンドルした結果をデプロイしたかったので設定していく。
多分firebase用の設定はあまりないはず。
const path = require('path');
const nodeExternals = require('webpack-node-externals');
module.exports = {
mode: 'production',
entry: path.join(__dirname, '/app.ts'),
target: 'node',
module: {
rules: [
{
test: /\.ts$/,
use: [
{loader: 'ts-loader'},
{loader: 'eslint-loader'}
],
exclude: /node_modules/
},
{
test: /\.node$/,
use: 'node-loader'
}
]
},
resolve: {
extensions: ['.js', '.json', '.ts'],
modules: [path.join(__dirname, 'src'), 'node_modules']
},
output: {
// これを設定しないとうまくデプロイされなかった
libraryTarget: 'this',
path: path.join(__dirname, 'dist'),
filename: 'app.js'
},
externals: [nodeExternals()]
};
環境変数を設定する
パスワードなどコード上に書きたくないものを環境変数に設定していく。
公式のサンプルを真似てすすめる。
# 環境変数にslackのwebhookURLを設定
$ firebase functions:config:set slack.url=https://hooks.slack.com/services/XXX
取り出すには下記のようにする。
import { config } from 'firebase-functions';
const slackUrl = config().slack.url;
デプロイする
firebase deploy —only functions
でOK。
ただし、deploy complete!
とか言いながら失敗することがあるので、
Webコンソールを確認してデプロイが完了してることを確認した方が良いかも。
まとめ
Firebase Functionsで定期実行する方法をまとめた。
今まで定期実行したい処理がある時はLambdaを使ってたけど、今後はfirebaseで良さそう。
(個人的にGCPに集約したいだけ。)