En janvier 2023, un développeur indépendant a reçu une facture Google Cloud de 82 000 dollars après que sa clé API Maps ait été volée et utilisée massivement pendant un week-end. Quand il a remarqué le problème le lundi matin, Google Cloud n’avait envoyé qu’une alerte email — sans jamais couper quoi que ce soit automatiquement. C’est le problème fondamental : Google Cloud n’offre pas de hard cap natif sur la facturation. Les budgets et alertes existent, mais ils ne coupent rien. Si vous voulez un vrai kill switch automatique, vous devez le construire vous-même. Ce guide vous explique comment, étape par étape.
Pourquoi Google Cloud n’a pas de disjoncteur natif
AWS, Azure et GCP proposent tous des alertes de facturation. Mais aucun ne coupe automatiquement vos ressources quand vous dépassez un seuil — du moins pas nativement. La raison est commerciale : couper un service en production à cause d’un bug de facturation serait catastrophique pour leurs clients enterprise. Mais pour un dev solo ou une startup, le risque est inverse : une clé API volée ou une boucle infinie peut vous ruiner en 48h.
La solution : combiner l’API Cloud Billing Budget avec une Cloud Function qui désactive automatiquement votre projet ou révoque les clés si le budget est dépassé.
Architecture du kill switch
Voici l’architecture que nous allons construire :
- Un Budget Alert Google Cloud avec seuil à 80% et 100% du budget
- Un topic Pub/Sub qui reçoit les notifications de budget
- Une Cloud Function déclenchée par Pub/Sub qui désactive le projet
- Un Service Account avec les permissions minimales nécessaires
Étape 1 — Créer le topic Pub/Sub
# Remplacez PROJECT_ID par votre ID de projet
export PROJECT_ID="mon-projet-gcp"
# Créer le topic Pub/Sub
gcloud pubsub topics create billing-alerts \
--project=$PROJECT_ID
# Vérifier la création
gcloud pubsub topics list --project=$PROJECT_ID
Étape 2 — Configurer le Budget Alert
Dans la console Google Cloud, allez dans Billing → Budgets & Alerts → Create Budget :
- Scope : sélectionnez votre projet
- Budget type : Specified amount
- Amount : votre seuil mensuel (ex: 500€)
- Alert thresholds : 50%, 80%, 100%
- Manage notifications → Connect a Pub/Sub topic → sélectionnez « billing-alerts »
Étape 3 — La Cloud Function kill_switch (Python)
Créez un répertoire pour votre fonction et créez le fichier main.py :
import base64
import json
import os
from googleapiclient import discovery
from google.auth import default
def kill_switch(event, context):
"""Cloud Function déclenchée par Pub/Sub quand le budget est dépassé."""
pubsub_data = base64.b64decode(event['data']).decode('utf-8')
budget_notification = json.loads(pubsub_data)
cost_amount = budget_notification.get('costAmount', 0)
budget_amount = budget_notification.get('budgetAmount', 0)
# Ne déclencher le kill switch qu'à 100% du budget
if cost_amount <= budget_amount:
print(f"Budget à {(cost_amount/budget_amount)*100:.1f}% - pas d'action")
return
project_id = os.environ.get('GCP_PROJECT')
print(f"ALERTE: Budget dépassé! {cost_amount} > {budget_amount}")
# Désactiver la facturation du projet
credentials, _ = default()
billing_service = discovery.build('cloudbilling', 'v1', credentials=credentials)
billing_service.projects().updateBillingInfo(
name=f"projects/{project_id}",
body={"billingAccountName": ""} # Chaîne vide = désactiver la facturation
).execute()
print(f"Facturation désactivée pour {project_id}")
Fichier requirements.txt :
google-api-python-client==2.97.0
google-auth==2.22.0
Étape 4 — Créer le Service Account
gcloud iam service-accounts create billing-kill-switch-sa \
--display-name="Billing Kill Switch SA" \
--project=$PROJECT_ID
SA_EMAIL="billing-kill-switch-sa@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${SA_EMAIL}" \
--role="roles/billing.projectManager"
Étape 5 — Déployer la Cloud Function
gcloud functions deploy billing-kill-switch \
--runtime=python311 \
--trigger-topic=billing-alerts \
--entry-point=kill_switch \
--service-account=${SA_EMAIL} \
--set-env-vars=GCP_PROJECT=${PROJECT_ID} \
--region=europe-west1 \
--project=$PROJECT_ID
Étape 6 — Tester avec une simulation Pub/Sub
Ne testez jamais directement avec votre projet de production. Utilisez un projet de test :
gcloud pubsub topics publish billing-alerts \
--message='{"budgetDisplayName":"Kill Switch Budget","alertThresholdExceeded":1.0,"costAmount":600,"budgetAmount":500,"currencyCode":"EUR"}' \
--project=$PROJECT_ID
# Vérifier les logs
gcloud functions logs read billing-kill-switch \
--region=europe-west1 \
--project=$PROJECT_ID \
--limit=20
Alternative : révoquer les clés API plutôt que désactiver le projet
Désactiver la facturation d’un projet coupe tout — y compris vos services en production. Une approche plus chirurgicale : révoquer uniquement les clés API suspectes via l’API Google Keys :
from google.cloud import api_keys_v2
def revoke_api_keys(project_id):
client = api_keys_v2.ApiKeysClient()
parent = f"projects/{project_id}/locations/global"
keys = client.list_keys(parent=parent)
for key in keys:
print(f"Révocation de la clé: {key.name}")
client.delete_key(name=key.name)
print(f"Toutes les clés API de {project_id} ont été révoquées")
Checklist de mise en place
- ☑ Topic Pub/Sub « billing-alerts » créé
- ☑ Budget Alert configuré avec notifications Pub/Sub
- ☑ Cloud Function déployée et testée sur projet de test
- ☑ Service Account avec permissions billing minimales
- ☑ Procédure de réactivation documentée
- ☑ Alertes email configurées en parallèle
Limites de cette approche
Ce kill switch est efficace mais réactif : il agit après le dépassement de budget, pas en temps réel. Entre la notification Pub/Sub et l’exécution de la fonction, quelques minutes peuvent s’écouler — et en cas de trafic massif, ces quelques minutes peuvent coûter cher. Combinez toujours ce système avec des quotas API stricts par clé et un monitoring temps réel pour une défense en profondeur.
🔐 Vous n’êtes pas sûr que vos clés API et votre configuration cloud soient sécurisées ?
Klack propose un audit sécurité complet : vérification des clés exposées, mise en place de limites de facturation, alertes automatiques et kill switch. Intervention en 24-48h.
