Guía
Crea un kill switch para Firebase: desactiva la facturación automáticamente
21 de octubre de 2026 · 7 min de lectura
Paso a paso: una Cloud Function en el tema de Pub/Sub de tu presupuesto que desconecta la facturación al superar tu límite, con el código, el rol de IAM que necesita y sus limitaciones.
Qué vas a construir
Una Cloud Function suscrita al tema de Pub/Sub de tu presupuesto. Cada vez que Google publica el estado del presupuesto, la función comprueba el gasto y, si supera tu límite, quita la cuenta de facturación del proyecto. Google documenta exactamente este patrón en Disable billing usage with notifications, y Firebase lo enlaza desde su página evitar facturas inesperadas.
Lee primero las consecuencias. La propia advertencia de Google: "This tutorial removes Cloud Billing from your project, shutting down all resources." («Este tutorial quita Cloud Billing de tu proyecto y apaga todos los recursos.») y "Resources might be irretrievably deleted." («Los recursos podrían eliminarse de forma irrecuperable.») Consulta qué pasa cuando se detiene la facturación.
1. Conecta el presupuesto a Pub/Sub
En la consola de Google Cloud, abre Billing → Budgets & alerts, edita tu presupuesto y, en las notificaciones, conecta un tema de Pub/Sub (por ejemplo billing-alerts). Google publica entonces el estado del presupuesto en él "multiple times per day" («varias veces al día»), incluso cuando no hay uso.
Cada mensaje es un JSON en base64 con campos como estos:
{
"budgetDisplayName": "my-project budget",
"costAmount": 142.37,
"costIntervalStart": "2026-10-01T07:00:00Z",
"budgetAmount": 100,
"budgetAmountType": "SPECIFIED_AMOUNT",
"alertThresholdExceeded": 1.0,
"currencyCode": "USD"
}2. Da permisos de facturación a la cuenta de servicio de la función
La función se ejecuta como una cuenta de servicio que debe poder cambiar la facturación del proyecto. El tutorial de Google le concede roles/billing.admin (Billing Account Administrator) en la cuenta de facturación. Es un rol potente: usa una cuenta de servicio dedicada solo a esta función.
3. La función
import { onMessagePublished } from "firebase-functions/v2/pubsub";
import { GoogleAuth } from "google-auth-library";
const PROJECT_ID = process.env.GCLOUD_PROJECT!;
export const killSwitch = onMessagePublished(
{ topic: "billing-alerts", serviceAccount: "billing-kill@YOUR_PROJECT.iam.gserviceaccount.com" },
async (event) => {
const data = event.data.message.json as { costAmount: number; budgetAmount: number };
if (data.costAmount < data.budgetAmount) return; // still under budget
const auth = new GoogleAuth({ scopes: ["https://www.googleapis.com/auth/cloud-billing"] });
const client = await auth.getClient();
const url = `https://cloudbilling.googleapis.com/v1/projects/${PROJECT_ID}/billingInfo`;
const { data: info } = await client.request<{ billingEnabled?: boolean }>({ url });
if (!info.billingEnabled) return; // already disabled
// An empty billing account name detaches billing from the project.
await client.request({ url, method: "PUT", data: { billingAccountName: "" } });
console.log(`Billing disabled: ${data.costAmount} of ${data.budgetAmount}`);
},
);Pruébala en un proyecto desechable con un presupuesto mínimo antes de confiarle uno real.
Dónde se queda corta la versión hecha a mano
- Es todo o nada. No hay paso intermedio entre «seguir gastando» y «apagarlo todo», así que la mayoría fija el límite alto y cruza los dedos.
- Hereda el retraso de los informes. La propia Google dice que seguir estos pasos "doesn't guarantee that you won't spend more than your budget" («no garantiza que no gastes más que tu presupuesto»).
- Nadie vigila al vigilante. Si el tema, el presupuesto o el permiso se rompen, la función simplemente nunca se ejecuta, sin avisar.
- Un proyecto cada vez. Cada proyecto necesita su propio presupuesto, tema, función y configuración de IAM.
FireShield es este kill switch como servicio: presupuestos sincronizados por ti, un webhook de Soft Kill antes del Hard Kill, alertas por email, Slack y Telegram, un registro de auditoría de cada acción y detección de picos de uso en Pro.
