함수 예약


지정된 시간에 함수를 실행하도록 예약하려면 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에서는 예약 로직이 함수 코드에 있으며 특별한 배포 시간 요구사항도 없습니다. 예를 들어 비활성 사용자 계정을 하루에 한 번 삭제하려면 다음과 같은 import 문으로 시작하는 함수를 작성하면 됩니다.

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()

Unix Crontab 및 App Engine 구문은 모두 Cloud Scheduler에서 지원됩니다. 예를 들어 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 작업에만 함수를 실행할 권한이 있습니다.