Se você quiser programar funções para serem executadas em horários especificados, use
o gerenciador onSchedule
fornecido por firebase-functions/v2/scheduler
.
Essas funções usam Cloud Scheduler
para invocar a lógica da função nos horários ou intervalos definidos.
Antes de começar
Para usar essa solução no seu projeto do Firebase, é preciso que o projeto esteja no plano de preços Blaze. Se ainda não estiver no plano Blaze, faça upgrade do seu plano de preços.
O faturamento é obrigatório, mas o custo geral é gerenciável, porque cada job do Cloud Scheduler custa US$ 0,10 (USD) por mês e há um crédito de três jobs por conta do Google, sem custo financeiro. Use a calculadora de preços do Blaze para gerar uma estimativa de custo com base na projeção de uso.
A API do Cloud Scheduler precisa estar ativada no projeto. Essa API já deve estar ativada na maioria dos projetos do Firebase. Para verificar isso, acesse o console do Google Cloud.
Escrever uma função programada
No Cloud Functions for Firebase, a lógica de programação está no código das funções, sem requisitos especiais de tempo de implantação. Por exemplo, para limpar contas de usuário inativas uma vez por dia, é possível escrever uma função começando com as seguintes declarações de importação:
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()
Em seguida, use onSchedule
para iniciar uma tarefa do 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()
O Cloud Scheduler oferece suporte à sintaxe do Unix Crontab e do App Engine. Por exemplo, para usar o Crontab, faça algo como:
Node.js
exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
// ...
});
Python
@scheduler_fn.on_schedule(schedule="5 11 * * *")
Implantar uma função programada
Quando você implanta uma função programada, um job do programador e uma função HTTP são criados automaticamente. A CLI do Firebase reflete o nome da função, e é possível conferir o job e a função no console do Google Cloud. O nome do tópico é definido conforme a seguinte convenção:
firebase-schedule-function_name-region
Por exemplo:
firebase-schedule-accountcleanup-us-east1.
No horário programado, a conta de serviço padrão de computação invoca a função HTTP associada. Isso significa que apenas o job do Cloud Scheduler associado tem permissão para executar a função.