Si quieres programar funciones para que se ejecuten en momentos específicos, usa el controlador onSchedule
que proporciona firebase-functions/v2/scheduler
.
Estas funciones usan Cloud Scheduler
para invocar la lógica de las funciones en los momentos o intervalos que tú definas.
Antes de comenzar
Para usar esta solución en tu proyecto de Firebase, este debe tener el plan de precios Blaze. Si aún no lo tienes, actualiza tu plan de precios.
Aunque la facturación es obligatoria, el costo general del plan es controlable, ya que cada trabajo de Cloud Scheduler tiene un valor mensual de $0.10 y cada Cuenta de Google puede tener hasta tres trabajos sin cargo. Usa la calculadora de precios de Blaze para obtener una estimación de los costos en función del uso proyectado.
La API de Cloud Scheduler debe estar habilitada en tu proyecto. Ya deberían estar habilitadas para la mayoría de los proyectos de Firebase. Confírmalo en la consola de Google Cloud Platform.
Escribe una función programada
En Cloud Functions para Firebase, la lógica de la programación reside en el código de tus funciones, sin requisitos especiales de tiempo de implementación. Por ejemplo, para limpiar cuentas de usuario inactivas una vez al día, puedes escribir una función que comience con las siguientes sentencias de importación:
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 (versión preliminar)
# 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()
Luego, podrías usar onSchedule
para iniciar una tarea de 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 (vista previa)
# 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()
Las sintaxis de Unix Crontab y de App Engine son compatibles con Cloud Scheduler. Por ejemplo, para usar Crontab, haz algo como lo siguiente:
Node.js
exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
// ...
});
Python (versión preliminar)
@scheduler_fn.on_schedule(schedule="5 11 * * *")
Implementa una función programada
Cuando implementas una función programada, se crean automáticamente un trabajo de programador y una función de HTTP. Firebase CLI repite el nombre de la función, y puedes ver el trabajo y la función en la Consola de GCP. Se asigna un nombre al tema según esta convención:
firebase-schedule-function_name-region
Por ejemplo:
firebase-schedule-accountcleanup-us-east1.
A la hora programada, la cuenta de servicio de procesamiento predeterminada invoca la función de HTTP asociada. Esto significa que solo el trabajo asociado de Cloud Scheduler tiene permiso para ejecutar la función.