Leçon 8 — Exposer, protéger, surveiller

Quotas, plafonds et budgets

5 min de lecture

Quotas, plafonds et budgets

Trois niveaux de limites

flowchart TD
  R["Requête utilisateur"] --> A["Application : budget par requête, limite par utilisateur"]
  A --> I["Infrastructure : max_instance_count Cloud Run"]
  I --> Q["Quotas Vertex AI : requêtes et tokens par minute"]
  Q --> F["Facturation"]
  F --> B["Budget : alertes à 50, 90, 100 %"]
  B -.->|"notification Pub/Sub"| ACT["Action automatique (optionnelle)"]
NiveauAgitDélaiExemple
Applicationbloqueimmédiat« 30 questions par salarié et par heure »
InfrastructurebloqueimmédiatCloud Run plafonné à 5 instances
Quotabloque (erreur 429)immédiattokens d'entrée par minute et par modèle
Budgetalerte seulementheures (données de facturation différées)e-mail à 90 % de 200 €

Les quotas Vertex AI

Un quota est une limite d'usage d'une API (par minute, par jour), par projet, région et souvent par modèle. Les identifiants se listent en lecture seule :

gcloud beta quotas info list --service=aiplatform.googleapis.com \
  --project=mon-projet-ia-dev --format='value(quotaId)' | grep GenerateContent

Pour beaucoup de modèles Gemini récents, Vertex AI utilise un quota partagé dynamique : la capacité est partagée entre clients et une erreur 429 signale une saturation momentanée plutôt qu'une limite fixe de votre projet. Pour une capacité garantie, il existe le débit provisionné (Provisioned Throughput), payé d'avance. Dans les deux cas, le code doit réessayer avec attente exponentielle (voir Performance, coût et latence à l'échelle).

Pour abaisser volontairement un quota (par exemple limiter un projet de dev), l'API Cloud Quotas expose des préférences de quota, gérables en Terraform avec google_cloud_quotas_quota_preference.

La facture d'un projet IA dépasse son budget de 200 € à 3 h du matin à cause d'un agent qui boucle. Que s'est-il passé côté budget ?

Les plafonds d'infrastructure

Dans le module, Cloud Run est plafonné :

files/app.tf (extrait)
scaling {
  max_instance_count = 5 # plafonne aussi la dépense
}

Cinq instances avec, par exemple, 80 requêtes simultanées chacune (valeur par défaut de Cloud Run) bornent le nombre d'appels en vol vers Gemini, donc la dépense par minute. Au-delà, les requêtes attendent ou reçoivent une erreur 429 de Cloud Run : mieux vaut une file d'attente qu'une facture.

Le budget en Terraform

files/guardrails.tf (extrait)
resource "google_billing_budget" "ai" {
  count           = var.billing_account == null ? 0 : 1
  billing_account = var.billing_account
  display_name    = "${var.prefix}-budget"

  budget_filter { projects = ["projects/${local.number}"] }

  amount {
    specified_amount {
      currency_code = "EUR"
      units         = tostring(var.monthly_budget_eur)
    }
  }

  dynamic "threshold_rules" {
    for_each = [0.5, 0.9, 1.0]
    content { threshold_percent = threshold_rules.value }
  }
}

Quelle combinaison protège le mieux contre un emballement nocturne de la dépense ?

Exercice

Votre projet de dev ne doit jamais dépenser plus de quelques euros par jour en Gemini. Listez trois mécanismes à mettre en place, du plus immédiat au plus lent.

Voir la solution
  1. Dans le code : un compteur de tokens par jour (dans Firestore ou Memorystore) ; au-delà d'un seuil, l'assistant répond « quota de dev atteint ». Effet immédiat.
  2. Préférence de quota abaissée sur GenerateContentInputTokensPerMinutePerRegionPerBaseModel pour le projet de dev (google_cloud_quotas_quota_preference) et max_instance_count = 1. Effet immédiat, côté Google.
  3. Budget mensuel filtré sur le projet, alertes à 50/90/100 %, notification Pub/Sub vers le canal de l'équipe. Effet différé, sert à détecter.

Option drastique : une fonction abonnée au Pub/Sub du budget qui détache le compte de facturation du projet de dev. À réserver à la dev, car elle arrête tous les services du projet.

Résultat obtenu

Commandes réelles du 2026-10-15, en lecture seule (projet masqué). Les quotas GenerateContent du projet de test :

$ gcloud beta quotas info list --service=aiplatform.googleapis.com --project=<projet> \
    --format='value(quotaId)' | grep -E 'GenerateContent(Input|Output|Requests)'
GenerateContentInputTokensPerMinutePerRegionPerBaseModel
GenerateContentOutputTokensPerMinutePerRegionPerBaseModel
GenerateContentRequestsPerMinutePerProjectPerRegionPerBaseModel

Le budget, planifié avec un compte de facturation factice (terraform plan, extrait) :

  # google_billing_budget.ai[0] will be created
      + amount {
          + specified_amount {
              + currency_code = "EUR"
              + units         = "200"
            }
        }
      + threshold_rules {
          + spend_basis       = "CURRENT_SPEND"
          + threshold_percent = 0.5
        }
      ...

Je sais faire

  • Distinguer ce qui bloque (quota, plafond, code) de ce qui alerte (budget)
  • Lister les quotas Vertex AI d'un projet
  • Plafonner Cloud Run pour borner la dépense
  • Déclarer un budget avec seuils en Terraform
Suivant