āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏāĻŽāϝāĻŧā§ āĻāĻžāϞāĻžāύā§āϰ āĻāύā§āϝ āĻĢāĻžāĻāĻļāύ āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰāϤ⧠āĻāĻžāύ, firebase-functions/v2/scheduler
āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāĻĻāϤā§āϤ onSchedule
āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ Cloud Scheduler āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āϏāĻŽāϝāĻŧ āĻŦāĻž āĻŦā§āϝāĻŦāϧāĻžāύ⧠āĻĢāĻžāĻāĻļāύ āϞāĻāĻŋāĻ āĻāĻžāϞ⧠āĻāϰāϤā§āĨ¤
āĻāĻĒāύāĻŋ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻā§
āϝāĻĻāĻŋāĻ āύāĻŋāϰā§āϧāĻžāϰāĻŋāϤ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ āĻŦāĻŋāϞ āĻāϰāĻž āĻšāϝāĻŧ, āĻāĻĒāύāĻŋ āϏāĻžāĻŽāĻā§āϰāĻŋāĻ āĻāϰāĻ āĻĒāϰāĻŋāĻāĻžāϞāύāĻžāϝā§āĻā§āϝ āĻšāĻŦā§ āĻŦāϞ⧠āĻāĻļāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āĻāĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāĻāĻŋ Cloud Scheduler āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻĒā§āϰāϤāĻŋ āĻŽāĻžāϏ⧠$0.10 (USD) āĻāϰāĻ āĻšāϝāĻŧ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋ Google āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§ āϤāĻŋāύāĻāĻŋ āĻāĻžāĻā§āϰ āĻāĻžāϤāĻž āϰāϝāĻŧā§āĻā§, āĻā§āύ⧠āĻāĻžāϰā§āĻ āĻāĻžāĻĄāĻŧāĻžāĻ⧎ āĻāĻĒāύāĻžāϰ āĻ āύā§āĻŽāĻžāύ āĻāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻāĻāĻŋ āĻāϰāĻ āĻ āύā§āĻŽāĻžāύ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻŦā§āϞā§āĻ āĻĒā§āϰāĻžāĻāϏāĻŋāĻ āĻā§āϝāĻžāϞāĻā§āϞā§āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻā§āĻā§āĻā§āϰ āĻāύā§āϝ Cloud Scheduler āĻāĻĒāĻŋāĻāĻ āϏāĻā§āώāĻŽ āĻāϰāĻž āĻāĻŦāĻļā§āϝāĻāĨ¤ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻāύā§āϝ āĻāĻāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āϏāĻā§āϰāĻŋāϝāĻŧ āĻāϰāĻž āĻāĻāĻŋāϤ; āĻāĻĒāύāĻŋ Google āĻā§āϞāĻžāĻāĻĄ āĻāύāϏā§āϞ⧠āϝāĻžāĻāĻžāĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻāĻāĻŋ āύāĻŋāϰā§āϧāĻžāϰāĻŋāϤ āĻĢāĻžāĻāĻļāύ āϞāĻŋāĻā§āύ
Cloud Functions for Firebase āĻ, āϏāĻŽāϝāĻŧāϏā§āĻā§ āϞāĻāĻŋāĻ āĻāĻĒāύāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻā§āĻĄā§ āĻĨāĻžāĻā§, āĻā§āύ⧠āĻŦāĻŋāĻļā§āώ āϏā§āĻĨāĻžāĻĒāύ-āϏāĻŽāϝāĻŧā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻāĻžāĻĄāĻŧāĻžāĻāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ āĻāĻāĻŦāĻžāϰ āύāĻŋāώā§āĻā§āϰāĻŋāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻā§āϞāĻŋ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻāϰāϤā§, āĻāĻĒāύāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāĻŽāĻĻāĻžāύāĻŋ āĻŦāĻŋāĻŦā§āϤāĻŋ āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻāϰ⧠āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āϞāĻŋāĻāϤ⧠āĻĒāĻžāϰā§āύ:
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;
āĻĒāĻžāĻāĻĨāύ
# 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()
āϤāĻžāϰāĻĒāϰā§, āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ Cloud Scheduler āĻāĻžāϏā§āĻ āĻļā§āϰ⧠āĻāϰāϤ⧠onSchedule
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
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");
});
āĻĒāĻžāĻāĻĨāύ
# 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()
āĻāĻāύāĻŋāĻā§āϏ āĻā§āϰāύā§āĻāĻžāĻŦ āĻāĻŦāĻ App Engine āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āĻāĻāϝāĻŧāĻ Cloud Scheduler āĻĻā§āĻŦāĻžāϰāĻž āϏāĻŽāϰā§āĻĨāĻŋāϤāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻā§āϰāύā§āĻāĻžāĻŦ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤā§, āĻāĻāϰāĻāĻŽ āĻāĻŋāĻā§ āĻāϰā§āύ:
Node.js
exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
// ...
});
āĻĒāĻžāĻāĻĨāύ
@scheduler_fn.on_schedule(schedule="5 11 * * *")
āĻāĻāĻāĻŋ āύāĻŋāϰā§āϧāĻžāϰāĻŋāϤ āĻĢāĻžāĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ
āϝāĻāύ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āύāĻŋāϰā§āϧāĻžāϰāĻŋāϤ āĻĢāĻžāĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ, āĻāĻāĻāĻŋ āĻļāĻŋāĻĄāĻŋāĻāϞāĻžāϰ āĻāĻžāĻ āĻāĻŦāĻ āĻāĻāĻāĻŋ HTTP āĻĢāĻžāĻāĻļāύ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤ Firebase CLI āĻĢāĻžāĻāĻļāύā§āϰ āύāĻžāĻŽā§āϰ āĻĒā§āϰāϤāĻŋāϧā§āĻŦāύāĻŋ āĻāϰā§, āĻāĻŦāĻ āĻāĻĒāύāĻŋ Google āĻā§āϞāĻžāĻāĻĄ āĻāύāϏā§āϞ⧠āĻāĻžāĻ āĻāĻŦāĻ āĻĢāĻžāĻāĻļāύ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāύāĻā§āύāĻļāύ āĻ āύā§āϏāĻžāϰ⧠āĻŦāĻŋāώāϝāĻŧāĻāĻŋāϰ āύāĻžāĻŽāĻāϰāĻŖ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§:
āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ-āĻļāĻŋāĻĄāĻŋāĻāϞ- function_name - region
āϝā§āĻŽāύ:
firebase-shedule-accountcleanup-us-east1.
āύāĻŋāϰā§āϧāĻžāϰāĻŋāϤ āϏāĻŽāϝāĻŧā§, āĻĄāĻŋāĻĢāϞā§āĻ āĻāĻŖāύāĻž āĻĒāϰāĻŋāώā§āĻŦāĻž āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϏāĻāĻļā§āϞāĻŋāώā§āĻ HTTP āĻĢāĻžāĻāĻļāύāĻā§ āĻāĻšā§āĻŦāĻžāύ āĻāϰā§āĨ¤ āĻāϰ āĻŽāĻžāύ⧠āĻšāϞ āϝ⧠āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϝā§āĻā§āϤ Cloud Scheduler āĻāĻžāĻā§āϰ āĻĢāĻžāĻāĻļāύ āĻāĻžāϞāĻžāύā§āϰ āĻ āύā§āĻŽāϤāĻŋ āĻāĻā§āĨ¤