Firebase Functions の cron(関数のスケジュール設定)をロカールエミュレータ上でテストする
Firebase Functions の cron(関数のスケジュール設定)は、まだローカルエミュレータ上での実行がサポートされていないようです(2021年6月25日時点)
スケジュールされた関数をエミュレータでテストするには、いくつかのワークアラウンドがありますが、最も使い勝手の良いワークアラウンドは次のようになるかと思います。
以下のコードでは2つの関数を定義していて、1つはスケジュール実行される runEvery1Min、 もう1つは runEvery1Min を実行する executeRunEvery1Min です。
code:js
exports.runEvery1Min = functions.pubsub.schedule('every 1 minutes').onRun((context) => {
functions.logger.info("Run every 1 minute", {structuredData: true});
return null;
});
if (process.env.FUNCTIONS_EMULATOR === 'true') {
const { PubSub } = require("@google-cloud/pubsub");
const pubsub = new PubSub({ projectId: process.env.GCLOUD_PROJECT });
exports.execRunEvery1Min = functions.https.onRequest(async (request, response) => {
const msgId = await pubsub.topic('firebase-schedule-runEvery1Min').publishJSON({});
response.send(msgId);
});
}
上記コードの詳細
runEvery1Min は、 functions で定期実行される関数です。
execRunEvery1Min は runEvery1Min を呼び出すための関数です。
スケジュール設定された関数の実体は pubsub で、topic 名は firebase-schedule-{関数名}-{region} という規則で命名されます。
エミュレータ上では上記から -region を取り除いたものが topic 名として使用されるようです。
つまり、 firebase-schedule-{関数名} となります。
process.env.FUNCTIONS_EMULATOR === 'true' により、execRunEvery1Min はエミュレータ上でのみデプロイされます。
runEvery1Min の動作を確認したいタイミングで、 execRunEvery1Min を実行したり、execRunEvery1Min を定期的に実行するスクリプトを書くことで、エミュレーターではサポートがされていないスケジュール設定された関数である runEvery1Min のテストを行うことができます。