関数のスケジュール設定


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

始める前に

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

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

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

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

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 に関数名がエコーされ、Google Cloud コンソールでジョブと関数を確認できます。トピックには、次の規則に従って名前が付けられます。

firebase-schedule-function_name-region

例:

firebase-schedule-accountcleanup-us-east1.

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