関数のスケジュール設定

指定した時刻に実行されるように関数をスケジュール設定する場合は、firebase-functions/v2/scheduler サブパッケージを使用します。この onSchedule メソッドにより、Pub/Sub トピックが作成され、Cloud Scheduler を使用してこのトピックに関するイベントがトリガーされるため、希望するスケジュールどおりに確実に関数が実行されます。

始める前に

Firebase プロジェクトでこのソリューションを使用するには、プロジェクトに Blaze 料金プランを適用している必要があります。Blaze プランをまだ適用していない場合は、料金プランをアップグレードしてください。

有償にはなりますが、Cloud Scheduler の各ジョブのコストは月額 $0.10(USD)です。また、Google アカウントごとに 3 つのジョブを無料で使用できます。そのため、全体的なコストとしては比較的手頃な範囲に抑えることができます。Blaze の料金計算ツールを使用すると、予想使用量に基づく料金見積もりを作成できます。

プロジェクトで Pub/Sub API と Cloud Scheduler API を有効にする必要があります。これらはほとんどの Firebase プロジェクトですでに有効になっているはずです。Google Cloud Platform Console でご確認ください。

スケジュール設定された関数を記述する

Cloud Functions for Firebase では、スケジューリング ロジックは関数コード内に記述します。デプロイ時の特別な要件はありません。スケジュール設定された関数を作成するには、onSchedule を使用して Cloud Scheduler タスクを開始します。たとえば、非アクティブなユーザー アカウントを 1 日に 1 回クリーンアップするには、次のようなコードを使用します。

// Run once a day at midnight, to clean up the users
// Manually run the task here https://console.cloud.google.com/cloudscheduler
exports.accountcleanup = onSchedule("every day 00:00", async (event) => {
  // Fetch all user details.
  const inactiveUsers = await getInactiveUsers();

  // Use a pool so that we delete maximum `MAX_CONCURRENT` users in parallel.
  const promisePool = new PromisePool(
      () => deleteInactiveUser(inactiveUsers),
      MAX_CONCURRENT,
  );
  await promisePool.start();

  logger.log("User cleanup finished");
});

Cloud Scheduler では、Unix の Crontab と App Engine 構文の両方をサポートしています。たとえば、Crontab を使用して、スケジュール設定された関数を実行する特定のタイムゾーンを選択するには、次のように記述します。

exports.scheduledFunctionCrontab = functions.pubsub.schedule('5 11 * * *')
  .timeZone('America/New_York') // Users can choose timezone - default is UTC
  .onRun((context) => {
  console.log('This will be run every day at 11:05 AM Eastern!');
  return null;
});

timeZone の値は、tz database から取得したタイムゾーン名にする必要があります。サポートされているプロパティの詳細については、Cloud Scheduler リファレンス をご覧ください。

スケジュール設定された関数をデプロイする

スケジュール設定された関数をデプロイすると、関連するスケジューラ ジョブと Pub/Sub トピックが自動的に作成されます。Firebase CLI にトピック名がエコーされます。GCP コンソール でもジョブとトピックを確認できます。トピックには、次の規則に従って名前が付けられます。

firebase-scheduled-function_name-region

例:

firebase-scheduled-scheduledFunctionCrontab-us-east1