関数のスケジュール設定


指定した時間に関数が実行されるようにスケジュールを設定する場合は、firebase-functions/v2/scheduler が提供する onSchedule ハンドラを使用します。これらの関数は、Cloud Scheduler を使用して、定義した時間または間隔で関数のロジックを呼び出します。

準備

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

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

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

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

Cloud Functions for Firebase では、スケジューリング ロジックは関数コード内に記述します。デプロイ時の特別な要件はありません。 たとえば、非アクティブなユーザー アカウントを 1 日に 1 回クリーンアップするには、次のインポート ステートメントで始まる関数を記述します。

Node.js

// The Cloud Functions for Firebase SDK to set up triggers and logging.
const {onSchedule} = require("firebase-functions/v2/scheduler");
const {logger} = require("firebase-functions");

// The Firebase Admin SDK to delete inactive users.
const admin = require("firebase-admin");
admin.initializeApp();

// The es6-promise-pool to limit the concurrency of promises.
const PromisePool = require("es6-promise-pool").default;
// Maximum concurrent account deletions.
const MAX_CONCURRENT = 3;

Python(プレビュー)

# The Cloud Functions for Firebase SDK to set up triggers and logging.
from firebase_functions import scheduler_fn

# The Firebase Admin SDK to delete users.
import firebase_admin
from firebase_admin import auth

firebase_admin.initialize_app()

その後、onSchedule を使用すると Cloud Scheduler タスクを開始できます。

Node.js

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

Python(プレビュー)

# Run once a day at midnight, to clean up inactive users.
# Manually run the task here https://console.cloud.google.com/cloudscheduler
@scheduler_fn.on_schedule(schedule="every day 00:00")
def accountcleanup(event: scheduler_fn.ScheduledEvent) -> None:
    """Delete users who've been inactive for 30 days or more."""
    user_page: auth.ListUsersPage | None = auth.list_users()
    while user_page is not None:
        inactive_uids = [
            user.uid
            for user in user_page.users
            if is_inactive(user, timedelta(days=30))
        ]
        auth.delete_users(inactive_uids)
        user_page = user_page.get_next_page()


Cloud Scheduler では、Unix の Crontab と App Engine 構文の両方がサポートされています。たとえば、Crontab を使用する手順は次のとおりです。

Node.js

exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
  // ...
});

Python(プレビュー)

@scheduler_fn.on_schedule(schedule="5 11 * * *")

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

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

firebase-schedule-function_name-region

次に例を示します。

firebase-schedule-accountcleanup-us-east1。

スケジュールされた時間に、デフォルトのコンピューティング サービス アカウントが関連する HTTP 関数を呼び出します。つまり、関連する Cloud Scheduler ジョブにのみ関数の実行権限があります。