Guia
Crie um kill switch para o Firebase: desative o faturamento automaticamente
21 de outubro de 2026 · 7 min de leitura
Passo a passo: uma Cloud Function no tópico do Pub/Sub do seu orçamento que desconecta o faturamento ao passar do seu limite, com o código, o papel do IAM necessário e onde ela deixa a desejar.
O que você vai construir
Uma Cloud Function inscrita no tópico do Pub/Sub do seu orçamento. Sempre que o Google publica o status do orçamento, a função verifica os gastos e, ao passar do seu limite, remove a conta de faturamento do projeto. O Google documenta exatamente esse padrão em Disable billing usage with notifications, e o Firebase aponta para ele na página evitar faturas inesperadas.
Leia as consequências primeiro. O próprio aviso do Google: "This tutorial removes Cloud Billing from your project, shutting down all resources." ("este tutorial remove o Cloud Billing do seu projeto, desativando todos os recursos.") e "Resources might be irretrievably deleted." ("os recursos podem ser excluídos de forma irrecuperável.") Veja o que acontece quando o faturamento para.
1. Conecte o orçamento ao Pub/Sub
No console do Google Cloud, abra Billing → Budgets & alerts, edite seu orçamento e, em notificações, conecte um tópico do Pub/Sub (por exemplo, billing-alerts). O Google então publica o status do orçamento nele "multiple times per day" ("várias vezes ao dia"), mesmo quando não há uso.
Cada mensagem é um JSON em base64 com campos como estes:
{
"budgetDisplayName": "my-project budget",
"costAmount": 142.37,
"costIntervalStart": "2026-10-01T07:00:00Z",
"budgetAmount": 100,
"budgetAmountType": "SPECIFIED_AMOUNT",
"alertThresholdExceeded": 1.0,
"currencyCode": "USD"
}2. Dê à conta de serviço da função direitos de faturamento
A função roda como uma conta de serviço que precisa poder alterar o faturamento do projeto. O tutorial do Google concede a ela o papel roles/billing.admin (Billing Account Administrator) na conta de faturamento. É um papel poderoso: use uma conta de serviço dedicada apenas a essa função.
3. A função
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}`);
},
);Teste-a em um projeto descartável com um orçamento pequeno antes de confiar nela em um projeto real.
Onde a versão faça você mesmo deixa a desejar
- É tudo ou nada. Não existe meio-termo entre "continuar gastando" e "desligar tudo", então a maioria das pessoas define o limite alto e torce.
- Ela herda o atraso dos relatórios. O próprio Google diz que seguir estes passos "doesn't guarantee that you won't spend more than your budget" ("não garante que você não gastará mais do que o seu orçamento").
- Ninguém vigia o vigia. Se o tópico, o orçamento ou a permissão quebrar, a função simplesmente nunca roda, sem avisar.
- Um projeto de cada vez. Cada projeto precisa do seu próprio orçamento, tópico, função e configuração de IAM.
O FireShield é esse kill switch como serviço: orçamentos sincronizados para você, um webhook de Soft Kill antes do Hard Kill, alertas por e-mail, Slack e Telegram, um log de auditoria de cada ação e detecção de picos de uso no plano Pro.
