☁️ GCP (Google Cloud Platform)
Home IDEO-Lab : fondations GCP, réseau Google, Kubernetes natif, data & analytics (BigQuery/Vertex).
Intro : Cloud Computing
IaaS vs PaaS vs SaaS, responsabilité partagée, vocabulaire.
IaaSPaaSSaaSLes 3 grands : AWS / Azure / GCP
Différences culturelles, forces, et où GCP brille (data + réseau Google).
ComparatifForcesOrganisation : Org → Folders → Projects
Hiérarchie, isolation, facturation, quotas, environnements (dev/stage/prod).
OrganizationProjectsCompute Engine (VMs)
Instances, familles (E2/N2/C2/Tau), disques, images, snapshots, autoscaling.
VME2/N2/C2MIGRéseau : VPC (Global)
VPC global, subnets régionaux, routes, firewall rules, Private Google Access.
VPC globalSubnetsFirewallLoad Balancing (Global)
HTTP(S) LB global, TCP/UDP, certificats, CDN intégré, health checks.
L7L4CDNSécurité : IAM (Base)
Rôles, service accounts, least privilege, politiques, organisation entreprise.
IAMService AccountRBACCloud Storage (GCS)
Buckets, classes, lifecycle, versioning, Signed URLs, hosting statique.
BucketsLifecycleSigned URLCloud SQL (PostgreSQL/MySQL)
HA, backups, read replicas, migrations, connexions privées.
PostgreSQLHAReplicasBigQuery (DWH Serverless)
SQL analytique, partitionnement, clustering, coût par requête, exports.
ServerlessPartitionCostGKE (Kubernetes Engine)
Autopilot vs Standard, nodes/pods, ingress, HPA, déploiement Django/API.
KubernetesAutopilotIngressArtifact Registry
Registry Docker/OCI, policies, intégration CI/CD, images signées.
DockerOCICI/CDCloud Run (Containers Serverless)
API/microservices, autoscaling instantané, IAM, révisions, traffic split.
ServerlessRevisionsHTTPSDevOps : Cloud Build
Builds, triggers Git, pipelines, déploiement vers GKE/Run.
CI/CDTriggersObservabilité : Monitoring & Logging
Métriques, dashboards, alerting, logs centralisés, trace/profiler.
MonitoringLoggingTraceSécurité avancée
Cloud Armor, IAP, KMS, VPC Service Controls, Security Command Center.
WAFIAPKMSCoûts & Optimisation
Facturation, Always Free, CUD/SUD, budgets, optimisation GKE/Run.
BudgetsCUDSUDMigration vers GCP
Lift & Shift, replatform, refactor, outils VM/DB, stratégie progressive.
MigrationDBVMCas pratiques IDEO-Lab
Ideo‑Lab sur GCP : GKE, Cloud Run, Armor, BigQuery analytics, DR multi‑région.
Ideo‑LabGKEDRObjectif : poser un cadre solide (définitions + vocabulaire + modèles + responsabilité partagée), avec les pièges les plus fréquents (IAM / bucket public / réseau) et une checklist “Jour 1”.
Modèles de service (vision très concrète)
| Modèle | Idée | Vous gérez | Exemples GCP | Usage typique |
|---|---|---|---|---|
| IaaS | Infra louée (VM, réseau, stockage) | OS + patchs + runtime + app + données | Compute Engine, VPC | “Je veux le contrôle” (legacy, besoins spéciaux, tuning) |
| PaaS | Plateforme managée | App + données + config | Cloud SQL, GKE Autopilot, App Engine, Cloud Run | “Je veux aller vite” (ops réduites, scaling plus simple) |
| SaaS | Produit prêt à l’emploi | Utilisation + gouvernance + données | Workspace, consoles, outils BI, etc. | “Je veux une capacité” (collab, reporting, email…) |
Comment choisir (règle simple)
- Si tu dois patcher l’OS et gérer le runtime : tu es en IaaS.
- Si tu déploies du code/containers et que la plateforme scale pour toi : tu es en PaaS.
- Si tu “utilises” un produit (UI + config) : tu es en SaaS.
Niveau d’abstraction (mental model)
SaaS : "Je consomme un outil" (le fournisseur gère tout)
PaaS : "Je déploie mon application" (je gère la logique + config)
IaaS : "Je gère une machine" (comme un serveur loué, mais élastique)Point clé : plus tu montes (PaaS/SaaS), plus tu gagnes en vitesse et perds en contrôle fin. L’art, c’est de choisir le bon niveau par composant (web, workers, DB, analytics).
Responsabilité partagée (la cause n°1 des incidents)
Le fournisseur (GCP) gère
- Datacenters, énergie, hardware, réseau backbone mondial
- Hyperviseur, couche de virtualisation
- Disponibilité des services managés (selon SLA)
- Patchs internes des services gérés (Cloud SQL infra, etc.)
Vous (client) gérez
- IAM (droits) : qui peut faire quoi
- Données : accès, rétention, classification
- Réseau : firewall rules, exposition publique, segmentation
- AppSec : vulnérabilités, dépendances, secrets
- Coûts : budgets, quotas, logs “bruyants”
“Shared Responsibility Matrix” (ultra pratique)
| Domaine | IaaS (VM) | PaaS (Run/SQL) | SaaS |
|---|---|---|---|
| OS patching | Vous | Fournisseur (souvent) | Fournisseur |
| IAM / accès | Vous | Vous | Vous (gouv.) |
| Réseau / exposition | Vous | Vous (config) | Limité |
| Données | Vous | Vous | Vous |
| Infra physique | Fournisseur | Fournisseur | Fournisseur |
Piège classique : “C’est dans le cloud donc c’est sécurisé.” → Faux. Le cloud est sécurisable, mais la sécurité dépend surtout de vos configurations.
Correspondances rapides (AWS / GCP / Azure)
| Concept | AWS | GCP | Azure | Note |
|---|---|---|---|---|
| VM | EC2 | Compute Engine | Virtual Machines | IaaS “pur” |
| Object Storage | S3 | Cloud Storage | Blob Storage | Bucket/Container |
| VPC/VNet | VPC | VPC (global) | VNet | GCP VPC = global |
| Load Balancer | ALB/NLB | HTTP(S) LB / TCP-UDP LB | App GW / LB | GCP LB souvent global |
| Kubernetes managé | EKS | GKE | AKS | GKE = très mature |
| Serverless containers | Fargate | Cloud Run | Container Apps | Cloud Run = simple & rapide |
| DB relationnelle managée | RDS | Cloud SQL | Azure SQL / DB for PG | HA/replicas |
| Data Warehouse | Redshift | BigQuery | Synapse | BigQuery = serverless |
| Logs/Metrics | CloudWatch | Cloud Logging/Monitoring | Monitor/Log Analytics | Attention au coût logs |
| Secrets | Secrets Manager | Secret Manager | Key Vault | Rotation + IAM |
Astuce : les noms changent, mais les patterns restent les mêmes (réseau + identité + logs + sécurité + coûts).
Vocabulaire clé (celui qui évite 80% des confusions)
| Terme | Définition (simple) | Pourquoi c’est important |
|---|---|---|
| Region | Zone géographique (ex : europe-westX) | Latence + conformité + coût |
| Zone | Sous-ensemble d’une région (datacenter séparé) | HA : multi-zone |
| Project | Unité d’isolation (APIs, quotas, IAM, facturation) | Fondation de tout sur GCP |
| Resource | Objet cloud (VM, bucket, dataset, service…) | IAM se rattache aux ressources |
| IAM Role | Ensemble de permissions | Least privilege |
| Service Account | Identité “machine” pour un workload | Éviter les clés statiques |
| Quota | Limite de consommation | Protection + planification |
| Billing | Compte de facturation lié au projet | Sans budgets = surprise |
Latence / HA (mini rappel)
Même zone -> meilleure latence
Même région -> bonne latence + HA multi-zone possible
Multi-région -> HA ++ mais design plus exigeant (coûts, cohérence)“Philosophie” GCP (ce qui le rend différent)
1) Réseau Google (global)
- Backbone mondial : routage performant entre régions
- Load Balancer souvent global (conception différente)
- Approches multi-régions plus “naturelles”
2) Kubernetes natif
- GKE très mature (héritage Kubernetes “origine Google”)
- Autopilot : Kubernetes plus proche d’un PaaS
- Cloud Run : “container-first”, ultra rapide
3) Data-centric
- BigQuery : analytique serverless (scale énorme)
- Écosystème streaming/ETL : Pub/Sub, Dataflow
- ML managé : Vertex AI
4) Identity & policy
- IAM très structurant : rôles, policies, héritage Org/Folder/Project
- Approche “policy-driven” (guardrails entreprise)
Mental model “GCP = plateformes”
Si ton objectif = aller vite, scaler proprement :
- Cloud Run / GKE Autopilot + Cloud SQL + GCS + LB/Armor + Monitoring
Si ton objectif = data & analytics :
- BigQuery + Pub/Sub + Dataflow + exports logsChecklist “Jour 1” (anti-bêtises)
| Action | Pourquoi | Résultat attendu |
|---|---|---|
| Créer Organisation / Folders / Projects | Isolation (dev/stage/prod), gouvernance | Structure propre + héritage IAM |
| Billing + Budgets + alertes | Éviter explosion de coûts | Alerte mail/webhook avant le drame |
| IAM minimal (least privilege) | Limiter blast radius | Pas de “Owner” partout |
| Réseau : VPC + subnets + firewall | Contrôler exposition + segmentation | Entrées/sorties maîtrisées |
| Logs/Monitoring activés | Debug + sécurité + SLA | Dashboards + alerting |
| Secrets Manager | Éviter secrets en dur | Rotation + audit |
“Landing Zone” minimal (pattern entreprise)
Org
├─ Folder: Prod
│ ├─ Project: app-prod
│ ├─ Project: data-prod
│ └─ Project: sec-prod
└─ Folder: Dev
├─ Project: app-dev
└─ Project: data-dev
Guardrails:
- Budgets + alerting
- Policies (deny public bucket si possible)
- Logs export (vers BigQuery si analytics)
- SA par workload (pas de clés statiques)Pièges & anti-patterns (les vrais)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Bucket public “par erreur” | Fichier accessible sans auth | Fuite de données | Bucket privé + Signed URLs + IAM strict |
| Rôle Owner/Editor partout | Tout le monde peut tout faire | Suppression/compromission massive | Rôles fins + SA dédiés + review |
| VM avec IP publique + SSH ouvert | 22/tcp depuis Internet | Bruteforce / compromission | Bastion / IAP / firewall restrictif |
| Logs en mode “infini” | Volumes énormes | Coût + bruit | Filtrer, réduire rétention, exporter utile |
| Secrets dans le code / env non contrôlée | Clés en dur | Leak + accès non traçable | Secret Manager + IAM + rotation |
| Pas de budgets / pas d’alertes | Surprise facture | Interruption projet | Budgets + alerting dès J1 |
3 règles “anti-galère”
- Tout ce qui est public doit être volontaire (et documenté).
- IAM minimal + service accounts dédiés = sécurité + lisibilité.
- Budgets + logs propres = contrôle coûts + debug rapide.
Si tu veux, on peut ajouter une mini-section “exemples concrets IDEO-Lab” directement ici (web + i18n + NetGuard), mais je l’ai laissée plutôt dans la modal 13.1.
Hypothèses
- Le “pricing engine” est volontairement simplifié (paliers) : il sert à décider un pattern, pas à facturer au centime.
- Les coûts “vrais” dépendent : région, sizing exact, IOPS/SSD, connexions, requêtes, logs, egress, DR.
- Si tu veux être réaliste : branche ensuite un pricing API par cloud, ou un dataset interne (FinOps).
Anti-flood (important chez toi)
- Front-door : WAF + rate-limit + bot rules.
- Cap scaling : limiter max instances/pods et mettre une file si nécessaire.
- Logs : filtrer / sampler, sinon coût + bruit.
Objectif : comparer AWS, Google Cloud (GCP) et Microsoft Azure de façon opérationnelle : mapping des services, forces/faiblesses, coûts (modèles + exemples), sécurité, data/IA, DevOps, observabilité, et une matrice de décision. NB: Les prix varient énormément par région, OS, engagements, et options.
Résumé (très concret)
| Critère | AWS | GCP | Azure |
|---|---|---|---|
| Couverture services | Très large, “tout existe” | Très fort data/analytics + réseau Google | Très fort entreprise + intégration Microsoft |
| Kubernetes | EKS solide, écosystème énorme | GKE souvent vu comme “référence” | AKS mature, intégration Azure AD |
| Serverless | Lambda ultra répandu | Cloud Run très simple pour containers | Functions + intégration enterprise |
| Data Warehouse | Redshift + Athena (S3) | BigQuery (serverless, très fort) | Synapse (SQL/Spark) + écosystème data MS |
| IAM / gouvernance | Très puissant, parfois complexe | IAM clair + org/folders/projects | Azure AD / Entra au centre (énorme atout) |
| “Pourquoi choisir” | Catalogue + flexibilité | Data/ML + simplicité Run/GKE + réseau | Entreprise MS (AD, Windows, O365, SQL) |
Diagramme mental (où chacun “brille”)
DATA/ML + BIGQUERY
^
|
GCP ----------- | ------------------------+
| |
| v
SIMPLICITÉ CONTAINERS INTÉGRATION ENTREPRISE
(Cloud Run) (Entra/AD, Windows, M365)
| |
v |
DEV SPEED Azure
|
+-------------------------> Catalogue + diversité
(AWS)En pratique : beaucoup d’entreprises finissent “multi-cloud” (ou hybride) mais gardent un cloud principal.
Mapping rapide des services (noms équivalents)
| Domaine | AWS | GCP | Azure |
|---|---|---|---|
| VM | EC2 | Compute Engine | Virtual Machines |
| Kubernetes | EKS | GKE | AKS |
| Containers serverless | Fargate / App Runner | Cloud Run | Container Apps |
| Functions | Lambda | Cloud Functions | Azure Functions |
| Load Balancer | ALB/NLB | Cloud Load Balancing | Azure Load Balancer / App Gateway |
| Object storage | S3 | Cloud Storage (GCS) | Blob Storage |
| DB relationnelle | RDS / Aurora | Cloud SQL / AlloyDB | Azure SQL / Database for PostgreSQL |
| NoSQL doc | DynamoDB | Firestore | Cosmos DB |
| Queue / pubsub | SQS/SNS | Pub/Sub | Service Bus / Event Grid |
| Secrets | Secrets Manager | Secret Manager | Key Vault |
| KMS / clés | KMS | Cloud KMS | Key Vault (keys) |
| WAF | AWS WAF | Cloud Armor | WAF (Front Door/App Gateway) |
| Observabilité | CloudWatch | Cloud Monitoring/Logging | Azure Monitor / App Insights |
| Data warehouse | Redshift / Athena | BigQuery | Synapse |
Compute (VM) : modèles de pricing + exemples (ordre de grandeur)
Attention : les VM ne sont pas “1:1” comparables (CPU, perf, burst, réseau, disque, régions). Ici on donne des exemples uniquement, pour illustrer l’écart. Pour du réel : utiliser les calculators officiels.
Exemples VM “general purpose” (USD/heure, on-demand, régions typiques)
| Cloud | Exemple | vCPU / RAM | Prix indicatif | Source |
|---|---|---|---|---|
| AWS | EC2 t3.medium | 2 vCPU / 4 GiB | $0.0416/hr (us-east-1) | instances.vantage + Holori :contentReference[oaicite:1]{index=1} |
| GCP | Compute e2-medium | 2 vCPU / 4 GiB | ~$0.0335/hr (selon région) | gcloud-compute + PriceTimeline :contentReference[oaicite:2]{index=2} |
| Azure | VM B2ms | 2 vCPU / 8 GiB | $0.0832/hr (eastus) | Holori + Vantage :contentReference[oaicite:3]{index=3} |
Ce qu’il faut comparer “vraiment”
- Perf réelle (CPU génération, turbo, steal/burst), pas que vCPU.
- Disque (IOPS/throughput), réseau (egress), et services annexes (LB, NAT, logs).
- Engagements : Spot/Preemptible, réservations, savings plans, committed use.
Compute : pages pricing officielles
- AWS EC2 On-Demand pricing :contentReference[oaicite:4]{index=4}
- GCP Compute Engine pricing :contentReference[oaicite:5]{index=5}
- Azure VM pricing (Windows page, tables par région/OS) :contentReference[oaicite:6]{index=6}
Kubernetes & containers : EKS vs GKE vs AKS
| Critère | EKS (AWS) | GKE (GCP) | AKS (Azure) |
|---|---|---|---|
| Positionnement | K8s managé + large écosystème AWS | K8s “natif Google”, souvent très apprécié | K8s managé + intégration Entra/AD |
| Mode “ops minimal” | Fargate possible pour certains pods | Autopilot (très simple) | AKS + options managées, intégration MS |
| Networking | Très flexible, parfois plus complexe | LB global + intégration réseau Google | VNets + policies enterprise |
| Coûts | Souvent: control-plane + nodes + LB + logs | Autopilot: facturation orientée ressources pods | Nodes + réseau + logs + services associés |
Règle simple de choix
Tu veux K8s mais moins d’ops :
- GKE Autopilot (souvent un très bon départ)
- sinon AKS si ton monde est Microsoft
- sinon EKS si ton écosystème outillage est déjà AWSServerless : Lambda vs Cloud Functions/Run vs Azure Functions
| Cas d’usage | AWS | GCP | Azure |
|---|---|---|---|
| Fonction événementielle | Lambda | Cloud Functions | Azure Functions |
| Container serverless | App Runner / Fargate | Cloud Run | Container Apps |
| Déploiement Web/API | Lambda+API GW ou container | Run (très “clean”) + IAM + revisions | Functions/Container Apps + intégration enterprise |
Pourquoi Cloud Run est souvent “ultra simple”
- Tu pousses un container HTTP, et tu gères revisions + traffic split facilement.
- Bon fit microservices / API / workers HTTP.
Stockage objet & réseau : là où les surprises de facture arrivent
Object storage (ordre de grandeur)
| Service | Prix “standard” indicatif | Remarques |
|---|---|---|
| AWS S3 Standard | ~$0.023/GB-month (tiers, us-east-1) | Dépend tiers + requests + egress :contentReference[oaicite:7]{index=7} |
| GCP Cloud Storage Standard | Exemple dual-region: $0.022/GB-month (selon régions/SKU) | Prix très dépend locational SKU :contentReference[oaicite:8]{index=8} |
| Azure Blob (Hot) | Souvent autour de $0.02/GB-month (selon région/redondance) | Table officielle dépendante région/options :contentReference[oaicite:9]{index=9} |
Réseau : “egress” = poste n°1 de surprise
Règles universelles (tous clouds)
1) Co-localiser compute + data (même région)
2) Utiliser CDN pour statique
3) Surveiller l’egress (dashboards + alertes)
4) Éviter flux inter-région permanentsExemple GCP : le coût change selon intra-zone / inter-zone / inter-region / internet egress. :contentReference[oaicite:10]{index=10}
Bases de données managées : choix “prod”
| Type | AWS | GCP | Azure | Notes |
|---|---|---|---|---|
| SQL (Postgres/MySQL) | RDS / Aurora | Cloud SQL (+ AlloyDB) | Azure SQL / Database for PostgreSQL | Comparer: HA, backups, read replicas, réseau privé, limites connexions |
| NoSQL doc | DynamoDB | Firestore | Cosmos DB | Comparer: modèle, latence, coûts reads/writes, index |
| Cache | ElastiCache | Memorystore | Azure Cache for Redis | Comparer: cluster, persistence, réseau privé |
Conseil “platform”
Si tu héberges une plateforme (IDEO-Lab)
- SQL managé + backups testés + private networking
- stateless app (Run/GKE/EKS/AKS) + cache si besoin
- limiter connexions DB (pooling) + observabilitéAnalytics / DWH : BigQuery vs Athena/Redshift vs Synapse
| Service | Modèle | Prix indicatif “serverless query” | Notes |
|---|---|---|---|
| AWS Athena | Pay-per-query (S3) | $5/TB scanné | Optimiser via partition + Parquet :contentReference[oaicite:11]{index=11} |
| Azure Synapse (Serverless SQL) | Pay-per-query | $5/TB data processed | Serverless SQL pool :contentReference[oaicite:12]{index=12} |
| GCP BigQuery (On-demand) | Pay-per-bytes processed | souvent cité $6.25/TB (varie) + 1 TiB/mois gratuit | 1 TiB free + modèles capacity/slots :contentReference[oaicite:13]{index=13} |
Diagramme : “coût = données scannées”
RAW logs (10 TB/jour) ---> Query sans filtre ---> facture $$$$$$$
|
+--> Partition (date) + clustering + Parquet
|
+--> Query filtrée (ex: 1 jour) ---> facture $Sur les 3 clouds, la discipline “partition + columnar + filtrage” est le meilleur levier coût/perf. :contentReference[oaicite:14]{index=14}
Sécurité & gouvernance : IAM, WAF, keys, posture
| Capacité | AWS | GCP | Azure |
|---|---|---|---|
| IAM / RBAC | IAM + policies (très puissant) | IAM roles + org/folders/projects | Entra ID + RBAC (fort en enterprise) |
| WAF / DDoS | AWS WAF + Shield | Cloud Armor | WAF + DDoS Protection |
| Secrets | Secrets Manager | Secret Manager | Key Vault (secrets) |
| Keys / KMS | KMS | Cloud KMS | Key Vault (keys/HSM) |
| Posture / findings | Security Hub | Security Command Center | Defender for Cloud |
Règles universelles “prod”
1) Least privilege (pas "Admin/Editor" partout)
2) Service accounts / managed identities dédiées
3) WAF + rate-limit devant tout endpoint public
4) Secrets hors repo/images
5) Audit logs + alerting (5xx, auth, spikes)Observabilité : logs, métriques, traces
| Aspect | AWS | GCP | Azure | Note |
|---|---|---|---|---|
| Métriques | CloudWatch | Cloud Monitoring | Azure Monitor | Golden signals: RPS, latence p95, erreurs, saturation |
| Logs | CloudWatch Logs | Cloud Logging | Log Analytics | Le coût logs peut exploser : filtrer/sampler |
| Tracing | X-Ray | Trace | App Insights | Indispensable pour perf backend |
Anti-pattern
Activer "tout le debug" en prod -> logs massifs -> facture + bruit
Solution: logs curated + rétention + export uniquement utileFinOps : réductions & engagements (SUD/CUD vs Savings Plans vs Reservations)
| Cloud | Réduction “usage” | Engagement | Spécificités |
|---|---|---|---|
| AWS | Spot, etc. | Savings Plans / Reserved Instances | Très flexible selon types d’engagement |
| GCP | Sustained Use (selon services) | Committed Use Discounts (CUD) | Souvent simple : mesurer puis commit sur base stable |
| Azure | Spot | Reserved Instances + Savings Plans | Atout : Azure Hybrid Benefit (licences MS) |
Articles comparatifs (pour le modèle de réductions)
- Comparatif discounts / engagements :contentReference[oaicite:15]{index=15}
- Vue d’ensemble 2026 (AWS/Azure/GCP) :contentReference[oaicite:16]{index=16}
Stratégie simple (qui marche)
1) Démarrer on-demand 2-4 semaines (mesure)
2) Identifier la "base stable" (socle)
3) Engager (CUD/SP/RI) uniquement sur le socle
4) Garder le burst en autoscaling/on-demand
=> coût prévisible + flexibilitéMatrice de décision (score rapide)
| Besoin principal | Choix souvent “naturel” | Pourquoi |
|---|---|---|
| Écosystème Microsoft (AD, Windows, SQL Server) | Azure | Intégration identité/licences/outillage |
| Data platform / analytics à grande échelle | GCP | BigQuery + services data/ML + réseau |
| Catalogue maximal + maturité “généraliste” | AWS | Couverture services + écosystème énorme |
| Containers “simple & rapide” | GCP (Run) ou Azure (Container Apps) | Time-to-prod rapide |
| Multi-cloud / exigences d’options | AWS (souvent) + intégrations | Beaucoup de briques et patterns disponibles |
Question clé (qui tranche vite)
Ton "cœur" c’est quoi ?
- Identité & enterprise MS ? -> Azure
- Data/analytics/ML comme différenciant ? -> GCP
- Plateforme généraliste avec 1000 services ? -> AWSPatterns d’architecture (web / API / data) — équivalents
1) Web/API scalable (front-door + WAF)
AWS : CloudFront + ALB + WAF -> ECS/EKS/EC2 -> RDS -> S3
GCP : LB global + Armor -> Run/GKE/CE -> Cloud SQL -> GCS
Azure: Front Door + WAF -> Apps/AKS/VM -> Azure SQL / PostgreSQL -> Blob2) Data lake + query serverless
AWS : S3 (data lake) -> Athena ($5/TB scanned) -> BI
GCP : GCS -> BigQuery (bytes processed; 1 TiB free/mois) -> BI
Azure: ADLS/Blob -> Synapse Serverless ($5/TB processed) -> BI
Sources query pricing: :contentReference[oaicite:17]{index=17}3) Event-driven (queue/pubsub)
AWS : SNS/SQS/EventBridge -> Lambda -> DynamoDB
GCP : Pub/Sub -> Functions/Run -> Firestore
Azure: Event Grid/Service Bus -> Functions -> Cosmos DBPièges & anti-patterns (comparatif)
| Anti-pattern | Impact | Correction |
|---|---|---|
| Comparer “prix VM” sans perf/egress/logs | Mauvais choix → facture/latence | Comparer TCO (compute + storage + egress + logs + ops) |
| Pas de WAF/rate-limit sur endpoints publics | Flood → scaling → coût | WAF (WAF/Armor/FrontDoor WAF) + caps (max instances/HPA max) |
| BigQuery/Athena/Synapse : requêtes “full scan” | Coût explosif | Partition + columnar (Parquet) + filtres |
| Logs “debug” permanents | Coût ingestion + bruit | Logs curated + sampling + rétention |
| IAM trop large | Risque sécurité majeur | Least privilege + groupes + SAs/managed identities dédiés |
| Engagement (CUD/SP/RI) trop tôt | Sur-commit | Mesurer 2-4 semaines puis commit sur base stable |
Conclusion “safe”
Le bon cloud = celui qui colle à ton ADN (data vs enterprise vs catalogue),
ET où tu sais mettre 4 garde-fous :
1) budgets/alertes, 2) WAF+rate-limit, 3) discipline data queries, 4) IAM strict.Objectif : comprendre les forces réelles de chaque cloud, éviter les biais “marketing”, et choisir avec une grille simple : fondations (IAM/réseau/logs), compute, data, ops, coûts.
ADN (culture) : pourquoi ils sont différents
AWS
- Catalogue énorme : un service pour presque tout.
- Écosystème & marketplace ultra vaste.
- Très “infrastructure-first” historiquement, puis managé partout.
- Fort en enterprise, gouvernance, sécurité, options avancées.
Azure
- Microsoft stack : Entra ID (AD), Windows, M365, .NET.
- Hybride très présent dans les grandes entreprises.
- Excellent “fit” si vous êtes déjà dans l’écosystème Microsoft.
GCP
- Réseau global Google : backbone + load balancing souvent global.
- Kubernetes natif : GKE très mature, Cloud Run “container-first”.
- Data/Analytics : BigQuery serverless, pipelines streaming (Pub/Sub/Dataflow).
- Culture “plateforme” : automatisation, scale, data-centric.
Lecture simple
- AWS = le plus large
- Azure = le plus intégré Microsoft
- GCP = le plus “data + réseau + containers”
En pratique : les trois font “tout”. La différence se joue surtout sur la maturité de certains services, les patterns de design (LB global, VPC global), et la cohérence de l’écosystème.
Tableau comparatif (orientation décision)
| Critère | AWS | Azure | GCP | Comment l’interpréter |
|---|---|---|---|---|
| Catalogue | ++++ | +++ | +++ | Besoin “exotique” = AWS souvent a déjà un service |
| Data / Analytics | +++ | +++ | ++++ | GCP brille avec BigQuery + streaming + ML |
| Kubernetes / Containers | +++ | +++ | ++++ | GKE + Cloud Run = combo “simple & solide” |
| Hybride entreprise | +++ | ++++ | ++ | Azure est souvent “naturel” si AD/M365 |
| Réseau global / LB global | +++ | +++ | ++++ | GCP LB global + backbone = plus “natif” multi-région |
| Gouvernance / garde-fous | ++++ | ++++ | +++ | Les 3 le font : l’important = standardiser vos règles |
| Facilité “aller vite” | +++ | +++ | ++++ | Cloud Run / BigQuery réduisent beaucoup d’ops |
| Coûts (lisibilité) | ++ | ++ | +++ | Le vrai levier : budgets + tagging + optimisation |
Important : le coût dépend davantage de votre design (logs, egress, sizing, requêtes) que du fournisseur. Sans budgets/alertes, vous piloterez à l’aveugle.
Mapping des services (équivalences utiles)
| Besoin | AWS | GCP | Azure | Remarque |
|---|---|---|---|---|
| VM | EC2 | Compute Engine | Virtual Machines | IaaS classique |
| Objets (bucket) | S3 | Cloud Storage | Blob Storage | ACL/IAM + lifecycle |
| DB managée (PG/MySQL) | RDS | Cloud SQL | DB for PostgreSQL / Azure SQL | HA + backups |
| NoSQL documents | DynamoDB | Firestore | Cosmos DB | Modèle & latence diffèrent |
| Data warehouse | Redshift | BigQuery | Synapse | BigQuery = serverless |
| Streaming / bus | Kinesis | Pub/Sub | Event Hubs | Ingestion + fan-out |
| ETL / stream processing | Glue / EMR | Dataflow / Dataproc | Data Factory | Batch vs streaming |
| Kubernetes | EKS | GKE | AKS | GKE très “clean” |
| Serverless containers | Fargate | Cloud Run | Container Apps | Run = revisions + traffic split |
| Functions | Lambda | Cloud Functions | Azure Functions | Event-driven |
| Logs/Metrics | CloudWatch | Cloud Logging/Monitoring | Azure Monitor | Rétention & coût |
| Secrets | Secrets Manager | Secret Manager | Key Vault | Rotation + IAM |
| WAF | AWS WAF | Cloud Armor | WAF (Front Door/AppGW) | Rate limit + règles |
Astuce : au lieu de “convertir service par service”, convertis plutôt les patterns : “front-door WAF+LB”, “private network”, “workload identity”, “central logs”, “budgets”.
Décision rapide (arbre de choix)
1) Votre entreprise est "Microsoft-first" (AD/M365/Windows/.NET partout) ?
-> Azure très souvent le meilleur fit
2) Vous voulez le plus grand catalogue + marketplace + options enterprise partout ?
-> AWS est souvent le choix "large"
3) Vous êtes data-centric (analytics/BI/ETL streaming) + microservices containers ?
-> GCP excellent (BigQuery + Pub/Sub/Dataflow + GKE/Run)
4) Vous voulez minimiser l'ops pour une API moderne (containers) ?
-> Cloud Run (GCP) est un candidat très fort
5) Vous faites du multi-région avec besoins réseau et LB global ?
-> GCP est très confortable (backbone + LB global)Règle d’or
- Choisir un cloud “principal” pour les fondations (IAM/réseau/logs/budgets).
- Ensuite, utiliser les services qui apportent le plus de valeur (data, ML, serverless…), sans se disperser.
Patterns d’architecture (comparables)
Pattern Web/API scalable
Front-door : DNS -> LB + TLS + WAF
Compute : (Kubernetes) ou (VM autoscaling) ou (serverless containers)
Data : DB managée + cache + object storage
Ops : logging + monitoring + alerting + CI/CD
Security : IAM minimal + secrets + segmentation réseauLes 3 clouds savent le faire. La différence = “ergonomie” + maturité des briques.
Pattern Data Platform
Ingestion : bus/stream (Pub/Sub/Kinesis/Event Hubs)
Processing : ETL batch/stream (Dataflow/Glue/Data Factory)
Storage : data lake (GCS/S3/Blob) + DWH (BigQuery/Redshift/Synapse)
BI : dashboards + exports + governance
Security : data perimeter + IAM + auditGCP est particulièrement à l’aise ici grâce à BigQuery et Dataflow.
Exemple “IDEO-Lab mindset”
Si priorité = vitesse + simplicité ops:
- Cloud Run (API Django) + Cloud SQL + GCS + LB/Armor + Monitoring
Si priorité = scale Kubernetes + workloads multiples:
- GKE + Ingress (LB) + Cloud SQL (private) + Secret Manager
Si priorité = analytics trafic/usage:
- Export logs -> BigQuery (requêtes partitionnées) + dashboardsMulti-cloud : quand ça a du sens (et quand non)
| Cas | Multi-cloud ? | Pourquoi | Attention |
|---|---|---|---|
| Résilience fournisseur | Parfois | Réduction risque vendor | Complexité énorme (IAM, logs, réseau) |
| Contraintes légales / clients | Oui | Certains imposent un provider | Gouvernance et segmentation à bétonner |
| Best-of-breed (1 service) | Parfois | Ex: analytics sur BigQuery | Egress + intégration + sécurité |
| Startup / solo dev | Non | Priorité : vitesse, simplicité | Le multi-cloud ralentit tout |
Recommandation pragmatique : mono-cloud au début, puis multi-cloud seulement si une contrainte business le justifie clairement.
Pièges & anti-biais (ce qui trompe tout le monde)
| Biais | Erreur typique | Correction |
|---|---|---|
| “Le moins cher” | Comparer prix “liste” sans design | Optimiser logs, egress, sizing, queries + budgets |
| “Le meilleur service” | Choisir un cloud pour 1 service, puis souffrir sur le reste | Prioriser les fondations + cohérence ops |
| “On fera multi-cloud direct” | Explosion complexité + ralentissement projet | Commencer simple, standardiser, puis étendre |
| “On peut changer facilement” | Sous-estimer l’adhérence (IAM, réseau, managed services) | Abstraire au niveau app + IaC + patterns |
| “Le cloud est sécurisé par défaut” | Bucket public / IAM trop large / ports ouverts | Least privilege + guardrails + review + WAF |
Conclusion (ultra simple)
- AWS : maximaliste (catalogue, enterprise, choix infinis)
- Azure : meilleur fit Microsoft & hybride entreprise
- GCP : réseau + containers + data/analytics (et vitesse PaaS)
Le Project est l’unité “atomique” de GCP : facturation, quotas, APIs activées, isolation et une grande partie de l’IAM. Cette modal te donne une structure type “enterprise” (Landing Zone), les règles de nommage, et les pièges.
Hiérarchie : comment GCP “pense” l’entreprise
Organization (ex: ideolab.com)
├─ Folder: Prod
│ ├─ Project: ideolab-web-prod
│ ├─ Project: ideolab-data-prod
│ └─ Project: ideolab-sec-prod
├─ Folder: Staging
│ ├─ Project: ideolab-web-stg
│ └─ Project: ideolab-data-stg
└─ Folder: Dev
├─ Project: ideolab-web-dev
└─ Project: ideolab-data-dev| Niveau | But | Ce qu’on y met | Pourquoi c’est utile |
|---|---|---|---|
| Organization | Racine (gouvernance) | Policies globales, audit, guardrails | Évite les dérives (sécurité/cost) sur tous les projets |
| Folder | Regroupement logique | Prod/Dev, BU, équipes | Héritage IAM/policies cohérent |
| Project | Unité d’isolation | Apps, data, sécurité | Billing + quotas + APIs + séparation claire |
En GCP, on évite le “gros projet unique” : ça finit souvent en IAM illisible + coûts impossibles à attribuer + risque prod.
IAM & héritage (Org → Folder → Project)
Règles simples
- Une policy IAM = des bindings (principal → role).
- L’IAM peut être appliqué à Org/Folder/Project/Resource.
- Les permissions s’héritent vers le bas (sauf exceptions/deny).
- Least privilege : jamais “Owner” par défaut.
Qui met-on où ?
- Org : équipe plateforme (gouvernance globale).
- Folder Prod : accès très restreint + rôles finement attribués.
- Dev : plus permissif, mais toujours contrôlé.
Modèle d’équipes (recommandé)
| Groupe | Niveau | Rôle typique |
|---|---|---|
| platform-admins | Org | Org Admin / Billing Admin (très limité) |
| sec-auditors | Org/Folder | Viewer + logs/audit |
| devops-prod | Folder Prod | Rôles ops ciblés (GKE/Run/LB) |
| dev-team | Folder Dev | Editor limité (ou rôles custom) |
Astuce : tu gagnes énormément en lisibilité en gérant l’accès via groupes plutôt que des users individuels.
Service Accounts : identité “machine” (à structurer)
Pattern solide
- 1 service account par workload (api, worker, etl)
- rôles uniquement sur les ressources nécessaires (bucket/dataset/secret)
- éviter les clés statiques, préférer identité fédérée / Workload IdentityBilling, quotas & APIs : ce qui “vit” au niveau Project
| Élément | Où | Pourquoi c’est critique | Bonne pratique |
|---|---|---|---|
| Billing account | lié au Project | Sans billing, pas de prod (ou très limité) | Budgets + alertes dès J1 |
| Budgets | Billing | Anti-surprise facture | Alerte 50/75/90/100% |
| Quotas | Project | Protège contre l’excès / limite scaling | Réviser pour prod + monitorer erreurs quota |
| APIs activées | Project | Un service = une API, sinon “ça marche pas” | Documenter APIs requises par stack |
| Exports logs | Project / Org | Analytics + audit + conformité | Exporter vers BigQuery / GCS selon besoin |
APIs “classiques” selon stack (exemple)
Stack web simple (Run + SQL + GCS)
- Cloud Run API
- Cloud SQL Admin API
- Secret Manager API
- Cloud Storage API
- Cloud Logging / Monitoring APIs
- (Optionnel) Cloud Build APILe “ça marche pas” le plus fréquent au début : API non activée ou permissions insuffisantes sur le project.
Landing Zone (template) : structure recommandée
Organization: ideolab.com
Folder: Shared
- Project: ideolab-shared-network (VPC partagés, DNS, interco)
- Project: ideolab-shared-logging (exports logs, sinks)
Folder: Prod
- Project: ideolab-web-prod (GKE/Run/LB)
- Project: ideolab-data-prod (BigQuery/Dataflow)
- Project: ideolab-sec-prod (Armor/SCC/KMS policies)
Folder: Dev
- Project: ideolab-web-dev
- Project: ideolab-data-dev| Bloc | But | Gain |
|---|---|---|
| Shared network | Centraliser VPC/DNS/interop | Standardisation + contrôle |
| Shared logging | Sinks, exports, rétention | Audit & analytics cohérents |
| App projects | Déploiement workloads | Isolation + blast radius réduit |
| Data projects | Analytics/ETL/ML | IAM data séparé, coûts attribuables |
Pour un “solo dev” (toi), on peut faire plus léger… mais garder la séparation Prod vs Dev reste une excellente habitude.
Nommage & labels : lisibilité + facturation + ops
Convention simple (recommandée)
Format projet : {org}-{domain}-{env}
- ideolab-web-prod
- ideolab-data-dev
- ideolab-sec-prodLabels (tags) incontournables
| Label | Exemple | Pourquoi |
|---|---|---|
| env | prod / stg / dev | Filtrer coûts + ressources |
| app | ideolab | Regrouper ressources |
| owner | platform | Responsable clair |
| cost_center | core | Refacturation / analyse |
Les labels sont la base d’une facturation “intelligente” : sans ça, tu ne sauras jamais ce qui coûte quoi.
Séparation Dev / Stage / Prod : pourquoi c’est non négociable
Objectifs
- Éviter les accidents en prod (tests, scripts, migrations).
- Limiter l’accès à la prod (IAM strict).
- Budgets séparés + quotas adaptés.
- Conserver une “prod” stable et observable.
Approche simple
- 1 project par env (web-dev, web-stg, web-prod).
- DB prod isolée (Cloud SQL prod) + backups.
- Secrets différents par env.
- Logs prod plus stricts (rétention, exports, alerting).
“Promotion” du code (pipeline mental)
dev -> staging -> prod
- mêmes templates IaC (Terraform)
- mêmes manifests (K8s/Run), variables différentes
- tests + validations avant prod
- rollback plan (run revisions / deploy tags / blue-green)Exemple concret (IDEO-Lab) : découpage intelligent
| Project | Rôle | Services | Pourquoi ce découpage |
|---|---|---|---|
| ideolab-web-prod | Front/API | GKE / Cloud Run, LB, Secret Manager | Isoler la prod web + droits ops ciblés |
| ideolab-data-prod | Analytics | BigQuery, Pub/Sub, Dataflow | IAM data spécifique + coûts data séparés |
| ideolab-sec-prod | Sécurité | Armor, SCC, KMS, logs exports | Centraliser posture sécurité + audit |
| ideolab-web-dev | Dév/Tests | Run/GKE Autopilot (petit), Cloud SQL dev | Expérimentation sans risque prod |
Deux options “réalistes” pour toi
Option A (simple) : 2 folders (Dev/Prod) + 2 projects (web-dev/web-prod)
Option B (clean) : + data-dev/data-prod + sec-prod (si Armor/exports/BigQuery)Pièges & anti-patterns (ceux qui font perdre du temps)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Un seul project pour tout | IAM illisible, coûts mélangés | Accidents prod + audit impossible | 1 project par env + séparer data |
| “Owner” pour tout le monde | Tout marche… jusqu’au jour où… | Suppression massive / compromission | Rôles fins + groupes + revue accès |
| Pas de budgets | Surprise facture | Interruption projet | Budgets + alertes (dès J1) |
| APIs activées “au hasard” | Incohérences entre env | Drifts + bugs | Doc APIs requises + IaC |
| Secrets en dur | Clés dans code/env | Leak | Secret Manager + rotation |
Règle finale (ultra simple)
- Projects = isolation (env, app, data).
- Folders = gouvernance (prod/dev + politiques).
- Org = guardrails (security/cost/audit).
Objectif : comprendre Compute Engine comme une “infra élastique” (VM + disques + réseau), et surtout comment faire propre en prod : templates, MIG, autoscaling, patching, sécurité, coûts, observabilité.
Familles d’instances : lecture “décision”
| Famille | Profil | Quand l’utiliser | À surveiller |
|---|---|---|---|
| E2 | General purpose (économique) | Web/apps, dev, petites prod | CPU/RAM, latence |
| N2 | General purpose (performant) | Prod stable, workloads classiques | Right-sizing |
| C2 | Compute optimized | CPU intensif (API perf, batch) | CPU saturation |
| Tau (T2D) | AMD, bon ratio coût/perf | Scale web + microservices | Profil réel charge |
Savoir “sizer” correctement (méthode pragmatique)
- Démarrer petit (E2/N2) → mesurer (Monitoring).
- Identifier le goulot : CPU / RAM / disque / réseau.
- Scaler verticalement (type machine) si nécessaire, mais préférer scaler horizontalement avec MIG.
- Valider la stabilité (p95 latence, erreurs) puis figer un “baseline” (template).
Workloads typiques → choix rapide
| Workload | Choix initial | Pourquoi |
|---|---|---|
| Site web / API Django | E2 ou Tau | Bon coût/perf, scale via MIG + LB |
| Batch CPU (parsing, jobs) | C2 | CPU “dense”, exécution rapide |
| Services stables | N2 | Profil “standard prod” |
Astuce : si ton workload est “container-friendly”, Cloud Run / GKE peuvent réduire l’ops, mais Compute Engine reste parfait pour legacy, tuning OS, besoins spécifiques.
Disques : performance, choix, pièges
| Type | Usage | Points forts | Pièges |
|---|---|---|---|
| Persistent Disk | Boot + data | Stable, managé, snapshots | Perf dépend taille/type |
| Local SSD | Cache / temp | Très rapide | Éphémère (perte sur arrêt) |
Règles simples (prod)
- Boot disk séparé des données si tu veux restaurer/patcher sans toucher au data.
- Ne pas confondre “disque” et “backup” : un disque ≠ sauvegarde. Les snapshots sont la base DR.
- Si ta VM “rame” : vérifier IOPS/throughput avant d’augmenter CPU.
Pattern “data disk” propre
VM:
- boot disk (OS) : petit + patché
- data disk : séparé (postgres, medias, logs utiles)
Backup:
- snapshots planifiés du data disk
- éventuellement exports vers GCS (selon use-case)Le meilleur gain perf vient souvent d’un bon choix disque + cache applicatif, avant même le CPU.
Images & snapshots : “golden image” + rollback
| Objet | Définition | Quand | Objectif |
|---|---|---|---|
| Image | Template OS (golden image) | Déploiements homogènes | Reproductibilité |
| Snapshot | Backup point-in-time d’un disque | DR / rollback data | Restauration rapide |
| Instance Template | Config VM (type, disk, SA, metadata) | MIG / standardisation | Scale + cohérence |
Pattern “Golden Image” (propre)
1) Créer une VM "builder"
2) Durcir + patcher + config baseline (agents monitoring/logging)
3) Créer une image "golden-YYYYMMDD"
4) Utiliser l'image dans un Instance Template
5) Déployer via MIG
=> prod homogène, rollback simple (revenir à l'image précédente)Snapshots (bonnes pratiques)
- Planifier (quotidien/heure) selon RPO souhaité.
- Tester la restauration (sinon c’est du “théorique”).
- Rétention : garder 7 jours + 4 semaines + 12 mois (à ajuster).
Le duo “golden image + MIG + snapshots” donne une prod robuste et facilement réversible.
Managed Instance Group (MIG) : autoscaling + self-healing
Le MIG est le moteur de scalabilité et résilience : il recrée une VM en cas de crash, scale selon la charge, et permet des déploiements propres (rolling update).
Architecture type
(Clients)
|
[HTTP(S) Load Balancer] (TLS offload, WAF possible)
|
[Backend Service] -> [MIG]
-> instances identiques (template)
-> health checksÉtapes (le vrai workflow)
- Créer une Image (optionnel mais recommandé) + config baseline.
- Créer un Instance Template (machine type, disks, SA, metadata, startup script).
- Créer un MIG (min/desired/max) + autohealing (health check).
- Configurer autoscaling (CPU, LB utilization, métriques custom).
- Brancher au Load Balancer (1.3) + règles firewall ciblées.
Autoscaling : règles simples
- Scale-out si CPU > 60–70% durable (ou RPS/latence via métriques custom).
- Scale-in plus lent (éviter oscillations).
- Prévoir un min stable en prod (ne pas descendre trop bas si warmup long).
Rolling update (déploiement propre)
Stratégie:
- Nouveau template (v2) -> rolling update du MIG
- Paramètres: max surge / max unavailable
- Validation health checks + logs
- Rollback: revenir au template v1Sécurité : SSH, bastion, IAP, service accounts
Règles “anti-compromission”
- Éviter IP publique sur VM prod si possible.
- Limiter SSH : pas de 0.0.0.0/0.
- Préférer bastion ou IAP pour accès admin.
- Service Account minimal (least privilege).
Firewall
- Firewall basé sur tags ou service accounts (très propre).
- Ouvrir seulement LB health checks + ports stricts.
Pattern sécurisé (prod)
VMs privées (pas d'IP publique)
- Private Google Access: ON
- Cloud NAT: ON (si sorties internet nécessaires)
Accès admin:
- Bastion OU IAP
Identité:
- SA "app-prod" (droits minimaux)
Secrets:
- Secret Manager (pas de secrets en dur)La majorité des incidents viennent d’un IAM trop large + exposition réseau inutile.
Coûts & optimisation (Compute Engine)
| Levier | Impact | Action | Note |
|---|---|---|---|
| Right-sizing | +++ | Mesurer CPU/RAM, réduire type machine | Le plus rentable |
| MIG autoscaling | +++ | Scaler selon charge réelle | Évite surprovisionnement |
| Committed Use | ++ | Engagement 1/3 ans | Si stable |
| Spot/Preemptible | ++ | Batch non critique | Interruption possible |
| Disques & rétention | + | Lifecycles snapshots, nettoyer disques orphelins | Piège fréquent |
Pièges coût (très fréquents)
- Disques persistants “oubliés” après suppression VM.
- Snapshots sans politique de rétention.
- Logs trop verbeux (surtout en debug) + rétention longue.
Le trio gagnant : budgets + tags/labels + dashboards.
Runbook prod (checklist courte mais carrée)
| Étape | Action | OK si |
|---|---|---|
| 1 | Projet + IAM minimal + SA dédié | Pas de “Owner” large, SA par workload |
| 2 | VPC + subnets + firewall strict | Ports minimaux, SSH non public |
| 3 | Instance Template + (golden image) | Reproductible, versionné |
| 4 | MIG + health checks + autoscaling | Self-healing + scale stable |
| 5 | Snapshots planifiés + rétention | Restauration testée |
| 6 | Monitoring/Logging + alerting | CPU, latence, erreurs, saturation |
| 7 | Budgets + alertes coût | Alerte avant dépassement |
Template mental “prod solide”
LB -> MIG (VMs privées) -> App
\-> Cloud Armor (WAF/rate-limit) (option)
Data:
- Cloud SQL (si DB managée) ou disques + snapshots
Ops:
- Monitoring + Logging + alerting
Security:
- IAM minimal + SA dédiés + secrets managerObjectif : maîtriser le socle réseau (VPC global, subnets régionaux, règles firewall stateful, routes), et savoir bâtir un design prod : workloads privés, Private Google Access, Cloud NAT, accès hybride (VPN/Interconnect), segmentation, et “front-door” (LB/WAF) pour encaisser le trafic.
VPC GCP : global (différence clé vs AWS)
- Un VPC est global : une “enveloppe réseau” cohérente qui peut couvrir plusieurs régions.
- Les subnets sont régionaux : un subnet appartient à une région (mais au sein du VPC global).
- Avantage : design multi-région plus naturel (cohérence + interconnexions simplifiées).
Schéma mental (simple)
VPC (global)
├─ Subnet europe-westX (regional)
├─ Subnet us-centralX (regional)
└─ Règles firewall + routes (dans le VPC)
Workloads:
- VM / GKE / Run (via NEG) attachés aux subnetsLe réseau est la fondation : si tu “casses” l’IP plan, le firewall ou l’egress, tu souffres ensuite partout (DB, GKE, Cloud Run, CI/CD).
Subnets & IP plan : la base d’un réseau propre
Règles simples (qui marchent)
- Prévoir une marge (tu vas ajouter des services plus tard).
- Séparer public vs privé (même si tu évites le public en prod).
- Séparer apps vs data (ex: DB, caches, brokers) pour limiter le blast radius.
Exemple d’IP plan (lisible)
VPC: ideolab-vpc (10.20.0.0/16)
europe-westX:
- subnet-apps-euw : 10.20.10.0/24
- subnet-data-euw : 10.20.20.0/24
us-centralX:
- subnet-apps-usc : 10.20.30.0/24
- subnet-data-usc : 10.20.40.0/24| Zone | Subnet | Usage | Notes |
|---|---|---|---|
| apps | subnet-apps-* | VMs/MIG, GKE nodes, workloads | Ports stricts, egress contrôlé |
| data | subnet-data-* | DB, caches, services internes | Pas d’expo publique |
Même si tu ne mets pas tout de suite un “subnet data”, le prévoir te permet d’éviter des migrations réseau pénibles plus tard.
Firewall rules (stateful) : la sécurité réseau “de base”
Les règles firewall GCP sont stateful : si tu autorises une connexion sortante, le retour est permis. Le gros avantage GCP : cibler les règles par tags OU par service accounts (très propre).
Bonnes pratiques
- Deny by default (mental model) : n’ouvrir que le strict nécessaire.
- Règles par rôle : web, ssh-admin, db, monitoring.
- Éviter SSH public : préférer IAP ou bastion.
Exemples de règles (modèle)
Règles typiques
- allow-healthchecks-to-web : INGRESS tcp:80,443 depuis ranges LB/healthcheck (ciblé)
- allow-iap-ssh-to-admin : INGRESS tcp:22 depuis IAP (ciblé)
- allow-app-to-db : INGRESS tcp:5432 depuis subnet-apps -> subnet-data
- deny-all-ssh-public : (principe) ne jamais ouvrir 22 au mondeErreur classique
Ouvrir “0.0.0.0/0” sur SSH/DB “pour tester vite” puis oublier. → C’est souvent le début d’un incident.
Routes & egress : contrôler “où ça sort”
| Composant | Rôle | Quand | Point d’attention |
|---|---|---|---|
| Routes | Déterminer le chemin (internet, peering, VPN…) | Tout le temps | Routage involontaire = surprise |
| Cloud NAT | Egress internet sans IP publique | Workloads privés | Meilleure pratique prod |
| Peering | Connexion VPC ↔ VPC | Shared VPC / segmentation | Gouvernance |
Egress : 2 patterns
Pattern A (simple dev):
- VM avec IP publique
=> rapide mais moins safe
Pattern B (prod recommandé):
- VM privée (sans IP publique)
- Private Google Access = ON
- Cloud NAT = ON (si sorties internet nécessaires)
=> egress maîtrisé, surface d’attaque réduiteLe pattern B est celui que tu veux pour des serveurs exposés (Idéo-Lab / API), surtout si tu subis du flood/bots.
Private Google Access : accès aux APIs Google sans IP publique
Private Google Access permet à des VMs/instances sans IP publique d’appeler des APIs Google (Storage, Artifact Registry, etc.) via le réseau Google, sans exposer la machine sur Internet.
Quand l’activer ?
- Workloads prod en subnet privé.
- VMs qui doivent accéder à GCS, logs, images, registries…
- Quand tu veux “zéro IP publique” mais garder la fonctionnalité.
Combo gagnant
Subnet privé:
- Private Google Access = ON
- Cloud NAT = ON (si apt/yum, pip, dépôts externes requis)
Résultat:
- machine non exposée
- accès aux APIs Google OK
- sorties internet contrôléesÇa te permet une infra bien plus “enterprise” sans la complexité d’un proxy maison.
NAT / VPN / Interconnect : hybrid & connectivité
| Solution | But | Cas d’usage | Avantage | Limite |
|---|---|---|---|---|
| Cloud NAT | Sortie internet sans IP publique | VMs privées | Simple, sécurisé | Pas pour “entrer” depuis on-prem |
| Cloud VPN | Tunnel IPsec | Hybride “quick win” | Rapide à mettre en place | Latence/throughput variables |
| Interconnect | Lien dédié | Hybride perf + stable | Latence stable, débit | Plus lourd (contrats/ops) |
Choix rapide
Besoin ponctuel / démarrage hybride -> Cloud VPN
Besoin stable / gros volumes / latence maîtrisée -> Interconnect
Besoin uniquement egress internet sans IP publique -> Cloud NATPatterns prod (web/API) : “front-door” + subnets privés
Pattern recommandé (anti-bots / anti-flood)
(Internet)
|
[Global HTTP(S) Load Balancer]
|-- TLS offload
|-- (option) Cloud Armor : WAF + rate-limit + geo/ip rules
|
[Backends privés]
- MIG (Compute Engine) en subnet privé (pas d'IP publique)
- ou GKE (nodes privés) / Cloud Run (via NEG)
Egress:
- Cloud NAT (si besoin)
Ops:
- Logging/Monitoring + alertingSegmentation minimale (utile)
- Subnet apps (web/API) : autoriser uniquement LB health checks + trafic interne nécessaire.
- Subnet data (DB/cache) : accessible uniquement depuis apps.
- Admin : accès via IAP/bastion, jamais SSH “public”.
Ce pattern colle parfaitement à ton contexte (sites exposés, bots, rate-limit) : tu déplaces la “bataille” au LB/WAF, et tu gardes les workloads privés.
Pièges & anti-patterns (réseau)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Tout en IP publique | VMs exposées “direct” | Bruteforce, bots, surface d’attaque | Subnets privés + LB + NAT + IAP |
| Firewall 0.0.0.0/0 | “ça marche” mais trop ouvert | Compromission | Règles ciblées (tags/SA) + deny by default |
| Pas d’IP plan | Subnets ajoutés “au hasard” | Conflits, migrations difficiles | Plan /16 + subnets par rôle et par région |
| Egress non contrôlé | Trafic sortant “invisible” | Coût + exfiltration | NAT central + logs + alertes |
| Ignorer Private Google Access | VM privée mais “ça n’accède pas aux APIs” | Bidouilles dangereuses | PGA ON + NAT si nécessaire |
3 règles “golden”
- Workloads privés (pas d’IP publique) dès que possible.
- Entrée via LB (et WAF/rate-limit si besoin), pas en direct sur les VMs.
- Firewall ciblé (tags/SA) + budgets/logs pour éviter surprise et incidents.
Objectif : comprendre les Load Balancers GCP (L7/L4), le “why” du global, et comment bâtir un front-door robuste : TLS, health checks, backends (MIG / GKE / Cloud Run via NEG), CDN, et intégration sécurité (Armor).
Types principaux : choisir vite et bien
| Type | Niveau | Quand | Fonctions clés | À retenir |
|---|---|---|---|---|
| HTTP(S) Load Balancer | L7 | Web / API HTTP, routage par host/path | TLS offload, règles URL, CDN, WAF (Armor) | Le “front-door” moderne par défaut |
| TCP Load Balancer | L4 | Services TCP non HTTP (ex: db proxy, protocoles custom) | Passthrough / perf | Simple, efficace, moins “intelligent” |
| UDP Load Balancer | L4 | UDP (gaming, DNS, syslog, temps réel) | Routage L4 | Cas spécifiques |
Règle simple
- Tu fais du HTTP/HTTPS → prends HTTP(S) LB.
- Tu fais un protocole non HTTP → prends L4 TCP/UDP.
Architecture d’un HTTP(S) LB (mental model)
(Clients / Internet)
|
[Global HTTP(S) Load Balancer]
|-- TLS offload (certificat)
|-- URL maps (host/path routing)
|-- (option) Cloud Armor (WAF / rate-limit)
|-- (option) Cloud CDN (cache global)
|
[Backend Service]
|
[Backends] -> MIG (Compute Engine) / GKE Ingress / Cloud Run (via NEG)Ce que ça t’apporte
- Un point d’entrée unique (TLS, sécurité, routage).
- Haute dispo + équilibre de charge + health checks.
- Évolutivité : tu scales derrière sans changer le DNS.
- Observabilité : métriques et logs sur le point névralgique.
Le LB est aussi un “pare-chocs” : il absorbe une partie des attaques/bots et stabilise ta prod (surtout combiné à Armor + rate-limit).
Backends : MIG / GKE / Cloud Run (via NEG)
| Backend | Quand | Avantages | Points d’attention |
|---|---|---|---|
| MIG (Compute Engine) | VMs + autoscaling | Contrôle OS, stable, self-healing | Ops (patching, images), scaling à régler |
| GKE Ingress | Workloads Kubernetes | Déploiements modernes, HPA, services | Complexité K8s, gouvernance cluster |
| Cloud Run | Microservices containers | Très peu d’ops, scale rapide | Connexions DB, cold starts (selon config) |
| NEG (Network Endpoint Group) | Abstraction endpoints | Permet LB → backends variés | Bien comprendre “endpoints” vs instances |
Choix “pragmatique”
Si tu veux aller vite (API moderne) -> Cloud Run + LB
Si tu veux Kubernetes (multi-services) -> GKE + Ingress (et LB)
Si tu veux contrôle OS/legacy -> MIG + LBHealth checks : la clé du failover
Sans health checks, pas de failover fiable. Le LB a besoin d’un signal clair : “cet endpoint est OK / KO”. Un bon health check doit valider un minimum de logique applicative, sans être trop lourd.
Recommandation (HTTP)
/healthz -> retourne 200 OK
- rapide (pas de DB lourde)
- vérifie process + routing basique
- idéalement vérifie que l'app est prête (readiness)Self-healing (avec MIG)
- Le MIG peut recréer une VM si elle échoue aux checks (autohealing).
- Le LB retire un backend “unhealthy” du trafic.
- Résultat : résilience automatique sans intervention humaine (dans une certaine mesure).
Pièges health checks
- Endpoint trop lourd (tape la DB) → faux positifs sous charge.
- Endpoint trop faible (toujours OK) → LB envoie du trafic vers une app cassée.
- Firewall oublié : health checks bloqués → tout est “unhealthy”.
TLS / certificats : managé vs importé
| Option | Quand | Avantage | Limite |
|---|---|---|---|
| Certificat managé | 99% des cas | Simple, renouvellement automatique | Dépend du DNS/validation |
| Certificat importé | Entreprise / PKI | Contrôle total | Renouvellement à gérer |
TLS offload : pourquoi c’est bien
- Chiffrement géré au bord (LB) → backends simplifiés.
- Meilleure perf + gestion centralisée des certs.
- Tu peux garder backends privés, sans exposition directe.
En prod : LB termine TLS, puis trafic interne vers backends (possiblement re-chiffré selon design/contraintes).
Cloud CDN : cache global (statique + accélération)
Cloud CDN s’active sur le LB et met en cache des réponses (souvent statiques) au plus proche des utilisateurs. Idéal pour : images, CSS/JS, assets, downloads, contenus publics.
Quand activer ?
- Beaucoup de trafic sur /static ou assets lourds.
- Public international (latence).
- Tu veux réduire la charge sur backends (CPU, bande passante).
Pattern recommandé
LB + CDN
- /static -> bucket GCS (cacheable)
- /media -> (selon besoin) GCS + signed URLs
- /api -> backends (MIG/GKE/Run) non cache (ou cache contrôlé)Cache : règles simples
- Cache agressif sur versionnés (ex: app.abc123.js) → TTL long.
- Cache prudent sur contenu “mutable” → TTL court + invalidations.
- Ne jamais “accidentellement” cacher des réponses sensibles (auth).
Patterns prod (contexte IDEO-Lab : bots, rate-limit, stabilité)
Pattern anti-flood (recommandé)
(Internet)
|
[HTTP(S) LB global]
|-- TLS offload
|-- Cloud Armor (WAF + rate-limit + IP rules)
|-- Cloud CDN (assets)
|
Backends privés:
- MIG (VMs privées) OU GKE nodes privés OU Cloud Run
Egress:
- Cloud NAT (si besoin)
Ops:
- Logging/Monitoring + alertes (4xx/5xx, latence, saturation)Découpage URL utile
- /static : CDN + cache long (si versionné).
- /api : no-cache + Armor rate-limit (anti abuse).
- /admin : restrictions fortes (IP allowlist ou IAP, selon setup).
- /healthz : utilisé par health checks (simple, rapide).
Tu retrouves ton approche Nginx/rate-limit, mais déplacée au niveau “front-door” cloud, avant même d’atteindre tes VMs.
Pièges & anti-patterns (LB)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Backends exposés directement | IP publique sur VM/API | Attaques directes, contournement WAF | Backends privés + entrée unique via LB |
| Health check inexistant | LB envoie vers backend cassé | Indispo | /healthz + firewall healthcheck OK |
| Certs gérés “à la main” sans process | Expiration surprise | Site down | Certificats managés (ou process PKI strict) |
| CDN mal configuré | Pages auth “cachées” | Fail sécurité | Cache seulement sur static/versionné |
| Pas d’Armor/rate-limit | Flood 4xx/5xx + CPU | Saturation | Armor WAF + rate-limit + règles IP/geo |
Checklist LB (prod)
- LB HTTP(S) + cert managé (TLS).
- Backends privés (MIG/GKE/Run) + health checks.
- Firewall autorise health checks + trafic strict.
- CDN sur /static (si pertinent) + cache safe.
- Armor + rate-limit sur endpoints sensibles (/api, /login, /admin).
- Monitoring : latence p95, 4xx/5xx, saturation.
Objectif : maîtriser IAM comme la couche n°1 de sécurité sur GCP. Tu vas comprendre le modèle principal → role → policy, l’héritage Org/Folder/Project/Resource, et comment faire une config prod (least privilege, service accounts par workload, zéro clés statiques).
Modèle IAM (simple, mais strict)
| Objet | Définition | Exemples | Piège fréquent |
|---|---|---|---|
| Principal | “Qui” reçoit des droits | User, groupe, Service Account, identité fédérée | Attribuer à des users au lieu de groupes |
| Role | Ensemble de permissions | Viewer / Editor / rôles spécialisés | Prendre Editor “par confort” |
| Policy | Bindings : principal → role | Au niveau Org/Folder/Project/Resource | Mettre trop haut (org) sans contrôle |
| Permission | Action atomique | storage.objects.get, run.services.invoke… | Créer un rôle custom trop large |
Least Privilege (la règle d’or)
- Accorder le minimum nécessaire pour faire fonctionner une tâche.
- Donner des accès temporaires pour les opérations “exceptionnelles”.
- Éviter “Owner/Editor” en prod (sauf équipe plateforme très restreinte).
Règle d’or prod : jamais de “Owner” à grande échelle. “Owner” = suppression/prise de contrôle totale.
Types de rôles : primitive vs predefined vs custom
| Type | Exemples | Quand | Pourquoi (ou pourquoi pas) |
|---|---|---|---|
| Primitive | Owner / Editor / Viewer | Dev rapide (avec prudence) | Pratique mais trop large (surtout Owner/Editor) |
| Predefined | roles/storage.objectViewer, roles/run.invoker… | Prod (recommandé) | Granulaire, maintenu par Google |
| Custom | roles/custom/ideolabDeployer | Entreprise/standardisation | Puissant, mais risque de dérive si mal gouverné |
Choix rapide
- Commencer avec des predefined roles (le plus safe).
- Passer à custom roles quand tu veux standardiser (et que tu sais exactement ce que tu fais).
- Limiter les rôles primitive à du dev/POC, jamais “Editor partout” en prod.
Exemples de rôles “courants” (pragmatiques)
Exemples (idées)
- Cloud Run invoker : appeler un service (sans l'admin)
- Storage objectViewer : lire des objets d'un bucket
- Secret Manager secretAccessor : lire un secret (pas lister tout)
- BigQuery jobUser + accès dataset ciblé : lancer des requêtes + lire des tables autoriséesService Accounts (SA) : identité “machine”
Un Service Account est une identité utilisée par un workload (VM, GKE, Cloud Run, Dataflow…). C’est LA brique pour éviter les secrets en dur et rendre l’accès “traçable”.
Principes solides
- 1 SA par workload (api, worker, etl, cron…)
- Droits au niveau resource si possible (bucket/dataset/secret), pas “sur tout le project”.
- Nommer clairement : ideolab-api-prod, ideolab-worker-prod, etc.
- Éviter les “shared SA” à tout faire (ça finit toujours trop large).
Pattern concret (API Django → GCS + Secrets)
Créer SA : ideolab-api-prod
Accorder UNIQUEMENT:
- roles/secretmanager.secretAccessor sur les secrets nécessaires
- roles/storage.objectViewer (ou objectAdmin) sur le bucket précis
- (option) roles/logging.logWriter si besoin (souvent implicite via agents)
Attacher le SA au runtime:
- VM (Compute Engine) / MIG
- ou Cloud Run service
- ou GKE (via Workload Identity)
=> aucune clé “hardcodée”, droits minimaux, audit propreBonus : dans certains designs, tu peux aussi cibler les firewall rules par service account (durcissement réseau très propre).
Niveaux d’application : Org → Folder → Project → Resource
L’IAM s’hérite “vers le bas”. Plus tu assignes haut, plus tu crées un accès large. Donc : mettre haut uniquement ce qui doit être global.
| Niveau | Bon usage | Exemples | À éviter |
|---|---|---|---|
| Organization | Gouvernance & guardrails | Admins plateforme, auditors | Donner “Editor” à des devs |
| Folder | Env (Prod/Dev), BU, équipes | Accès prod très restreint | Mélanger prod & dev |
| Project | Isolation workload / app / data | Accès “ops” ciblé | Tout le monde Editor |
| Resource | Accès ultra précis | 1 bucket, 1 dataset, 1 secret | Oublier d’isoler la donnée |
Règle simple
Accès humain:
- plutôt sur Folder/Project (via groupes)
Accès machine (workloads):
- plutôt sur Resource (bucket/dataset/secret) via SAPatterns prod (web/API) — “ce qui marche dans la vraie vie”
Pattern équipes
Groupes (exemples)
- platform-admins : droits org (très restreints)
- prod-ops : gérer LB/Run/GKE en prod (pas Owner)
- dev-team : dev project (plus permissif)
- auditors : lecture logs/auditPattern SA (workloads)
| Workload | SA | Droits typiques | Notes |
|---|---|---|---|
| API web | ideolab-api-prod | secretAccessor + accès bucket/dataset ciblé | aucune clé statique |
| Worker/Celery | ideolab-worker-prod | pubsub publisher/subscriber, storage, secrets | droits distincts de l’API |
| ETL/Dataflow | ideolab-etl-prod | bigquery jobUser + datasets ciblés | data = IAM séparé |
Principe “blast radius”
- Si un SA est compromis, il ne doit permettre d’accéder qu’à un petit périmètre.
- Donc : SA dédiés + droits ciblés = incident contenu.
Clés, identités et Workload Identity (objectif : 0 clés statiques)
Les clés de service account (JSON) sont le “vieux monde” : faciles à fuiter, difficiles à tracer/rotater. Le but en prod : ne pas en avoir.
Recommandation
- Pour GKE : préférer Workload Identity (Pods → SA GCP) plutôt que key files.
- Pour Cloud Run : attacher un SA au service (pas de clé).
- Pour VM : utiliser le SA attaché à la VM + scopes/permissions gérés par IAM.
Si tu dois utiliser une clé (exception)
- Stocker dans Secret Manager (pas dans le repo, pas sur disque “en clair”).
- Rotation planifiée + audit de l’usage.
- Limiter le SA à un périmètre minimal.
Une clé SA exposée = souvent compromission. Traite-la comme un mot de passe root.
Audit & ops : garder IAM sain dans le temps
Checklists (mensuelles)
- Supprimer les accès non utilisés (users/SA).
- Réduire progressivement Editor/Owner → roles prédéfinis.
- Revoir les SAs “partagés” et découper si trop larges.
- Vérifier les projets “orphelins” (dev) et leurs IAM.
- Contrôler les accès aux données (buckets/datasets/secrets).
Principe de gouvernance
IAM doit être:
- lisible (groupes + nommage)
- minimal (least privilege)
- traçable (audit / logs)
- réversible (accès temporaire pour ops)Le vrai risque n’est pas “une mauvaise règle” : c’est l’accumulation au fil des mois sans revue.
Pièges & anti-patterns IAM (très fréquents)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Owner/Editor partout | “Tout marche” trop facilement | Suppression/compromission massive | Predefined roles + séparation prod/dev |
| Un SA pour tout | SA a 15 rôles différents | Blast radius énorme | 1 SA par service (api/worker/etl) |
| Clés SA JSON en dur | Fichier dans repo/VM | Leak + accès non traçable | Workload Identity / SA attaché / Secret Manager |
| IAM au mauvais niveau | Rôles placés à l’Org par facilité | Accès global involontaire | Mettre haut seulement le global, le reste au project/resource |
| Accès individuels | Bindings user par user | Illisible, ingérable | Groupes (dev-team, prod-ops, auditors) |
Mini-check “prod ready”
- Pas de Owner/Editor large en prod.
- SA dédiés + droits au niveau resource.
- Pas de clés statiques (ou rotation/secret manager en exception).
- Groupes pour humains, labels/naming cohérents.
Objectif : maîtriser Google Cloud Storage comme “S3 version Google” : choix de localisation, classes de stockage, règles de cycle de vie, protection anti-effacement (versioning / retention), accès sécurisé (IAM, Signed URLs), et patterns “prod” (CDN, static, uploads, backups).
Concepts fondamentaux
| Objet | Définition | Exemples | Note |
|---|---|---|---|
| Bucket | Conteneur d’objets (nom global unique) | ideolab-static, ideolab-media, ideolab-backups | Le nom de bucket est global, donc “unique sur Internet” |
| Object | Fichier (clé/chemin + métadonnées) | static/app.abc123.js, media/user/42.png | Pas de “dossiers” réels : ce sont des préfixes |
| Prefix | Préfixe de chemin (simule un dossier) | static/, media/, backups/ | Utile pour lifecycle par préfixe |
| IAM Policy | Qui a le droit de lire/écrire | roles/storage.objectViewer | Préférer IAM plutôt que ACL |
| Signed URL | URL temporaire signée (accès sans rendre public) | Download/upload direct browser | Base d’un design “bucket privé” |
Use cases typiques
- Static assets (CSS/JS/images) + CDN.
- Media utilisateur (uploads) + Signed URLs.
- Backups (DB dumps, snapshots exports) + lifecycle vers cold storage.
- Data lake (exports logs/analytics) avant BigQuery/Dataflow.
Localisation : région vs multi-région (et pourquoi ça compte)
Options de localisation
- Region : une région (latence basse si workloads dans la même région).
- Multi-region : réplication multi-sites (HA plus forte, coût souvent plus élevé).
- Dual-region (si utilisé) : 2 régions (équilibre HA/coût).
Choix rapide
Static mondial -> souvent multi-région + CDN
Backups -> région (ou multi si DR strict)
Media -> région proche des workloads + CDN si publicRègles “prod”
- Garde les buckets proches des compute (évite latence/egress).
- Si tu fais du DR multi-région : planifie la cohérence (RPO/RTO).
- Ne mélange pas “prod” et “dev” dans le même bucket.
Le vrai piège : choisir “multi-région” partout sans besoin → coût inutile.
Classes de stockage : Standard → (Nearline/Coldline/Archive)
| Classe | Accès | Usage | Conseil |
|---|---|---|---|
| Standard | Fréquent | Static, media actifs, fichiers applicatifs | Par défaut pour le “vivant” |
| Nearline | Occasionnel | Backups récents, archives consultées rarement | Transition lifecycle après X jours |
| Coldline | Rare | Archives, backups long terme | Très bien pour rétention |
| Archive | Très rare | Conservation longue (compliance) | Récupération plus “contraignante” |
Pattern gagnant
Backups:
- J0..J30 : Standard (restauration rapide)
- J30..J180 : Nearline/Coldline
- > 6 mois : Archive (si besoin conformité)Le bon design : tu restes en Standard pour ce qui sert “souvent”, puis tu automatises les transitions via lifecycle.
Accès & sécurité : IAM (recommandé) vs ACL (à éviter)
| Mécanisme | À privilégier ? | Pourquoi | Quand l’utiliser |
|---|---|---|---|
| IAM | Oui | Lisible, standard, auditable, aligné enterprise | 99% des cas (prod) |
| ACL | Non | Complexe, source d’erreurs (public involontaire) | Cas legacy spécifiques |
Rôles IAM utiles (idées)
Bucket privé (lecture seule)
- roles/storage.objectViewer sur bucket X
Upload/gestion objets (application)
- roles/storage.objectAdmin sur bucket X (ou plus fin selon besoin)
Administration bucket (rare)
- roles/storage.admin (à éviter pour l'app)Règles d’or
- Bucket privé par défaut (public = exception volontaire et documentée).
- 1 service account par workload (api, worker, etl) + droits ciblés sur le bucket.
- Limiter les opérations de listing si non nécessaires (surface + coûts).
Versioning & retention : anti-effacement / anti-ransom
Versioning
- Garde les anciennes versions des objets.
- Très utile contre effacement accidentel ou overwrite.
- Indispensable sur buckets critiques (backups, configs).
Bon usage
media/ : versioning selon besoin
backups/ : versioning OUI (quasi toujours)
static/ : inutile si assets versionnés (hash) + CDNRetention policy (verrouillage)
- Empêche suppression/modification avant un délai.
- Très utile pour conformité ou protection “forte”.
- À utiliser avec prudence (ça bloque aussi les admins).
Si tu actives retention “forte” sur backups : tu te protèges contre une suppression malveillante.
Pattern “safe backups”
Bucket ideolab-backups (private)
- Versioning: ON
- Lifecycle: transition vers cold storage
- (Option) Retention: 30j (anti-suppression)
- Accès: uniquement SA backup + auditorsLifecycle rules : automatiser le ménage + réduire les coûts
Les règles de cycle de vie peuvent : supprimer, archiver (changer de classe), ou agir selon l’âge, la version, le préfixe, etc.
Exemples de règles (idéales)
Ex: backups/
- Après 30 jours -> Nearline
- Après 180 jours -> Coldline
- Après 365 jours -> Archive (ou delete si politique interne)
Ex: tmp-uploads/
- Supprimer après 7 jours
Ex: versions non courantes
- Supprimer versions anciennes après 30 jours (si versioning ON)Checklist lifecycle
- Définir clairement : RPO/RTO et la durée de conservation.
- Ne pas oublier les versions non courantes (sinon tu stockes “en double” indéfiniment).
- Tester la restauration avant de “durcir” (retention/locks).
Signed URLs : bucket privé, accès temporaire (download + upload)
Les Signed URLs permettent de donner un accès temporaire à un objet sans rendre le bucket public. C’est le pattern moderne pour servir des fichiers aux utilisateurs.
Cas d’usage
- Download d’un fichier privé (factures, exports, docs).
- Upload direct browser vers GCS (évite de saturer ton serveur).
- Accès “one-shot” à des backups (admin ops) sans ouvrir IAM large.
Pattern “download Signed URL”
1) User -> demande /api/files/123/download
2) Backend (Django) vérifie droits applicatifs
3) Backend génère Signed URL (TTL 5-15 min)
4) Browser télécharge directement depuis GCSPattern “upload direct” (très puissant)
1) User -> demande /api/uploads/init
2) Backend génère une Signed URL (PUT) ou POST policy
3) Browser upload directement vers GCS
4) Backend enregistre la référence (object path) en DB
5) Option : job async (scan/resize/validation)Point sécurité : TTL court + validation côté app + chemins contrôlés (pas de “../”, pas d’overwrite non voulu).
Static hosting + CDN : servir vite et encaisser
Option A (simple) : bucket “website”
- Possible pour du statique pur, mais attention aux exigences TLS/DNS.
- En prod, on préfère souvent : LB + CDN devant bucket (plus contrôlable).
Option B (prod recommandé) : LB + CDN + bucket privé
LB HTTP(S) global
- /static -> backend bucket GCS + Cloud CDN (cache long)
- /api -> backends (MIG/GKE/Run) (pas cache)
Sécurité:
- bucket privé (IAM)
- pas d’objets publics
Perf:
- CDN absorbe la majorité des hitsHeaders cache (règle d’or)
Assets versionnés (hash dans le nom) :
- Cache-Control: public, max-age=31536000, immutable
Assets non versionnés :
- max-age court + mécanisme d'invalidationPour ton site (beaucoup de pages, bots possibles), CDN sur static = moins de charge CPU + meilleure latence.
Coûts : ce qui fait vraiment “gonfler” la facture
| Poste | Exemples | Piège | Levier |
|---|---|---|---|
| Stockage | Go/mois | Versions non courantes qui s’accumulent | Lifecycle + purge versions |
| Opérations | PUT/GET/LIST | Listings trop fréquents | Indexer en DB, limiter LIST |
| Egress | Sortie vers internet / inter-région | Bucket loin du compute / sans CDN | Même région + CDN |
| Récupération cold | Nearline/Coldline/Archive | Restaurations fréquentes | Ne pas “cold” ce qui vit |
Optimisations très rentables
- Activer CDN sur /static public.
- Lifecycles sur backups + versions non courantes.
- Éviter les LIST : stocker l’index dans ta DB.
- Nettoyer disques/exports “orphelins” (ops).
Patterns IDEO-Lab (concrets, réutilisables)
1) Static Django (collectstatic) + CDN
Bucket: ideolab-static (private)
- objets versionnés (ManifestStaticFilesStorage)
- served via LB + CDN
- cache long (immutable)
Bénéfice: CPU backend réduit + latence mondiale2) Media utilisateur (uploads) via Signed URL
Bucket: ideolab-media (private)
Flow:
- Django génère Signed URL (upload)
- browser upload direct
- Django valide + enregistre path
Option:
- worker async (scan/resize) + tags/metadatas3) Backups PostgreSQL + lifecycle
Bucket: ideolab-backups (private)
- versioning ON
- lifecycle: 30j -> nearline, 180j -> coldline, 365j -> archive
- accès: SA backup + auditors
- (option) retention 30j (anti-suppression)4) Exports logs / analytics
Option A: Export logs -> BigQuery (requêtes direct)
Option B: Export logs -> GCS (data lake) -> Dataflow/BigQueryPièges & anti-patterns (GCS)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Bucket public “par accident” | Objets accessibles sans auth | Fuite de données | Bucket privé + Signed URLs + IAM strict |
| Versioning ON sans lifecycle | Coût qui grimpe doucement | Stockage “infini” | Purger versions non courantes après X jours |
| LIST partout | Beaucoup d’opérations | Coûts + lenteur | Indexer en DB, prefixes ciblés |
| Backups en Standard à vie | Rétention longue | Coût inutile | Lifecycle vers Nearline/Coldline/Archive |
| TTL Signed URL trop long | Liens partageables trop longtemps | Risque d’exfiltration | TTL court (5–15 min) + contrôle app |
| Bucket loin des workloads | Latence + egress | Perf + coût | Même région + CDN |
Checklist “prod ready”
- Bucket privé + IAM (pas ACL).
- SA dédié avec droits minimaux (objectViewer/objectAdmin sur bucket ciblé).
- Versioning/retention selon criticité.
- Lifecycle (transition + purge versions).
- Signed URLs pour accès utilisateurs.
- CDN pour static public.
Objectif : déployer une DB managée prod-ready : choix de sizing, HA multi-zone, sauvegardes + PITR, replicas, connexions privées (Private IP / PSA), sécurité (IAM/Secrets), observabilité et plan de migration/cutover.
Cloud SQL : ce que tu “gagnes” (et ce que tu gardes)
| Aspect | Cloud SQL gère | Tu gères encore | Pourquoi c’est important |
|---|---|---|---|
| Infra | VM DB, stockage managé, patching infra | Paramétrage DB, schémas, requêtes, indexes | “Managé” ≠ “sans tuning” |
| HA | Failover (selon config) | Design applicatif (retries, timeouts) | Failover = mini interruption, il faut le gérer côté app |
| Backups | Backups planifiés + options PITR | Politiques, tests restore, RPO/RTO | Un backup non testé = un backup “imaginaire” |
| Sécurité | Intégrations IAM/Logs/KMS (selon) | Réseau privé, comptes DB, secrets | Les fuites viennent souvent du mauvais réseau / secrets |
Choix rapide PostgreSQL vs MySQL
- PostgreSQL : excellent pour requêtes complexes, JSONB, extensions, integrity, analytics light.
- MySQL : souvent simple et efficace pour workloads web classiques.
- Dans ton contexte (IDEO-Lab / workloads variés / tuning), PostgreSQL est souvent le meilleur “socle”.
HA (High Availability) : multi-zone + failover
En HA, tu as un primary + un standby (généralement dans une autre zone). En cas de panne, Cloud SQL bascule sur le standby (failover).
Points à retenir
- Failover ≠ “zéro coupure” : tu auras une courte période d’indisponibilité.
- Ton application doit gérer : retries, timeouts, reconnexion pool.
- Mettre en place des alertes : failover events, erreurs de connexions, saturation.
Design app “failover-friendly” (pattern)
Backend (Django / API)
- Connection pooling raisonnable
- timeouts courts + retries contrôlés
- transactions courtes (éviter locks longs)
- idempotence sur opérations critiques si possibleLe plus gros problème pendant un failover : pools de connexions “cassés” qui ne se reconstruisent pas correctement.
Backups & PITR (Point-In-Time Recovery)
| Mécanisme | À quoi ça sert | RPO | Recommandation |
|---|---|---|---|
| Backups planifiés | Restaurer un état “snapshot” | J-1 (selon fréquence) | 1 backup/jour minimum en prod |
| PITR | Restaurer à une heure précise (avant incident) | Minutes | Très utile contre suppression/bug applicatif |
Règles simples de rétention
Rétention type (à adapter)
- Quotidien : 7 à 14 jours
- Hebdo : 4 à 8 semaines
- Mensuel : 6 à 12 mois (si besoin)
+ Tests restore réguliers (trimestriel minimum)Test restore (obligatoire)
- Restaurer dans un projet/stage séparé.
- Lancer un set de requêtes de validation (schéma, data, indexes, perf basique).
- Documenter RTO réel (temps de restauration + remise en service).
Read replicas : scaler la lecture (et isoler du reporting)
Les read replicas répliquent le primary (asynchrone en général) et servent la lecture. Parfait pour : endpoints read-heavy, exports, reporting, dashboards.
| Cas | Pourquoi replica | Attention | Bonne pratique |
|---|---|---|---|
| Reporting / BI | Ne pas tuer la prod | Lag de réplication | Accepter “eventual consistency” |
| Read-heavy API | Décharger le primary | Routing read/write | Read-only endpoints séparés |
| Exports / jobs | Longues requêtes hors prod | Locks / queries lentes | Limiter la charge, indexer |
Pattern routing (simple)
Writes -> primary
Reads -> replica(s) (si acceptable)
Exceptions:
- lectures "juste après write" -> primary (éviter incohérence)Réseau : Private IP (best practice) + PSA
En prod, on évite l’IP publique sur la DB. Le bon design : Cloud SQL en Private IP via VPC (souvent en utilisant Private Service Access), et tes workloads (MIG/GKE/Run) dans des subnets privés.
Patterns de connexion
| Client | Connexion | Recommandé | Notes |
|---|---|---|---|
| Compute Engine / MIG | Private IP direct | Oui | Firewall interne + SA |
| GKE | Private IP + VPC-native | Oui | Workload Identity + policies réseau |
| Cloud Run | Via connecteur VPC (si privé) | Souvent | Attention au pooling et au scaling |
| Public IP | SSL + allowlist | Non (prod) | Surface d’attaque + erreurs config |
Checklist réseau DB
- DB sans IP publique (si possible).
- Autoriser uniquement les subnets “apps” (ou SA ciblés) → port DB.
- Éviter d’exposer pgAdmin/outils admin au public (IAP/bastion).
Sécurité : comptes DB, IAM, secrets
3 couches à gérer
- Réseau : private IP + firewall strict (socle).
- Auth DB : users DB séparés (app, admin, readonly).
- Secrets : stockés dans Secret Manager (rotation si possible).
Pattern “comptes DB” propre
Users DB:
- app_user : droits minimaux (schema + CRUD nécessaires)
- ro_user : read-only (reporting / exports)
- admin_user : ops (migrations) -> accès très contrôlé
Secrets:
- secret/db/app_user_password
- secret/db/ro_user_passwordRègles d’or
- Pas de mot de passe DB dans le repo.
- Pas de “superuser” pour l’app.
- Logs d’audit / alertes sur accès anormaux (si activés).
Performance : ce qui compte vraiment (PostgreSQL/MySQL)
Checklist perf (pragmatique)
- Index : sur colonnes filtrées / join / order by (sinon CPU brûle).
- Requêtes lentes : analyser et corriger (profiling).
- Connexions : limiter et pooler (Django + pgbouncer selon contexte).
- IO : surveiller disque/latence (souvent le vrai goulot).
- Autovacuum / bloat (Postgres) : surveiller et ajuster si besoin.
Pooling : point critique Cloud Run/GKE
Problème classique:
- scaling horizontal -> trop de connexions -> DB saturée
Solutions:
- limiter la concurrence par instance (Run)
- utiliser pooling (pgbouncer) si nécessaire
- séparer read replicas pour reporting
- monitorer "connections", "cpu", "disk latency"Pour une app Django très concurrente, le “max_connections” est souvent le point de rupture avant même le CPU.
Migrations & cutover : passer en prod sans douleur
3 stratégies
| Stratégie | Quand | Avantage | Limite |
|---|---|---|---|
| Dump/Restore | DB petite/moyenne | Simple | Downtime (fenêtre) |
| Réplication | DB plus grosse | Downtime réduit | Plus complexe |
| Dual-write / refactor | Très critique | Quasi zéro downtime | Complexité applicative |
Plan “cutover” (pratique)
- Créer Cloud SQL (staging) + importer un snapshot/dump.
- Tests perf + tests applicatifs (requêtes, migrations, index).
- Mettre en place réplication ou plan de freeze writes.
- Fenêtre de cutover : stop writes → sync final → switch DSN → smoke tests.
- Rollback plan : revenir à l’ancienne DB si smoke tests KO.
Le rollback doit être “exécutable” (script/document) — pas juste une idée.
Runbook prod (checklist “prod ready”)
| Bloc | Action | OK si |
|---|---|---|
| HA | Activer HA multi-zone | Failover testé / alertes en place |
| Backups | Daily + PITR + rétention | Restore testée |
| Réseau | Private IP + firewall strict | Pas d’IP publique (prod) |
| Sécurité | Users DB séparés + secrets manager | Pas de superuser pour l’app |
| Perf | Monitoring queries/IO/connections | Alertes sur saturation |
| Replicas | Ajouter si read-heavy | Reporting isolé |
| Ops | Patch window + procédures | Changements maîtrisés |
Observabilité minimale
Surveiller:
- cpu, memory
- disk latency / iops
- connections + errors
- replication lag (si replicas)
- slow queries (si activé)Pièges & anti-patterns (Cloud SQL)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| DB avec IP publique | Connexion internet possible | Surface d’attaque énorme | Private IP + PSA + bastion/IAP |
| Pas de PITR | Impossible de revenir “à 10:32” | Bug applicatif = perte data | Activer PITR + tester restore |
| Pas de tests restore | Backups “théoriques” | DR impossible | Test restore régulier |
| Trop de connexions | Errors “too many connections” | Indispo sous charge | Pooling, limiter concurrency, pgbouncer |
| Requêtes non indexées | CPU élevé, latence | Scaling coûteux | Index + analyse requêtes lentes |
| Reporting sur primary | DB “freeze” pendant exports | Impact prod | Read replica dédiée |
Conclusion (ultra pragmatique)
- Prod = Private IP + HA + backups/PITR + monitoring.
- Charge lecture = read replicas.
- Risque n°1 = connexions et requêtes lentes (pas “le cloud”).
Objectif : comprendre BigQuery comme un entrepôt analytique serverless (tu payes surtout ce que tu scannes), et apprendre à concevoir des tables “clean” : partitionnement, clustering, schémas stables, ingestion (batch/stream), et exports (GCS/BI) — avec un focus très concret sur perf + coût.
BigQuery : le modèle mental
| Objet | Définition | Exemple | Pourquoi c’est important |
|---|---|---|---|
| Project | Contexte billing + quotas + IAM | ideolab-data-prod | Isoler coûts “data” du reste |
| Dataset | Conteneur de tables (région) | dataset: analytics | Localisation & IAM au bon niveau |
| Table | Colonnes, partitions, cluster | analytics.events | Design table = perf & coût |
| Job | Exécution d’une requête / load / export | query job | Tout passe par des jobs (traçable) |
| Bytes scanned | Volume scanné par requête | “Tu payes le scan” | Le centre de gravité du coût |
Use cases
- Analytics (trafic, événements, logs structurés).
- Reporting (KPI, dashboards, cohortes).
- Audit/ops (requêtes sur logs exportés).
- Data platform (staging → curated → marts).
Modèle de coût : “tu payes surtout ce que tu scannes”
| Type de coût | Ce qui déclenche | Levier | Piège |
|---|---|---|---|
| Stockage | Go stockés (tables) | Rétention, partitions, compression | Tables “append-only” sans purge |
| Requêtes | Bytes scanned | Partition + clustering + éviter SELECT * | Full scan sur table énorme |
| Streaming / ingestion | Selon méthode | Batch si possible | Streaming inutile sur logs non critiques |
| Exports | Jobs export | Exporter “curated”, pas brut | Exporter le brut gigantesque trop souvent |
Règle d’or “anti-facture”
Toujours:
- filtrer sur la partition (WHERE sur la date)
- sélectionner uniquement les colonnes nécessaires
- éviter SELECT * sur tables larges
=> réduit coût + accélère p95Le meilleur “tuning” BigQuery, c’est un bon design de tables (partition/cluster) + discipline SQL.
Schéma & types : faire simple et stable
Conseils pratiques
- Choisir un schéma évolutif : colonnes additionnelles OK, mais éviter de casser les noms/types.
- Pour événements/logs : un champ event_ts (TIMESTAMP) + event_date (DATE) est très utile.
- Utiliser des STRUCT/RECORD pour grouper (ex: user, http, geo).
- Ne pas “tout mettre en JSON string” : tu perds l’optimisation SQL.
Exemple de table d’événements (clean)
analytics.events
- event_ts TIMESTAMP
- event_date DATE
- event_type STRING
- user_id STRING
- http STRUCT
- geo STRUCT
- meta STRUCT
- payload STRING (option: JSON brut si besoin) Pattern classique : colonnes “top-level” pour les filtres fréquents, STRUCT pour le reste.
Partitionnement : éviter de scanner “tout”
Le partitionnement découpe la table en “tranches” (souvent par date) pour que BigQuery ne lise que ce qui est nécessaire. C’est le meilleur levier perf + coût.
Types fréquents
- Partition par colonne DATE/TIMESTAMP (recommandé : event_date / event_ts).
- Partition par ingestion time (pratique mais moins sémantique).
Bon pattern (logs/events)
Table partitionnée sur event_date
- WHERE event_date BETWEEN '2026-02-01' AND '2026-02-07'
=> scan limité aux partitions utilesRègles simples
- Toutes les requêtes “standard” doivent filtrer la partition (sinon “full scan”).
- Mettre une politique de rétention : supprimer partitions anciennes (ou archiver ailleurs).
- Si tu fais du “temps réel”, partition par jour + clustering donne déjà de très bons résultats.
Clustering : accélérer les filtres fréquents
Le clustering organise les données dans la partition selon 1..N colonnes (ex: user_id, event_type), ce qui améliore le “pruning” sur ces colonnes.
Quand ça aide
- Filtres fréquents sur les mêmes colonnes (user_id, ip, event_type, status, path).
- Jointures répétées sur une clé.
Bon pattern
analytics.events
- Partition: event_date
- Cluster: user_id, event_type, http.status
=> queries plus rapides + moins de bytes scannésErreurs classiques
- Cluster sur une colonne “unique” (peu d’intérêt).
- Cluster sur 10 colonnes (inutile) : rester sur les 2-4 plus fréquentes.
- Oublier que le partitionnement est souvent plus important que le clustering.
Performance SQL : discipline qui fait gagner (vraiment)
Top règles
- Ne jamais faire
SELECT *sur table large : choisir les colonnes. - Filtrer la partition systématiquement.
- Préférer approx (si acceptable) pour certaines métriques volumineuses.
- Éviter les JOIN inutiles : pré-agréger si possible.
- Limiter les “explosions” (ex: UNNEST massif) sans filtre.
Exemples (bons réflexes)
OK (filtre partition + colonnes)
SELECT event_date, event_type, COUNT(*) AS n
FROM analytics.events
WHERE event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
GROUP BY event_date, event_type;
KO (full scan + SELECT *)
SELECT * FROM analytics.events;Dans 90% des cas, le “tuning” = empêcher le full scan.
Ingestion : batch vs streaming (choisir intelligemment)
| Méthode | Quand | Avantage | Limite |
|---|---|---|---|
| Batch load | Logs journaliers, imports | Simple, souvent plus économique | Pas “temps réel” |
| Streaming | Event real-time | Données quasi immédiates | À réserver aux vrais besoins RT |
| Connecteurs | Sources gérées | Moins d’ops | Dépend du source |
Pipeline type (logs web)
Option A (simple):
- Export logs -> GCS (par jour) -> Load BigQuery
Option B (temps réel):
- Pub/Sub -> Dataflow -> BigQuery (streaming)Pour beaucoup de cas “ops/analytics”, un batch journalier suffit et coûte moins cher.
Exports & partage : GCS, BI, datasets
Exports
- Vers GCS : exports de tables ou résultats de requêtes (archivage, interchange).
- Vers BI : dashboards, data studio/Looker (selon stack).
- Snapshots : conserver un état “curated” avant transformation.
Bon pattern
Niveaux data:
- raw : ingestion brute (partitionnée)
- curated : nettoyée/normalisée (partition+cluster)
- marts : tables métiers (KPI) -> BI
=> exports BI depuis "marts", pas depuis "raw"Si tu exposes les users/analystes directement au “raw”, tu perds le contrôle du coût (full scans à répétition).
Gouvernance & sécurité : IAM, séparation, guardrails
Bonnes pratiques
- Mettre BigQuery dans un project data dédié (ex: ideolab-data-prod).
- IAM par dataset : readers, writers, jobUsers séparés.
- Éviter “Editor” sur le project data.
- Budgets + alertes : le data peut exploser vite si mal utilisé.
Pattern groupes (exemple)
Groups:
- data-admins : gestion datasets (restreint)
- data-engineers : écriture raw/curated
- analysts : lecture marts + lancement requêtes
- auditors : lecture logs/auditGuardrail très utile : limiter qui peut lancer des queries sur le “raw” (sinon full scans).
Patterns IDEO-Lab : analytics trafic + anti-bots (très concret)
1) Table d’événements web (hits/logs)
analytics.web_hits
- Partition: hit_date
- Cluster: ip, path, status, ua_hash
But:
- détecter bursts, ranges IP agressifs
- mesurer latence, 4xx/5xx
- suivre top endpoints2) KPI “ops” (marts)
marts.kpi_daily
- date, requests, unique_ips, errors_5xx, p95_latency
=> dashboards rapides (tables petites, query cheap)3) Exports
Exports vers GCS:
- rapport hebdo (CSV/JSON)
- snapshots mensuels (archivage / compliance)Ton cas “NetGuard / flood” est parfait pour BigQuery : tu peux faire des group by sur IP ranges / ASN / pays et sortir des règles.
Pièges & anti-patterns (BigQuery)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Pas de partition | Chaque requête scanne tout | Coût + latence | Partition par date/ingestion |
| SELECT * | Bytes scanned énormes | Facture | Sélection colonnes + vues/marts |
| Analystes sur raw | Queries “exploratoires” massives | Explosion coûts | Curated + marts + guardrails IAM |
| UNNEST sans filtre | Explosion lignes | Perf/cost | Filtrer avant UNNEST, pré-agréger |
| Cluster “au hasard” | Peu de gain | Complexité inutile | Cluster sur colonnes filtres fréquents |
| Pas de budgets | Surprise | Facture | Budgets + alertes + dashboards coût |
Checklist “prod ready”
- Project data séparé + IAM par dataset.
- Tables “events/logs” partitionnées (DATE) + clustering (2–4 colonnes utiles).
- Curated + marts pour BI (éviter raw direct).
- Budgets + alertes + discipline SQL (pas de SELECT *).
- Exports GCS planifiés uniquement sur tables petites/curated.
Objectif : comprendre GKE comme la plateforme “container native” de Google : comment choisir Autopilot vs Standard, déployer proprement (Deployment/Service/Ingress), auto-scaler (HPA + node autoscaling), gérer configs/secrets, et construire une architecture prod (réseau privé, observabilité, upgrades, sécurité).
Les concepts Kubernetes à maîtriser (sans se noyer)
| Objet | Rôle | À quoi ça sert | Piège |
|---|---|---|---|
| Node | Machine (VM) | Héberge des pods | Oublier node autoscaling / sizing |
| Pod | Unité d’exécution | 1..N containers + réseau local | Pas de resources requests/limits |
| Deployment | Gestion du rollout | Versionner, scaler, rollback | Rollouts sans probes |
| Service | IP stable | Expose un set de pods | Mauvais type (ClusterIP/LoadBalancer) |
| Ingress | Entrée HTTP(S) | LB L7 + host/path routing + TLS | Confusion Ingress vs Service |
| ConfigMap / Secret | Config runtime | Env vars, fichiers, tokens | Secrets dans le repo |
| HPA | Autoscaling pods | Scale sur CPU/métriques | HPA sans requests CPU |
Modèle mental “prod”
Image (Artifact Registry)
-> Deployment (rollout/rollback)
-> Service (IP stable interne)
-> Ingress (LB global + TLS + règles)
Scaling:
- HPA (pods)
- Node autoscaler (nodes) (Standard)
Ops:
- probes + logs + metrics + alertsKubernetes est puissant, mais il faut rester “sobre” : peu d’objets, des conventions, et des règles de rollout strictes.
Autopilot : Kubernetes “PaaS” (le plus simple)
Autopilot enlève une grosse partie de l’ops : Google gère beaucoup plus (nodes, sizing, contraintes de sécurité), et tu raisonnes surtout en pods (resources). C’est souvent le meilleur choix pour démarrer vite et garder un cluster “propre”.
| Critère | Autopilot | Impact |
|---|---|---|
| Gestion nodes | Gérée par Google | Moins d’ops, moins d’erreurs |
| Facturation | Pod resources (simple) | Lisible, mais discipline requests/limits |
| Contraintes | Plus strict | Moins de “bidouilles”, plus de standard |
| Cas idéal | Web/API, microservices, équipes petites | Go fast |
Bonnes pratiques Autopilot
- Définir requests/limits réalistes (sinon coût/perf partent n’importe où).
- Utiliser readiness/liveness probes (rollouts fiables).
- Éviter les manifests “exotiques” : rester dans le chemin standard.
Pour une app Django/API “classique”, Autopilot est souvent le meilleur ratio simplicité/robustesse.
Standard : contrôle total (et responsabilité totale)
Standard te donne la main sur node pools, types de machines, autoscaling nodes, GPU, spot/preemptible, taints/tolerations, etc. C’est plus flexible, mais aussi plus “ops heavy”.
| Besoin | Standard est utile si... | Exemples |
|---|---|---|
| Optimisation coût | Tu veux spot/preemptible & pools dédiés | Workers batch, jobs non critiques |
| Workloads spéciaux | GPU, kernel tuning, contraintes | ML, compute particulier |
| Gouvernance fine | Multi-équipes, isolations fortes | Namespaces + quotas + pools |
Checklist Standard (à faire propre)
- Node pools par rôle : web / workers / ops.
- Activer node autoscaling (sinon HPA scale pods mais plus de place).
- Stratégie upgrades : canary, maintenance windows, rollback.
Erreur classique : HPA fonctionne mais le cluster n’a pas de nodes en plus → pods Pending → prod down.
Réseau & Ingress : l’entrée HTTP(S) “propre”
Deux patterns d’exposition
| Pattern | Exposition | Quand | Note |
|---|---|---|---|
| Ingress (L7) | HTTP(S) LB global + host/path | Web/API | Le meilleur pour TLS + routing + WAF |
| Service LoadBalancer (L4) | IP + port | Cas non HTTP | Simple mais moins de features |
Ingress “prod” (mental model)
(Internet)
|
[HTTP(S) Load Balancer global]
|-- TLS / cert managé
|-- (option) Cloud Armor (WAF/rate-limit)
|
[GKE Ingress] -> Services -> PodsBonnes pratiques réseau
- Cluster “private” si possible (nodes sans IP publique).
- Limiter l’entrée à l’Ingress (pas d’accès direct aux nodes).
- Pour sortir sur Internet depuis workloads privés : Cloud NAT côté VPC.
Autoscaling : HPA + (node autoscaler)
HPA (pods)
- Scale le nombre de pods selon CPU/mémoire ou métriques custom.
- Indispensable : définir requests CPU (sinon HPA n’a pas de base fiable).
- Ajouter “stabilization” pour éviter oscillations.
Node autoscaler (nodes) — Standard
- Ajoute/retire des nodes selon pods Pending.
- Doit être dimensionné : max nodes, pools séparés, quotas.
Pattern complet
HPA:
- minReplicas: 2
- maxReplicas: 20
- targetCPUUtilization: 60%
Standard:
- node autoscaling ON (min/max nodes)
- pools séparés web/worker (option)Pour un trafic bot/flood : tu veux scaler, mais aussi limiter (Armor/rate-limit) sinon tu “scales pour payer”.
Déploiement Django/API : pipeline clean
Étapes (pattern éprouvé)
1) Build image Docker -> Artifact Registry
2) Apply manifests:
- Deployment (web)
- Service (ClusterIP)
- Ingress (HTTP(S) LB + TLS)
3) Probes:
- readiness: /healthz
- liveness : /healthz (ou /live)
4) Autoscaling:
- HPA (CPU/RPS)
5) Config:
- ConfigMap + Secrets (ou Secret Manager)
6) Observabilité:
- logs/metrics + alerting + dashboardsDécoupage recommandé (Django)
| Composant | Type | Rôle | Notes |
|---|---|---|---|
| web | Deployment | API + pages | stateless, scale horizontal |
| worker | Deployment | Celery/async jobs | pool séparé, autoscaling distinct |
| migrate | Job | migrations DB | run à chaque release (contrôlé) |
| beat | Deployment | cron scheduler | 1 replica (leader) si besoin |
Alternative : si ton service est “simple API”, Cloud Run est souvent plus rapide à opérer (mais GKE brille en multi-services + contrôle).
Config & Secrets : éviter les secrets en dur
Options
- ConfigMap : variables non sensibles (flags, URLs).
- K8s Secrets : sensible, mais attention à la gouvernance.
- Secret Manager : option “enterprise” (rotation, audit) — idéal en GCP.
Pattern “best” GCP
- Secret Manager contient les secrets (DB, API keys)
- Workload identity (pod -> SA GCP) pour lire secrets
- Injection au runtime (env vars ou volume)
=> pas de clés JSON, pas de secrets en repoAnti-pattern : mettre un fichier key.json dans l’image Docker. À proscrire.
Observabilité : logs, métriques, traces
Minimum vital
- Logs applicatifs structurés (json si possible).
- Métriques : CPU, mémoire, pods restart, HPA events, latence HTTP (p95/p99).
- Alertes : 5xx, crash loops, pods Pending, saturation nodes.
Dashboards utiles
Dashboards (idées)
- Ingress: RPS, 4xx/5xx, latence
- Workloads: restarts, replicas, CPU/mem
- Cluster: nodes, saturation, pending pods
- DB: connections, latency, errorsEn prod, tu veux savoir “ça tombe pourquoi” en 2 minutes : logs + métriques + traces.
Sécurité & durcissement : l’essentiel
Checklist sécurité (pragmatique)
- Cluster privé (si possible) + contrôle egress.
- RBAC Kubernetes : droits par namespace (pas cluster-admin partout).
- Workload Identity : pods → SA GCP, sans clés statiques.
- Network Policies (si utilisées) : limiter trafic inter-services.
- Pod security : éviter root, readOnlyRootFilesystem si possible.
- Images signées/scannées (pipeline CI).
Front-door sécurité
LB + Armor (option)
- WAF rules
- rate-limit sur /api et endpoints sensibles
- blocage IP/ranges si besoin
=> tu arrêtes le bruit avant d’atteindre le clusterUpgrades & ops : éviter la “maintenance surprise”
Stratégie recommandée
- Maintenance windows (prod) + communication interne.
- Upgrades par étapes : staging → canary → prod.
- Rolling updates sur Deployments (avec readiness probes).
- Rollback prêt : image précédente + manifests versionnés.
Hygiène cluster
- Limiter les add-ons “magiques” (complexité).
- Namespaces + conventions de labels.
- Nettoyage des ressources “orphelines” (jobs, old replicasets).
Patterns IDEO-Lab (hyper adaptés à ton contexte)
1) Déployer le moteur de traduction (workers séparés)
Workloads:
- api (Django)
- translate-worker (celery/async)
- scheduler (beat)
Scaling:
- HPA agressif sur worker (selon backlog)
- HPA modéré sur api
Sécurité:
- Workload Identity pour accéder GCS/Secret Manager
=> scale indépendant, coût maîtrisé2) Anti-bots / flood
LB -> Armor -> Ingress -> Services -> Pods
- rate-limit sur /api, /login, /admin
- logs vers BigQuery (analytics)
=> tu analyses puis tu bloques intelligemment3) Séparer “apps” et “data”
Namespaces:
- apps-prod
- data-prod (ou services internes)
RBAC:
- ops team admin namespace
- dev read-only prod
Network policies:
- apps -> data (ports stricts)Pièges & anti-patterns (GKE/K8s)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Pas de probes | Rollout casse tout | Indispo | readiness/liveness + /healthz |
| requests/limits absents | HPA incohérent | Coût/perf instables | Définir requests réalistes |
| HPA sans node autoscaling (Standard) | Pods Pending | Indispo sous charge | Node autoscaler + quotas |
| Secrets dans l’image | key.json / .env embarqué | Fuite | Secret Manager + Workload Identity |
| Cluster-admin partout | Tout le monde peut tout faire | Erreur humaine / compromission | RBAC + groupes + namespaces |
| Tout sur GKE “par principe” | Ops lourde pour service simple | Temps/cost | Évaluer Cloud Run pour microservices |
Checklist “prod ready”
- Choisir Autopilot (si possible) pour réduire l’ops.
- Ingress + TLS + (option) Armor/rate-limit.
- Probes + rollouts contrôlés + rollback prêt.
- Requests/limits + HPA (et node autoscaling si Standard).
- Secret Manager + Workload Identity (0 clés statiques).
- Dashboards + alertes (restarts/pending/latence/5xx).
Objectif : utiliser Artifact Registry comme “source of truth” pour tes artefacts (images Docker/OCI, packages), avec IAM propre, policies de rétention, scanning vulnérabilités, et (selon stack) signatures. C’est le maillon central d’un pipeline : build → push → deploy vers GKE ou Cloud Run.
Pourquoi Artifact Registry est “central”
- Source unique des images : tu sais exactement “quoi” tourne en prod (digest immuable).
- IAM + audit : contrôle qui push/pull, et tu traces les actions.
- Intégration native avec Cloud Build : build → push → deploy.
- Hygiène : policies de rétention, nettoyage automatique, tags cohérents.
Mental model
Git -> CI (Cloud Build)
-> build image
-> push Artifact Registry (repo)
-> deploy (GKE / Cloud Run)
-> runtime pull l’image (IAM)
-> monitoring + rollback via version précédenteSans registry “propre”, ta prod devient vite un patchwork d’images non traçables, difficiles à rollback.
Repos & formats (Docker/OCI… et plus)
| Repo | Artefacts | Quand | Notes |
|---|---|---|---|
| Docker/OCI | Images containers | GKE, Cloud Run, batch jobs | Le plus fréquent |
| Packages | lib internes (selon usage) | Mono-repo / shared libs | Utile en entreprise |
Règles de conception
- Un repo par domaine : ideolab-app, ideolab-workers, ideolab-tools.
- Choisir la région proche des workloads (éviter latence/egress).
- Ne pas mélanger prod/dev : repos ou projets séparés.
IAM & sécurité : qui peut push/pull ?
Le bon design : humains via groupes, machines via service accounts. Zéro “clé partout”.
Rôles (idées pragmatiques)
Humains:
- developers : lecture (pull) + éventuellement push en dev
- release-managers / platform-ops : push prod + gestion tags/releases
Machines:
- cloudbuild-sa : push images
- gke-nodes/runner-sa : pull images
- cloudrun-runtime-sa : pull imagesRègles d’or
- Le runtime (GKE/Run) doit être pull-only (jamais push).
- La CI (Cloud Build) doit être push (et rien d’autre).
- Limiter les droits admin sur le repo (sinon suppression/retag non maîtrisés).
Le risque n°1 : donner “writer” trop largement. Tu perds la garantie “image = release”.
Tags & versioning : stable vs mutable
Règles simples (qui évitent les drames)
- Tag immutable recommandé :
app:2026.02.01-1ouapp:gitsha. - Tag mutable (ex:
latest) : OK en dev, dangereux en prod. - En prod, déployer idéalement par digest (immuable).
Convention de tags (exemple solide)
Tags:
- app:git- (immutable)
- app:rel-2026.02.01-1 (immutable)
- app:staging (mutable)
- app:latest (dev only) Pourquoi les digests sont “béton”
image: app@sha256:...
=> garantit qu’on déploie EXACTEMENT l’image buildée
=> rollback simple (digest précédent)Policies de rétention & nettoyage
Sans politique, tu accumules des centaines d’images et tu payes du stockage… et surtout tu perds la lisibilité. Le but : conserver ce qui sert (releases) et purger le bruit (builds intermédiaires).
Politique typique (exemple)
Conserver:
- les 50 derniers tags "git-*" (dev/staging)
- toutes les releases "rel-*" pendant 6 à 12 mois
- (option) 1 release/mois pendant 2 ans (compliance)
Supprimer:
- images sans tag (dangling) après 7-14 jours
- anciens builds CI non référencésHygiène “release”
- Chaque release doit correspondre à un tag “rel-*” + digest.
- Documenter le mapping : release → commit → digest → déploiement.
- Le cleanup ne doit jamais casser le rollback : garder au moins N versions prod.
Vulnerability Scanning : ne pas pousser des bombes
Le scanning détecte des vulnérabilités dans les layers (OS libs, packages, etc.). C’est un garde-fou : tu vois le risque avant déploiement.
Bonnes pratiques
- Utiliser des base images slim (moins de surface).
- Mettre à jour régulièrement l’OS layer (rebuild planifié).
- Bloquer (policy CI) les images avec vulnérabilités critiques (selon tolérance).
Pipeline “propre”
CI:
- build
- scan
- if severity >= CRITICAL -> fail
- push (ou push puis gate avant deploy)
- deployMême sans gate automatique, le scanning apporte une visibilité énorme sur la dette sécurité.
Signatures & provenance : confiance dans la supply chain
Le but : prouver qu’une image vient bien de ta CI (et pas d’un push manuel). Selon ta stack : signatures, attestations, SBOM, et vérification à l’admission (cluster).
Pattern conceptuel
Cloud Build (seul) -> signe/atteste l’image
GKE -> n’accepte que les images signées par la CI
=> empêche les pushes “sauvages” en prodQuand c’est indispensable
- Prod sensible (banque/défense), exigences compliance.
- Équipes larges → risque d’erreur humaine.
- Supply chain : dépendances multiples.
Même sans enforcement total, documenter “CI-only push” + IAM strict couvre déjà beaucoup.
CI/CD avec Cloud Build : pipeline “référence”
Pipeline minimal (lisible)
git push -> Cloud Build Trigger
1) docker build
2) docker push Artifact Registry
3) deploy:
- Cloud Run: gcloud run deploy ...
- GKE: kubectl apply / helm upgradeBonnes pratiques CI
- Tagger l’image avec git sha + release tag (si prod).
- Build reproductible (Dockerfile propre, .dockerignore).
- Cache build (si dispo) pour accélérer.
- Promouvoir : dev → staging → prod (même digest, pas “rebuild différent”).
Gating “simple” (staging → prod)
- Build + deploy staging automatique
- Tests smoke (HTTP 200 /healthz)
- Promotion manuelle prod (sur tag rel-*)Déploiement : Cloud Run vs GKE
| Cible | Comment | Avantage | Attention |
|---|---|---|---|
| Cloud Run | Deploy direct l’image | Très peu d’ops | Connexions DB / concurrency |
| GKE | Deployment/Helm + image digest | Contrôle + multi-services | Plus d’ops (rollout, cluster) |
Rollback (règle d’or)
Toujours pouvoir revenir:
- Cloud Run: revision précédente
- GKE: redeploy digest précédent (ou rollback deployment)Patterns IDEO-Lab (très réutilisables)
1) Mono-repo, multi-images
Repos:
- ideolab-api
- ideolab-worker
- ideolab-tools
Tagging:
- git-
- rel-YYYY.MM.DD-N (prod) 2) Pipeline anti-bots / stabilité
Staging auto:
- déploiement
- smoke tests
- vérif /healthz + latence
Prod:
- promotion sur tag "rel-*"
- rollback prêt (digest précédent)3) Séparation des identités
SAs:
- cloudbuild-sa : push
- gke-runtime-sa / run-runtime-sa : pull only
=> évite qu’un runtime puisse publier des imagesPièges & anti-patterns (Artifact Registry)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Tout le monde Writer | Push manuels | Prod non maîtrisée | CI-only push + IAM strict |
| Tags “latest” en prod | Déploiements non reproductibles | Rollback impossible | Déployer par digest + tags immuables |
| Pas de rétention | Stockage gonfle | Coût + confusion | Policies + purge dangling |
| Secrets dans l’image | key.json embarqué | Fuite | Secret Manager + Workload Identity |
| Rebuild “différent” entre env | Staging OK, prod KO | Incohérence | Promouvoir le même digest |
| Pas de scanning | Vulns invisibles | Risque sécurité | Scan + gate (si possible) |
Checklist “prod ready”
- Repos séparés prod/dev (ou projets distincts) + région proche.
- IAM : CI push, runtime pull-only, humains via groupes.
- Tags immuables + déploiement par digest (prod).
- Policies rétention + purge images sans tag.
- Scanning vulnérabilités + rebuild planifié des base images.
- Rollback documenté (Run revisions / GKE digests).
Objectif : exploiter Cloud Run comme plateforme “serverless containers” ultra efficace pour des API et microservices : déploiement en minutes, scale 0 → N, révisions immuables, déploiements safe via traffic split, et design prod (IAM, VPC, DB, secrets, observabilité).
Cloud Run : le modèle mental
| Élément | Ce que c’est | Pourquoi c’est puissant | À surveiller |
|---|---|---|---|
| Service | Le “produit” déployé (URL stable) | Entrée HTTPS + scaling automatique | Permissions IAM (public/privé) |
| Revision | Version immuable d’un déploiement | Rollback instantané, canary | Ne pas “muter” une révision |
| Container | Image OCI/Docker | Déploiement ultra simple | Health, logs, ports |
| Autoscaling | 0 → N instances | Tu payes “à l’usage” | Connexions DB, cold starts |
| HTTPS | Front-door géré | TLS sans douleur | WAF/rate-limit si API exposée |
Quand Cloud Run est le meilleur choix
- API / microservices stateless.
- Workloads avec charge variable (0 la nuit, pics le jour).
- Déploiements rapides, peu d’ops (vs Kubernetes).
- Front HTTP(s) standard, intégration GCP (IAM, Secrets, Logging).
Cloud Run = “Kubernetes sans cluster à gérer” (dans l’esprit). Pour beaucoup d’API, c’est le sweet spot.
Autoscaling : 0 → N, concurrency, min instances
Ce qui pilote le scaling
- Requests : Cloud Run scale sur la demande.
- Concurrency : nombre de requêtes simultanées par instance (levier coût/perf).
- Min instances : éviter le “scale to zero” si tu veux latence stable (et réduire cold start).
- Max instances : garde-fou anti-facture / anti-flood.
Réglages pragmatiques (API web)
- concurrency: 20..80 (selon app)
- min instances: 0 (par défaut) / 1..2 si besoin latence stable
- max instances: limiter (ex: 50) pour éviter scaling infini en cas d'abus
- timeouts: adaptés (éviter 10min si pas nécessaire)Si ton API peut être floodée : max instances + WAF/rate-limit (Armor via LB) évite de “scaler pour payer”.
Revisions : immuables, auditables, rollbackables
Chaque déploiement crée une révision immuable. Une révision = image + config (env vars, resources, concurrency…). Tu peux envoyer du trafic à plusieurs révisions à la fois.
Bonnes pratiques
- Tagger l’image (git sha / release) et déployer le même digest entre staging/prod.
- Nommer les révisions (convention) pour faciliter le rollback.
- Conserver quelques révisions “golden” (rollback instant).
Rollback (instantané)
Rollback = repointer le trafic vers la révision précédente (100%)
=> pas besoin de rebuild, pas besoin de redeploy longLe modèle “revisions + traffic” est une arme massive pour déployer sans stress.
IAM & accès : service privé par défaut (recommandé)
Deux modes
| Mode | Qui peut appeler | Quand | Note |
|---|---|---|---|
| Privé (IAM) | Identités autorisées (SA/users) | API interne, backend-to-backend | Best practice pour services sensibles |
| Public | Tout internet | Endpoints publics (site/API publique) | À durcir (WAF, rate-limit, auth app) |
Pattern “prod clean”
Public (si besoin):
- Cloud Run public OU derrière un LB
- Auth applicative (JWT/session)
- (recommandé) WAF/rate-limit via Cloud Armor (devant)
Privé:
- Cloud Run privé
- appel via service account (workload identity)
- aucun endpoint public directPour une API interne, IAM est ultra efficace : tu évites d’exposer inutilement.
Traffic split : canary / blue-green / safe deploy
Le traffic split permet d’envoyer X% du trafic vers une nouvelle révision pour tester en prod (canary), puis monter progressivement à 100%. Rollback = revenir instantanément.
Canary simple (recommandé)
Étape 1 : déployer nouvelle révision
Étape 2 : 5% trafic -> nouvelle révision, 95% -> ancienne
Étape 3 : observer (erreurs 5xx, latence p95, logs)
Étape 4 : 25% -> 50% -> 100%
Étape 5 : si souci, rollback en 10 secondesBlue/Green
- Blue = révision stable
- Green = révision candidate (0% trafic)
- Switch 100% quand validéNe “promote” pas à 100% sans monitoring (5xx/latence). Cloud Run rend le rollback trop facile pour ne pas l’utiliser.
Réseau / VPC : accéder à des ressources privées
Si ton service doit accéder à des ressources privées (Cloud SQL private IP, services internes, etc.), tu utilises une intégration VPC (connectivité).
Cas typiques
- Accès à Cloud SQL en Private IP.
- Accès à un service interne sur VPC (ex: Redis managé, endpoint privé).
- Sortie internet contrôlée (egress) via NAT (selon design).
Bonnes pratiques réseau
- Limiter ce qui doit être privé : “private by default”.
- Surveiller l’egress (coûts) et les timeouts.
- Pour public : considérer Cloud Run derrière LB + Armor si tu veux un front-door robuste.
Cloud Run “simple” = public + IAM/app auth. Cloud Run “enterprise” = privé + VPC + front LB.
DB (Cloud SQL) : le point critique = connexions
Cloud Run scale horizontalement : si chaque instance ouvre trop de connexions DB, tu peux saturer Cloud SQL très vite. La discipline DB est le vrai sujet Cloud Run.
Règles pragmatiques
- Limiter la concurrency si la DB est fragile.
- Limiter le nombre de workers/threads qui ouvrent des connexions.
- Préférer des requêtes courtes, transactions courtes.
- Utiliser read replicas (si besoin) pour isoler reporting.
Pattern “API Django + Cloud SQL”
Cloud Run service:
- concurrency modérée (ex: 20)
- max instances limité (garde-fou)
- timeouts raisonnables
DB:
- user app minimal
- pool small (éviter 50 connexions par instance)
- monitoring connections + latencyAnti-pattern n°1 : “scale infini Cloud Run” + “pool DB énorme” = DB down.
Secrets & config : Secret Manager + service account runtime
Pattern recommandé
- Secrets dans Secret Manager (DB password, API keys)
- Cloud Run runtime service account (SA) a secretAccessor sur les secrets nécessaires
- Injection via env vars (ou au runtime)
=> aucun secret dans l'image Docker, aucun secret dans GitConfig non sensible
- Variables d’environnement : flags, URLs, mode, niveaux logs.
- Conventions : préfixes (ex: IDEOLAB_*) pour lisibilité.
Cloud Run + Secret Manager = un combo extrêmement “propre” pour garder ton repo clean.
Observabilité & ops : rendre le serverless “opérable”
Monitoring minimal
- RPS, latence p95/p99, 4xx/5xx.
- Instance count (scaling), throttling.
- Erreurs applicatives (Error Reporting), traces (si activées).
Alertes recommandées
Alertes:
- 5xx > seuil (sur 5 min)
- latence p95 > seuil
- erreurs DB / timeouts
- scaling anormal (ex: instances > 80% du max)
- crash loops (si observé via logs)Runbook “release safe”
- Déployer nouvelle révision.
- Traffic split 5% + observer.
- Monter progressivement.
- Si anomalies : rollback immédiat.
- Post-mortem : corriger + redeployer.
Patterns IDEO-Lab (très adaptés à ton écosystème)
1) NetGuard API sur Cloud Run + Armor
Front:
- HTTP(S) LB + Cloud Armor (rate-limit, WAF)
Backend:
- Cloud Run (API)
Data:
- logs -> BigQuery (analyse ranges IP, ASN, pays)
=> rapide, scalable, et tu contrôles le flood2) Microservices “tools”
Services:
- unminify-api
- analyzer-api
- translation-api (si stateless)
Each:
- Cloud Run + Secret Manager
- Artifact Registry + CI/CD
=> découplé, simple, rollback facile3) Front public + back office privé
- Front public (Cloud Run public ou via LB)
- Admin/ops endpoints privés (IAM)
- Separate service accounts + least privilegePièges & anti-patterns (Cloud Run)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Service public sans protection | Flood, pics 4xx/5xx | Coût + instabilité | Armor/rate-limit + auth + max instances |
| DB saturée par connexions | “too many connections” | Indispo | Limiter concurrency/pool + max instances |
| Timeouts énormes | Requêtes longues | File d’attente, coût | Async jobs (Pub/Sub, tasks), timeouts raisonnables |
| Secrets dans l’image | key.json, .env embarqué | Fuite | Secret Manager + SA runtime |
| Déploiement direct 100% | Incident à chaque release | Down | Traffic split + rollback |
| Pas de max instances | Scaling infini | Facture surprise | Max instances + WAF/rate-limit |
Checklist “prod ready”
- Images immuables (digest) depuis Artifact Registry + CI/CD.
- IAM : privé par défaut, public seulement si nécessaire.
- Traffic split (canary) + rollback documenté.
- Secrets via Secret Manager + runtime SA (least privilege).
- Garde-fous : max instances + concurrency adaptée.
- Si public : WAF/rate-limit (Armor via LB) + monitoring latence/5xx.
Objectif : construire un pipeline CI/CD propre avec Cloud Build : triggers Git (push/tag/PR), build reproductible, tests, scanning, push vers Artifact Registry, puis déploiement maîtrisé sur Cloud Run ou GKE (staging → prod, canary/rollback, IAM strict).
Cloud Build : à quoi ça sert (vraiment)
| Bloc | Rôle | Exemple | Gain |
|---|---|---|---|
| Build | Compiler/packager, construire image Docker | docker build | Reproductible, traçable |
| Tests | Empêcher les régressions | pytest, lint, smoke tests | Moins d’incidents prod |
| Registry | Publier l’artefact | push Artifact Registry | Source unique des images |
| Deploy | Mettre en prod (ou staging) | Cloud Run / GKE | Rollout contrôlé + rollback |
Mental model (CI/CD propre)
Git (push/tag) -> Trigger
-> build (Docker)
-> tests (unit + smoke)
-> scan (vulns) (option)
-> push Artifact Registry (digest immuable)
-> deploy staging
-> promotion prod (sur tag release) + rollback prêtLe vrai objectif : zéro push manuel en prod. La CI est la seule qui produit les images “autorisées”.
Triggers Git : automatiser “au bon moment”
| Trigger | Quand | Usage | Conseil |
|---|---|---|---|
| Push branch | Chaque commit sur main/dev | CI continue + déploiement staging | Rapide, feedback immédiat |
| PR / Merge request | Avant merge | Tests + lint (pas de deploy) | Quality gate |
| Tag release | Tag rel-* | Promotion prod | Contrôlé, traçable |
Pattern recommandé (simple et solide)
- Trigger PR : tests + lint (bloque merge si KO)
- Trigger main : build + deploy staging + smoke tests
- Trigger tag rel-* : build (ou promote digest) + deploy prod (canary) + monitorTu peux garder “prod” sur un trigger tag uniquement : ça évite les “déploiements accidentels”.
Pipeline de base (lisible, efficace)
Étapes minimales (CI/CD containers)
1) Checkout (implicite via trigger)
2) Build image Docker
3) Tests (unit)
4) (Option) Lint / format / type check
5) Push Artifact Registry
6) Deploy (staging)
7) Smoke test (HTTP /healthz)
8) Promotion prod (si tag release)Trois niveaux de maturité
| Niveau | Ce que tu as | Quand |
|---|---|---|
| V1 | build → push → deploy | POC / dev |
| V2 | + tests + smoke + rollback | prod “sérieuse” |
| V3 | + scan + signatures + policy CI-only | compliance / entreprise |
Docker build “propre” : reproductible + rapide
Bonnes pratiques Dockerfile
- Multi-stage build : builder → runtime (image finale plus petite).
- Base image slim (surface + scan plus simple).
- .dockerignore : exclure caches, venv, node_modules, logs.
- Pin versions (deps) autant que possible.
Tagging “propre” (immuable)
Tagger:
- app:git- (immutable)
- app:rel-YYYY.MM.DD-N (immutable)
Déployer idéalement par digest:
- app@sha256:... Le combo “tag immuable + digest” = rollback facile + déploiements reproductibles.
Tests & quality gates : empêcher la prod de casser
Gates recommandés
- Unit tests (rapides, à chaque commit).
- Lint (style + erreurs évidentes).
- Smoke tests (après deploy staging : /healthz, DB connect, endpoint simple).
- Migration check (si Django : détecter migrations non commitées).
Smoke test (pattern)
Après deploy staging:
- GET /healthz -> 200
- GET /version -> contient git sha
- (option) endpoint DB read-only -> OK
Si KO -> stop pipeline + rollback stagingSans smoke tests, tu déplaces le test “en prod” sur tes utilisateurs. À éviter.
Push Artifact Registry : IAM & séparation des identités
Principes IAM (très importants)
- Le service account Cloud Build a le droit de push (writer) sur le repo.
- Les runtimes (GKE nodes / Cloud Run SA) ont le droit de pull-only.
- Les humains : plutôt pull-only en prod (push réservé CI).
Policy “CI-only push” (golden rule)
Artifact Registry:
- writers: cloudbuild-sa
- readers: gke-runtime-sa, cloudrun-runtime-sa, developers (option)
=> aucun push manuel sur prodCe garde-fou réduit énormément les risques supply chain et les erreurs “à la main”.
Déploiement vers Cloud Run : simple, robuste, rollback facile
Pipeline type
Build -> Push -> Deploy Cloud Run (staging)
- définir env vars / secrets
- définir concurrency / max instances
- smoke test
Promotion prod:
- traffic split 5% -> 25% -> 100%
- rollback: repointer trafic vers révision précédenteBest practices Cloud Run en CI
- Déployer par digest (pas latest).
- Configurer max instances (anti-flood / anti-facture).
- Utiliser Secret Manager + runtime SA (pas de secrets dans l’image).
Déploiement vers GKE : contrôlé, versionné, “prod-grade”
Deux approches
| Approche | Comment | Avantage | Attention |
|---|---|---|---|
| Kubectl apply | Manifests YAML versionnés | Simple, explicite | Garder conventions (labels, probes) |
| Helm | Charts + values par env | Paramétrage env facile | Complexité Helm (à maîtriser) |
Rollouts “safe”
GKE prod:
- readiness/liveness probes obligatoires
- rolling update (maxUnavailable contrôlé)
- HPA + requests/limits
- rollback prêt (deployment rollback ou digest précédent)Sur GKE, le socle “probes + requests/limits + rollback” fait 80% de la stabilité.
Promotion staging → prod : éviter “ça marche chez moi”
Pattern recommandé : promouvoir le même digest
Staging:
- build image -> push -> deploy staging
- tests OK
Prod:
- promouvoir le même digest (pas rebuild différent)
- canary + monitoring
- rollback si anomaliesStratégies de release
- Tag rel-* : déclenche promotion prod (simple).
- Manual approval : étape de validation avant prod (équipes + compliance).
- Canary : 5% trafic puis montée progressive.
Anti-pattern : rebuild en prod avec “mêmes sources” mais dépendances différentes → bugs non reproductibles.
Sécurité supply chain : scan, signatures, politique CI-only
Garde-fous utiles
- Scanner vulnérabilités (au moins visibilité).
- Bloquer (option) sur sévérité CRITICAL.
- Éviter secrets dans images (Secret Manager + runtime SA).
- Enforcer “CI-only push” sur Artifact Registry.
- Si exigences élevées : signatures/attestations (provenance) + admission control côté cluster.
Principe clé
Seule la CI produit les images “autorisées”.
Tout le reste = interdit (ou inutile).Observabilité & runbook : CI/CD opérable
Logs & métriques pipeline
- Durée build, taux d’échec, étapes les plus lentes.
- Historique : commit → build → image digest → deploy.
- Alertes si échecs répétitifs (ex: tests cassés, quota).
Runbook “release safe” (ultra simple)
- Déployer staging automatiquement.
- Smoke tests OK.
- Déployer prod en canary (ou 100% si service interne).
- Monitor 10–15 min (5xx/latence/DB).
- Si KO : rollback immédiat (Run revisions / GKE rollback).
Le runbook doit être exécutable en 2 minutes, pas un roman.
Pièges & anti-patterns (Cloud Build)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Déployer sans tests | Incidents fréquents | Prod instable | Unit + smoke tests minimum |
| Déployer latest | Non reproductible | Rollback impossible | Tags immuables + digest |
| Push manuel en prod | Images “mystère” | Supply chain compromise | CI-only push + IAM strict |
| Rebuild différent prod | Staging OK / prod KO | Incohérence | Promouvoir le même digest |
| Secrets dans l’image | key.json / .env embarqué | Fuite | Secret Manager + runtime SA |
| Trigger mal scindés | Prod déployée “par erreur” | Incident | Trigger prod sur tag rel-* uniquement |
Checklist “prod ready”
- Triggers : PR (tests), main (staging), tag rel-* (prod).
- Build reproductible + tags immuables + déploiement par digest.
- Tests (unit) + smoke tests après deploy.
- Artifact Registry : CI push, runtime pull-only, humains via groupes.
- Promotion staging → prod = même digest (pas rebuild).
- Rollback documenté (Run revisions / GKE rollback).
Objectif : rendre ton système opérable : détecter une panne vite, comprendre la cause, mesurer l’impact (SLO), et agir (runbook). Sur GCP, le trio Monitoring + Logging + APM te donne les “signaux vitaux” : latence, trafic, erreurs, saturation (Golden Signals).
Monitoring : métriques + dashboards (la base)
| Cible | Métriques clés | Pourquoi | Alertes typiques |
|---|---|---|---|
| Compute Engine / MIG | CPU, RAM, disk latency, network, restarts | Voir saturation et IO (souvent le vrai goulot) | CPU > 85%, disk latency élevée, erreurs app |
| GKE | Pods restarts, Pending pods, node saturation, HPA events | Détecter “capacity issues” et crash loops | Pods Pending, restarts > seuil, HPA au max |
| Cloud Run | RPS, latence p95/p99, 4xx/5xx, instances, throttling | Voir scaling + qualité de service | 5xx, latence p95, instances proche max |
| Cloud SQL | Connections, CPU, IO, slow queries, replication lag | La DB est souvent le point de rupture | Too many connections, IO saturée, lag |
| Load Balancer | RPS, latence, codes HTTP, health checks | Vision front-door (global) | Backends unhealthy, 5xx |
Règle d’or
Monitoring = signaux vitaux (Golden Signals)
- Latence
- Trafic
- Erreurs
- Saturation
=> si tu as ces 4 là, tu vois 80% des problèmesLogging : centraliser, filtrer, requêter
Ce que tu veux obtenir
- Un endroit unique pour lire les logs (infra + app + LB).
- Des logs structurés (idéalement JSON) pour filtrer vite.
- Une séparation “humains vs bots” / “normal vs erreurs” (hyper utile en prod).
Log structure conseillé (API/web)
Fields utiles:
- severity (INFO/WARN/ERROR)
- service (api/worker)
- env (dev/stage/prod)
- request_id / trace_id
- http: method, path, status, latency_ms, user_agent, ip
- user_id (si applicable)
- msg + exception stack (si erreur)Exports (option très puissant)
- Export vers BigQuery : analytics logs (ranges IP, endpoints, latence).
- Export vers GCS : archive/long terme.
- Attention : exporter “tout” sans filtrage = coûts + bruit.
Une observabilité “pro” = logs utiles, pas des gigas de bruit.
Alerting & SLO : alerter “utile”, pas “bruyant”
Deux types d’alertes
| Type | Exemples | Quand | But |
|---|---|---|---|
| Symptom-based | 5xx, latence p95, uptime | Impact utilisateur | Réagir vite |
| Cause-based | CPU, mémoire, disque, connexions DB | Avant la panne | Prévenir |
SLO (simple) : ce que tu mesures
SLO typiques (API):
- Disponibilité : % requêtes 2xx/3xx (ou inverse de 5xx)
- Latence : p95 < X ms
- Erreurs : 5xx < Y% sur 5 minNotifications
- Email + webhook (Slack/Discord) + éventuellement SMS (incidents critiques).
- Routage : alertes “page” (nuit) vs alertes “ticket” (journée).
Anti-pattern : 50 alertes CPU → tu ignores tout. Toujours privilégier les alertes “symptôme”.
Error Reporting : le “signal prod” des exceptions
Error Reporting regroupe les exceptions identiques, te donne la fréquence, la régression (nouvelle version), et facilite la priorisation.
Bon usage
- Tagger par service/version (ex: api, rel-2026.02.01-1).
- Corréler avec un request_id / trace_id pour remonter au contexte.
- Créer une alerte si une erreur “nouvelle” apparaît en release.
Pattern “release gate”
Déploiement (canary 5%)
- si Error Reporting détecte nouvelles erreurs -> rollback automatique / manuel
=> évite de pousser un bug à 100%Trace : latence bout-en-bout (où ça bloque ?)
Ce que la trace te montre
- Temps total requête (edge → app → DB → services).
- Segments lents : DB query, appel externe, rendu, etc.
- Corrélation : latence p95 ↑ → quelle dépendance est responsable ?
Conseils APM (pragmatiques)
- Instrumenter d’abord les endpoints critiques (login, search, admin, API core).
- Ajouter des “spans” sur : DB, appels externes, tâches async.
- Conserver un trace_id dans les logs (corrélation immédiate).
Quand la latence explose, Trace t’empêche de “deviner”. Tu vois le goulot.
Profiler : hotspots CPU/mémoire sans tout casser
Le Profiler aide à trouver où le CPU est consommé (fonctions, libs, endpoints), et où la mémoire grimpe, avec un impact réduit (selon configuration).
Quand l’activer
- CPU trop élevé sans explication.
- Latence forte alors que la DB va bien (suspect code app).
- Fuites mémoire / usage mémoire qui monte avec le trafic.
Méthode (simple)
1) Activer sur staging (puis prod si OK)
2) Identifier 1-2 hotspots (top functions)
3) Corriger (cache, index, algo)
4) Mesurer avant/après (latence + CPU)
=> itération courteDashboards “golden” : 1 écran pour piloter
Dashboard API (minimum)
API Dashboard
- RPS (global + top endpoints)
- Latence p50/p95/p99
- HTTP codes (2xx/4xx/5xx)
- Saturation (CPU/mem) + instances/pods
- DB connections + DB latency
- Top errors (Error Reporting)
- Top slow traces (Trace)Dashboard “infra”
Infra Dashboard
- LB health checks (backends healthy/unhealthy)
- VMs/nodes: CPU/mem/disk latency
- Réseau: egress, spikes
- Incidents: alert historyTon objectif : en 60 secondes, savoir si c’est “traffic”, “code”, “DB” ou “infra”.
Coûts & rétention : logs volumineux = facture
Principes anti-coût
- Filtrer les logs inutiles (health checks, bruit bots) ou les réduire.
- Échantillonnage (sampling) sur endpoints très “chatty”.
- Rétention : garder longtemps l’utile (erreurs), moins longtemps le bruit (debug).
- Exporter vers BigQuery seulement ce qui est exploitable (curated logs).
Politique type (exemple)
Rétention logs (idée):
- ERROR : 30-90 jours
- INFO : 7-14 jours (selon volume)
- DEBUG : 1-3 jours (staging uniquement)
Exports:
- vers BigQuery : uniquement logs "requests" + "security events"Anti-pattern : tout en DEBUG en prod + export BigQuery = explosion volume + coût + bruit.
Patterns IDEO-Lab (super adaptés à ton contexte)
1) Anti-flood / bots : “humains vs bots”
Logging:
- tagger user_agent + ip + path
- séparer logs "human" vs "bot"
Monitoring:
- alert si RPS bot > seuil
- latence p95 qui grimpe + 4xx/5xx
Export:
- logs security -> BigQuery (group by IP range/ASN/pays)2) Django : health endpoints + release version
Endpoints:
- /healthz : 200 si app OK (option: DB check light)
- /version : git sha / release tag
=> corrélation immédiate "incident <-> release"3) Traduction engine (workers)
Métriques:
- queue depth / backlog
- throughput (items/min)
- erreurs par langue
Alertes:
- backlog > seuil (risque latence)
- erreurs GCP Translate / quotasPièges & anti-patterns (Observabilité)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Alertes uniquement sur CPU | Faux positifs | Alert fatigue | Alertes symptôme (5xx/latence) + causes |
| Logs non structurés | Impossible de filtrer | Temps perdu | JSON + champs (ip, path, status, latency) |
| Pas de corrélation trace/log | Debug “aveugle” | MTTR élevé | request_id/trace_id partout |
| Tout logger, tout exporter | Volume énorme | Coût + bruit | Filtrer, rétention, curated exports |
| Aucun runbook | Panique en incident | MTTR élevé | Runbook 10 lignes (actions) |
| Dashboards “jolis” mais inutiles | Pas de diagnostic | Temps perdu | Golden signals + DB + LB + errors |
Checklist “SRE-ready”
- Dashboards golden signals (latence, trafic, erreurs, saturation).
- Alertes symptôme + causes (DB connections/IO, pods pending, etc.).
- Logs structurés + request_id/trace_id.
- Error Reporting + Trace activés sur endpoints critiques.
- Politique rétention/sampling pour maîtriser les coûts.
- Runbook incident (quoi regarder, quoi faire, rollback).
Objectif : assembler une sécurité “enterprise-grade” sur GCP : front-door protection (WAF/rate-limit), accès interne (IAP), chiffrement & clés (KMS), périmètre anti-exfiltration (VPC Service Controls), et posture + détection (SCC). Le but n’est pas d’activer “tout”, mais de construire un ensemble cohérent qui réduit réellement le risque (bots, creds leak, data exfiltration, misconfig).
Approche (pragmatique) : 5 couches qui se complètent
| Couche | But | Services | Ce que ça bloque |
|---|---|---|---|
| Front-door | Filtrer avant l’app | LB + Cloud Armor | Bots, scans, DDoS L7, brute-force, abus API |
| Identity | Accès basé identité | IAP + IAM | Accès admin/ops exposé, “VPN bricolé” |
| Secrets & clés | Chiffrement & contrôle | KMS (+ Secret Manager) | Fuite de secrets, manque d’audit/rotation |
| Data perimeter | Anti-exfiltration | VPC Service Controls | Exfiltration vers Internet / projets non autorisés |
| Posture | Voir & corriger | SCC | Misconfig, vulnérabilités, findings de sécurité |
Principe directeur
1) Stopper le bruit (Armor) AVANT l'app
2) Accès interne = identité (IAP), pas IP “au petit bonheur”
3) Secrets/keys = centralisés, audités (KMS/Secret Manager)
4) Données sensibles = périmètre (VPC-SC)
5) Corriger les trous = SCC + alerting + runbooksSi tu fais bien les couches 1 + 2 + 3, tu couvres déjà la majorité des incidents “réels” (bots, accès admin, fuites).
Cloud Armor : WAF + rate limiting (la protection “front-door”)
Ce que tu obtiens
- WAF : règles managées + règles custom (patterns, paths, headers, IPs, geo, etc.).
- Rate limiting : limiter les abus sur endpoints sensibles (login, api, search, admin).
- Blocklists : IPs / ranges / ASN (selon ta stratégie) + géoblocage (si pertinent).
- Logs : visibilité (et export BigQuery si tu veux analyser à grande échelle).
Ruleset “starter” (très efficace)
Armor policies (idée)
1) Block obvious bad actors:
- IP/ranges connus
- paths de scan (/wp-admin, /phpmyadmin, etc.)
2) Rate-limit endpoints:
- /login, /admin, /api/*
3) Allowlist (si service interne):
- seulement corporate IP / IAP / SA caller
4) Default allow + monitoringRate limit : bonnes pratiques
- Limiter sur IP + éventuellement “key” applicative (token/user) si tu as.
- Ne pas casser /static (sinon tu te tires une balle dans le pied).
- Faire 2 niveaux : soft (challenge/throttle) puis hard (block).
Le meilleur ROI sécurité sur un service public, c’est Armor + règles simples.
IAP (Identity-Aware Proxy) : exposer une app interne sans VPN classique
IAP protège une application derrière une identité (Google Identity / SSO) : tu autorises des groupes (ops, dev, admin) et tu obtiens un accès sécurisé, MFA/SSO, audit, sans exposer l’app au public.
Use cases parfaits
- Backoffice admin / consoles internes.
- Outils ops (dashboards, endpoints maintenance).
- Accès temporaire pour support (audit + révocation facile).
Pattern “admin safe” (recommandé)
Internet -> LB HTTPS -> IAP -> service (Run / GKE / VM)
- seuls groupes autorisés passent
- MFA/SSO + audit
- pas d'admin exposé publiquementRègles d’or IAP
- Autoriser par groupes, pas par utilisateurs “à la main”.
- Segmenter : admin ≠ dev ≠ read-only.
- Conserver un “break-glass” (procédure) mais ultra contrôlé.
KMS : clés, chiffrement, rotation, audit
Cloud KMS te permet de gérer les clés : création, rotation, contrôle d’accès fin, audit. En pratique : chiffrement de données sensibles, enveloppe de chiffrement, clés client-managed (selon besoin).
À quoi ça sert (concret)
- Chiffrer des données applicatives sensibles (tokens, secrets, payloads).
- Contrôler qui peut “decrypt” (ex: uniquement worker, pas l’API).
- Tracer l’usage des clés (audit).
Pattern “envelope encryption” (simple)
1) Générer une DEK (data key) pour chiffrer la donnée
2) Chiffrer la DEK avec KMS (KEK)
3) Stocker : data_encrypted + dek_encrypted
=> rotation KEK possible, audit, contrôle decryptRotation : stratégie
- Rotation régulière (selon exigences).
- Limiter l’accès au droit “decrypt” (c’est le plus sensible).
- Séparer clés par domaine : prod ≠ staging ≠ dev.
“KMS partout” n’est pas obligatoire, mais pour secrets applicatifs + données sensibles, c’est une base très solide.
VPC Service Controls : périmètre anti-exfiltration (data perimeter)
VPC-SC sert à réduire les risques d’exfiltration sur des services data (ex: Storage, BigQuery, etc.) : tu définis un périmètre et tu bloques certains accès “hors périmètre” même si une clé/identité est compromise.
Quand c’est pertinent
- Données sensibles / compliance.
- Grand projet multi-services : risque de misconfig IAM.
- Tu veux éviter “un token volé = exfiltration vers Internet”.
Mental model
Sans VPC-SC:
- si identité compromise -> accès data possible depuis n'importe où
Avec VPC-SC:
- accès data limité au périmètre (réseaux / projets / identités)
- exfiltration rendue beaucoup plus difficileAttention (réalité terrain)
- VPC-SC peut casser des flux légitimes si non planifié (ex: CI, exports, intégrations).
- Ça se déploie en mode “design” : on cartographie les flux, puis on enferme.
Security Command Center (SCC) : posture + findings
SCC centralise la visibilité sécurité : ressources, vulnérabilités, misconfigurations, exposures. L’intérêt : passer d’un mode “on découvre quand ça brûle” à “on corrige en continu”.
Ce que tu veux faire avec SCC
- Avoir une vue centralisée des risques (par projet/env).
- Recevoir des findings actionnables (ex: ressource exposée, clé trop permissive).
- Routage : findings critiques → alert, le reste → backlog/ticket.
Workflow “sain”
SCC finding -> triage (critique / important / info)
- Critique : incident / page + action immédiate
- Important : ticket + correction sous X jours
- Info : backlog + revue mensuelleSans process de triage, SCC devient un “mur de bruit”. Avec un workflow, c’est très puissant.
Identity & IAM (rappel) : la base qui conditionne tout
Règles simples (mais non négociables)
- Least privilege : pas de “Editor” large, surtout en prod.
- Service Accounts dédiés par service (api, worker, ci).
- Humains : accès par groupes (ops/dev/audit), pas en direct.
- Séparer environnements : dev/stage/prod (projets distincts idéalement).
Pattern “identités” (propre)
Service Accounts:
- cloudbuild-sa : push images + deploy (staging/prod selon)
- api-runtime-sa : accès DB/Secrets strict
- worker-runtime-sa : accès queue/translate strict
- auditor-sa : read-only logs/dashboards80% des incidents cloud viennent d’IAM trop large + secrets mal gérés. C’est la fondation.
Sécurité “prod” : checklists rapides
Checklist Front-door (public)
- LB HTTPS + cert managé.
- Cloud Armor : règles managées + rate limit sur endpoints sensibles.
- Logs LB + alerting sur 5xx/latence.
- Max instances (Cloud Run) / HPA limites (GKE) pour garde-fou coût.
Checklist Admin / backoffice
- IAP devant l’admin (idéal).
- Groupes + MFA.
- Audit logs + alert sur tentatives anormales.
- Endpoints admin séparés des endpoints publics.
Checklist Data / secrets
- Secrets dans Secret Manager, jamais dans l’image/repo.
- KMS si données sensibles à chiffrer (domain keys, tokens).
- Backups + restore tests (Cloud SQL, storage).
- VPC-SC si data critique + risque exfiltration.
Pattern : NetGuard / IDEO-Lab (Run + Armor + BigQuery + Monitoring)
Public traffic
-> HTTP(S) Load Balancer (global)
-> Cloud Armor
- WAF rules (scans, injections basiques)
- rate-limit (/api, /login, /admin)
- blocklists (IP/ranges)
-> Cloud Run (NetGuard API / services)
- IAM strict (runtime SA)
- max instances (garde-fou)
-> Logging -> export BigQuery (security analytics)
-> Monitoring -> alerting (RPS bot, 4xx/5xx, latence)
-> (option) IAP pour consoles/adminPourquoi ce pattern est redoutable
- Tu bloques tôt (Armor) → CPU/app protégées.
- Tu scales (Run) mais avec garde-fous.
- Tu analyses (BigQuery) → rules plus intelligentes (ranges/ASN).
- Tu alertes (Monitoring) → réaction rapide.
Pièges & anti-patterns (sécurité GCP)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Admin public sans IAP | Scans/brute-force | Compromission | IAP + MFA + Armor |
| IAM trop large (Editor partout) | Tout le monde peut tout casser | Erreur humaine / exfiltration | Least privilege + groupes + séparation env |
| Pas de WAF/rate-limit | Flood/abuse | Coût + instabilité | Armor + policies + garde-fous scaling |
| Secrets dans repo/image | key.json / .env embarqué | Fuite | Secret Manager + runtime SA |
| VPC-SC sans design | Flux cassés | Ops infernale | Cartographier flux, déployer progressivement |
| SCC ignoré | Findings s’accumulent | Risque latent | Triage + workflow (critique vs ticket) |
Checklist “enterprise-ready”
- Armor en front-door (WAF + rate-limit) + logs.
- IAP pour apps internes/backoffice + MFA.
- Secret Manager + KMS (si données sensibles) + audit + rotation.
- VPC-SC pour data critique (anti-exfiltration) après design.
- SCC avec triage + alerting + backlog.
Objectif : éviter la facture “surprise” et construire un cadre FinOps simple : comprendre où GCP facture (compute, storage, queries, egress), activer budgets + alertes dès J1, choisir SUD/CUD intelligemment, et optimiser les gros postes : GKE, Cloud Run, BigQuery, Cloud Storage + réseau.
Comprendre “où ça facture” (les gros postes)
| Domaine | Ce qui coûte | Levier #1 | Indicateur à suivre |
|---|---|---|---|
| Compute | CPU/RAM/temps d’exécution | Right-sizing + autoscaling | CPU/RAM vs charge réelle |
| Serverless | Requests, temps, instances (selon conf) | Concurrency + max instances + min instances | p95 + instances + erreurs |
| Data/BigQuery | Bytes scanned + stockage | Partition + clustering + discipline SQL | Bytes scanned / query |
| Storage | Stockage + opérations + egress | Lifecycle + classes froides | Top buckets + egress |
| Network | Egress Internet / inter-région | Co-localiser workloads + CDN | Egress / jour |
| Logs | Ingestion + rétention + exports | Filtrer/sampler + rétention | Volume logs / service |
Règle d’or
Les 3 sources #1 de surprises :
1) Egress réseau
2) Logs trop volumineux / exports
3) BigQuery : full scans (SELECT * sans partition)
=> mettre garde-fous + dashboards dès le débutAlways Free : utile… mais à cadrer
Bon usage
- Idéal pour dev/POC et tests d’intégration (sans charge).
- Le free tier n’est pas une stratégie prod : tu veux surtout des garde-fous (budgets/alertes).
- Ne pas confondre “gratuit” et “sans risque” : egress + logs + queries peuvent coûter vite.
Réflexes
- Créer un project dev séparé (billing isolé).
- Mettre un budget très bas + alerte agressive.
- Déployer des quotas/limites (max instances, etc.).
SUD vs CUD : choisir intelligemment
| Levier | Principe | Quand | Risque |
|---|---|---|---|
| SUD (Sustained Use) | Réduction “automatique” sur usage stable | Workloads qui tournent souvent | Moins contrôlable, dépend usage |
| CUD (Committed Use) | Engagement 1 ou 3 ans → réduction forte | Base de charge prévisible (prod stable) | Sur-commit si usage baisse |
Stratégie simple (FinOps)
1) Démarrer sans engagement : mesurer 2-4 semaines
2) Identifier la “base stable” (charge minimale)
3) CUD sur la base stable uniquement
4) Le reste en on-demand (autoscaling)
=> tu évites de surpayer si trafic varieCUD = excellent, mais uniquement si tu connais ton “socle” de consommation.
Budgets & alertes : anti-surprise (Jour 1 obligatoire)
Bon pattern
Budgets:
- dev : petit budget (alerte tôt)
- stage: budget moyen
- prod : budget réaliste + alertes multi-seuils
Alertes:
- 50% / 80% / 95% (email + webhook si possible)
- alerte “spike” : hausse anormale jour/heure (si dispo via monitoring)Garde-fous “tech” (complément budgets)
- Cloud Run : max instances + concurrency.
- GKE : HPA max + node autoscaling max (Standard).
- BigQuery : éviter full scans (discipline SQL + tables partitionnées).
- Logs : exclusions/filtrage + rétention courte pour INFO.
Un budget sans garde-fou technique = tu découvres l’incident après la dépense.
Labels & chargeback : savoir “qui coûte quoi”
Convention minimale (recommandée)
Labels (standard)
- env : dev | stage | prod
- app : ideolab | netguard | translate | unminify | ...
- owner : guillaume | ops | team-x
- cost_center : core | tools | data | securityPourquoi c’est crucial
- Tu peux trier les coûts par app/service.
- Tu détectes vite “ce service a explosé”.
- Tu peux imposer des limites et optimiser la bonne zone.
Sans labels, l’optimisation devient une chasse au trésor.
Réseau & egress : la source #1 de surprises
Ce qui coûte typiquement
- Egress vers Internet (downloads, assets, API publiques volumineuses).
- Trafic inter-région (workloads non co-localisés).
- Exports data (BigQuery/GCS) vers des consommateurs externes.
Leviers
- Co-localiser : app + DB + storage dans la même région si possible.
- CDN : servir le statique via cache (réduit egress “chaud”).
- Limiter exports massifs (curated, pas brut).
- Surveiller le top talkers (services qui sortent beaucoup).
Si tu héberges beaucoup de statique, le CDN est souvent un ROI immédiat.
Optimiser Cloud Run : le trio gagnant
Les 3 réglages qui pilotent la facture
| Réglage | Effet | But | Piège |
|---|---|---|---|
| Concurrency | Reqs par instance | Moins d’instances = moins cher | Trop haut → latence/DB saturée |
| Max instances | Cap du scaling | Garde-fou anti-flood/anti-facture | Trop bas → throttling |
| Min instances | Empêche scale-to-zero | Latence stable | Coût “idle” permanent |
Pattern recommandé (API publique)
- concurrency : modérée (ex: 20..80)
- max instances : limiter (ex: 20..100) selon ton budget
- min instances : 0 (par défaut), ou 1 si besoin perf constante
+ WAF/rate-limit devant (Armor via LB) si exposition InternetAnti-pattern : pas de max instances + API floodable → tu scales pour payer.
Optimiser GKE : right-sizing + autoscaling + hygiène
Leviers principaux
- Requests/Limits : base du scheduling + HPA cohérent.
- HPA : scale pods selon CPU/métriques.
- Node autoscaling (Standard) : scale nodes selon pods Pending.
- Node pools : séparer web / workers / batch pour optimiser.
- Réduire le bruit logs (sinon coût ingestion + stockage).
Autopilot vs Standard (coût)
| Mode | Coût perçu | Avantage | Quand |
|---|---|---|---|
| Autopilot | “simple à lire” (pod resources) | Moins d’ops + moins de gaspillage | Apps web/API classiques |
| Standard | Optimisable (pools, spot…) | Contrôle total | Workloads spéciaux / optimisation avancée |
Si ton objectif est “ops minimal + coût maîtrisé”, Autopilot est souvent un excellent point de départ.
Optimiser BigQuery : coût = bytes scanned
Règles d’or
- Tables “events/logs” partitionnées (DATE) + clustering (2-4 colonnes utiles).
- Jamais
SELECT *sur tables larges. - Filtrer toujours sur la partition (
WHERE event_date …). - Créer des tables “marts” petites pour BI (éviter raw direct).
Pattern “curated” (anti-facture)
raw (partitionnée) -> curated (partition+cluster) -> marts (petites tables KPI)
BI/dashboard -> marts
Exploration -> curated (avec garde-fous IAM)Anti-pattern : analystes sur raw + requêtes exploratoires = full scans = facture.
Optimiser Cloud Storage (GCS) : lifecycle & classes
Leviers
- Lifecycle rules : déplacer vers classes froides après X jours.
- Versioning : utile, mais à maîtriser (sinon stockage explose).
- Nettoyer les objets temporaires (exports, builds).
- Limiter egress : co-localiser + CDN si besoin.
Exemple de policy (simple)
- logs bruts : garder 14 jours en classe standard
- puis basculer en classe froide
- supprimer après 90 jours (ou archiver long-terme selon compliance)En général, “lifecycle + purge” donne un ROI immédiat sur les buckets qui grossissent.
Check-list “Jour 1” (anti-surprise)
- Créer 3 projets : dev / stage / prod (billing isolé).
- Activer Budgets + alertes (50/80/95%) sur chaque projet.
- Définir une convention labels (env/app/owner/cost_center) et l’appliquer partout.
- Cloud Run : config max instances + concurrency par défaut.
- GKE : requests/limits + HPA (et node autoscaling si Standard).
- BigQuery : tables partitionnées + discipline SQL (pas de SELECT *).
- Logs : rétention courte INFO + filtrage du bruit + pas de DEBUG en prod.
- Dashboard “coûts” : top services + top egress + top logs + top BQ scanned.
Patterns IDEO-Lab : réduire coût sans perdre la perf
1) API publique (anti-flood) : coût maîtrisé
LB + Armor (rate-limit) -> Cloud Run (max instances)
- tu bloques tôt (évite scaling)
- tu plafonnes le scaling (anti-facture)
- tu observes (monitoring + alerting)2) Traduction engine : coûts “contrôlés”
- Workers séparés (scale selon backlog)
- Budgets + alertes quota/API (GCP Translate)
- Logs: seulement erreurs + métriques (pas spam)
=> throughput OK, coût prévisible3) Logs de sécurité : exporter “curated” vers BigQuery
Logging -> filtre (security events) -> BigQuery (partition+cluster)
- analytics sur IP ranges / ASN / pays
- tables petites “marts” pour dashboards
=> utile, pas ruineuxPièges & anti-patterns (coûts GCP)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Pas de budgets | Découverte trop tard | Facture surprise | Budgets + alertes J1 |
| Cloud Run sans max instances | Scaling infini en flood | Coût + instabilité | Max instances + WAF/rate-limit |
| BigQuery full scans | Bytes scanned énormes | Facture data | Partition + WHERE + pas SELECT * |
| Logs trop verbeux | Volume ingestion | Coût + bruit | Filtrage + sampling + rétention |
| Egress ignoré | Coût réseau grimpe | Surprise | Co-localisation + CDN + contrôle exports |
| Versioning GCS sans purge | Bucket grossit vite | Stockage | Lifecycle + nettoyage |
| CUD trop tôt | Usage baisse | Sur-engagement | Mesurer puis commit sur base stable |
Checklist “FinOps-ready”
- Budgets + alertes + dashboards coûts (top services).
- Labels partout (env/app/owner/cost_center).
- Garde-fous techniques (max instances, HPA max, quotas).
- BigQuery : partition/cluster + guardrails IAM (raw vs marts).
- Logs : filtrage + rétention + exports ciblés.
- CUD uniquement sur la base stable mesurée.
Objectif : migrer vers GCP de façon progressive et réversible, en réduisant le risque : choisir la bonne stratégie (rehost, replatform, refactor), migrer VM et surtout DB proprement (réplication, cutover), sécuriser réseau/IAM, et mettre en place une méthode “prod” (tests, rollback, DR).
Choisir la stratégie : vitesse vs valeur vs risque
| Approche | Idée | Avantages | Limites | Quand l’utiliser |
|---|---|---|---|---|
| Lift & Shift (Rehost) | Déplacer “tel quel” (VMs) | Rapide, peu de changements | Peu d’optimisation coût/ops | Urgence, quick win, sortie DC |
| Replatform | Garder l’app, changer infra (managé) | Gros gain ops (DB, LB, IAM) | Changements modérés | Quand la prod doit devenir stable vite |
| Refactor (Cloud-native) | Repenser pour GKE/Run + services data | Meilleur scale/perf/évolutivité | Temps + risques projet | Quand tu veux un “vrai” produit cloud |
Règle simple (très utile)
Vague 1 : Rehost (vite) -> stabiliser
Vague 2 : Replatform (gains ops)
Vague 3 : Refactor (cloud-native) sur les briques à forte valeurLa meilleure migration n’est pas “pure” : c’est une combinaison en plusieurs vagues.
Pré-requis (fondations) : si tu rates ça, la migration devient un cauchemar
Fondations à poser avant toute VM
- Org / Folders / Projects : séparer dev/stage/prod (idéalement projets distincts).
- Billing : budgets + alertes + labels (env/app/owner/cost_center).
- IAM : groupes, least privilege, service accounts dédiés (CI, runtime, ops).
- Réseau : VPC, subnets, firewall rules, Cloud NAT, stratégie IP.
- Observabilité : Monitoring/Logging activés + dashboards “golden signals”.
Inventaire (à ne pas zapper)
- Applications : dépendances, endpoints, SLA/SLO, pics de charge.
- Data : DBs, volumes, RPO/RTO, contraintes conformité.
- Réseau : flux entrants/sortants, allowlists, IP fixes.
- Sécurité : secrets, clés, comptes techniques.
Anti-pattern : migrer “vite” sans IAM/réseau/budgets → tu paies en incidents + facture.
Migration VM : méthode “safe” (du rehost au replatform)
Trajectoire recommandée
On-prem VM
-> (1) Compute Engine (rehost)
-> (2) Managed services (replatform)
- Cloud SQL, managed LB, Secret Manager, etc.
-> (3) (option) GKE/Run (refactor)Check VM avant move
- OS supporté, espace disque, drivers, dépendances système.
- Services : ports, reverse proxy, systemd, cron jobs.
- State : où sont les fichiers persistants (à externaliser si possible : GCS/DB).
- Observabilité : logs centralisés, healthcheck / endpoint /healthz.
Garde-fou
Objectif rehost = “ça tourne pareil”
Pas “optimiser tout” au premier déplacement.
Optimisation vient en Vague 2 (replatform).DB : le vrai sujet (RPO/RTO, cutover, réplication)
Pour 80% des apps, la DB représente la vraie complexité : latence, cohérence, connexions, sauvegardes, reprise. La stratégie doit être explicite : downtime accepté ? sinon il faut une approche “sync / replicate / cutover”.
3 approches DB (du plus simple au plus robuste)
| Approche | Principe | Downtime | Quand |
|---|---|---|---|
| Dump/restore | Export on-prem → import Cloud SQL | Oui | Petites DB, maintenance window ok |
| Réplication / CDC | Sync en continu puis bascule | Très faible | Prod critique, downtime minimal |
| Dual-write (rare) | Écrire sur 2 systèmes un temps | Quasi nul | Cas complexes, refactor important |
Cutover (pattern “propre”)
1) Préparer Cloud SQL + users + réseau privé
2) Synchroniser (replication / CDC si possible)
3) Freeze writes (courte fenêtre)
4) Final sync + switch DNS/app config
5) Smoke tests prod
6) Unfreeze + monitor
7) Garder rollback plan (retour DB source) pendant X heuresAnti-pattern : “on bascule la DB sans plan rollback” → tu perds ta marge de manœuvre.
Réseau hybride : VPN/Interconnect + “design des flux”
Pourquoi c’est crucial
- Pendant la migration, tu as souvent une phase hybride (app sur GCP, DB on-prem, ou inverse).
- La latence réseau devient un facteur majeur (DB queries + API calls).
Pattern hybride “sain”
On-prem <-> (VPN ou Interconnect) <-> VPC GCP
- routes claires
- firewall rules strictes
- NAT contrôlé (egress)
- monitoring de latence/packet lossConseils pragmatiques
- Co-localiser app + DB au plus vite (réduit latence + coûts réseau).
- Isoler “migration traffic” (réplication) et surveiller débit.
- Documenter les flux (ports, CIDR) → évite les ouvertures “trop larges”.
Plan par vagues : le meilleur compromis risque/valeur
Vague 0 — Préparer
- Fondations : org/projects, IAM, VPC, budgets, observabilité.
- Inventaire + classification : critique vs non-critique.
- Runbooks + rollback “papier” (avant le move).
Vague 1 — Quick wins (non critique)
- Un service stateless (API simple) vers Cloud Run.
- Une VM secondaire vers Compute Engine.
- Value rapide : logs export vers BigQuery (analytics sécurité/trafic).
Vague 2 — Cœur applicatif
- Replatform DB vers Cloud SQL (avec plan cutover).
- Déploiement stable (GKE Autopilot ou Run selon besoin).
- DRP de base (backups + restore tests).
Vague 3 — Optimisation & cloud-native
- Découper en services, jobs async (Pub/Sub), caching, etc.
- Cost optimization : SUD/CUD, lifecycle storage, BQ partitions.
Tests, canary, rollback : migration “sans panique”
Tests incontournables
- Smoke tests : /healthz, login, endpoint clé, DB read.
- Perf baseline : latence p95, throughput, CPU/IO (avant/après).
- Data checks : comptages, checksums (si possible), échantillons métier.
Canary (pattern)
1) Déployer nouvelle infra en parallèle
2) Router 1-5% du trafic vers GCP
3) Observer (5xx, latence, DB, logs)
4) Monter 25% -> 50% -> 100%
5) Conserver rollback facile (DNS/traffic/revision)Rollback : ce que tu dois décider AVANT
- Rollback appli : repointer trafic vers ancienne infra.
- Rollback DB : possible uniquement si tu n’as pas “divergé” (d’où le freeze writes court).
- Durée de coexistence : X heures/jours selon criticité.
Sécurité & conformité pendant la migration
Règles simples
- Secrets : Secret Manager, jamais dans images/repos.
- IAM : service accounts dédiés, least privilege, groupes pour humains.
- Front-door : WAF/rate-limit (Cloud Armor) si exposition Internet.
- Logs/audit : activer et conserver assez longtemps pour investigations.
- Accès admin : privilégier IAP ou accès privé, pas “ouverture large”.
La migration est une période où on ouvre “temporairement” trop de choses : documenter + refermer.
DR / Haute disponibilité : définir RPO/RTO (même simple)
Définitions (très concrètes)
- RPO : perte de données acceptable (ex: 5 min, 1h, 24h).
- RTO : temps de reprise acceptable (ex: 15 min, 1h).
Pattern minimal “DRP”
- Backups automatiques (DB + storage)
- Restore test mensuel (sinon backup = illusion)
- Multi-zone (au moins) pour workloads critiques
- Runbooks de reprise (qui fait quoi)Si tu ne testes jamais un restore, tu ne sais pas si tu as une sauvegarde.
Patterns IDEO-Lab (concrets, ROI rapide)
1) Migration progressive du site (sans tout casser)
Vague 1:
- services “tools” stateless -> Cloud Run
- statique -> GCS + CDN
- logs -> BigQuery (analytics trafic/bots)
Vague 2:
- app principale (Django) -> GKE Autopilot ou Run
- DB -> Cloud SQL (cutover plan)
Vague 3:
- workers (traduction / cron) -> GKE/Run jobs + scaling
- Armor/IAP sur admin & endpoints sensibles2) NetGuard : migration “secure by design”
LB + Armor -> Cloud Run API
- max instances (anti-facture)
- export logs sécurité -> BigQuery
- dashboard bots/ranges IP + alerting3) Traduction engine : isoler compute & coûts
- API stable (Run/GKE)
- workers séparés (scale selon backlog)
- quotas/alertes (budgets) + logs “curated”
=> performance + coût prévisibleChecklist Go/No-Go (avant cutover)
- Budgets + alertes en place (dev/stage/prod).
- IAM validé : SAs runtime, CI, ops (least privilege).
- Réseau OK : firewall rules, NAT, DNS, monitoring latence.
- Observabilité : dashboards + alertes (5xx/latence/DB connections).
- Plan cutover écrit + fenêtre + responsables + rollback.
- Smoke tests automatisés (au moins 5 endpoints clés).
- Backups + restore test récent (DB).
- Canary/traffic split prêt (si applicable).
Pièges & anti-patterns (migration)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| “Big bang” migration | Tout change en même temps | Incident majeur | Vagues + canary + rollback |
| DB en dernier sans plan | Cutover improvisé | Perte/indispo | Réplication/CDC + freeze writes + tests |
| Pas d’observabilité | Debug “aveugle” | MTTR élevé | Monitoring/logging/alerting J1 |
| IAM trop large | “Editor” partout | Risque sécurité | Least privilege + groupes |
| Hybride trop long | Latence, coût réseau | Perf dégradée | Co-localiser app+DB dès que possible |
| Backups non testés | Restore impossible | Catastrophe | Restore tests réguliers |
Résumé “migration propre”
1) Fondations (IAM/VPC/Budgets/Observability)
2) Vagues progressives (non critique -> critique)
3) DB = plan cutover + rollback
4) Canary + smoke tests + monitoring
5) Refermer les ouvertures temporairesObjectif : transformer “IDEO-Lab sur GCP” en architecture réaliste et opérable : choix Cloud Run vs GKE, front-door LB + Cloud Armor, data Cloud SQL + GCS, analytics (logs → BigQuery), et DR multi-région (RPO/RTO, runbooks, tests). Cette section te donne des patterns concrets que tu peux décliner sur tes apps (unminify, NetGuard, i18n, toolbox…).
Héberger Ideo-Lab : 2 options (Run vs GKE) + une option “hybride”
| Option | Architecture | Avantages | Quand |
|---|---|---|---|
| A) Cloud Run (simple) | Django/API sur Run + Cloud SQL + GCS (static/media) | Très peu d’ops, rollback via revisions | Début/POC, trafic variable, équipe small |
| B) GKE (scalable) | GKE (Autopilot ou Standard) + Ingress/LB + Cloud SQL private + GCS | Contrôle, multi-services, workloads complexes | Plateforme multi-apps, besoins K8s |
| C) Hybride (pragmatique) | Web principal sur Run, workers sur GKE (ou inverse) | Optimise coûts/ops selon composants | Quand certains jobs nécessitent K8s |
Blueprint (lisible)
Internet
-> HTTP(S) Load Balancer (global)
-> Cloud Armor (WAF + rate limit)
-> (A) Cloud Run service (Django web/API) OR (B) GKE Ingress -> service
Data
-> Cloud SQL (PostgreSQL, private IP) + backups
Storage
-> GCS (static/media) + CDN
Ops
-> Monitoring/Logging + Error Reporting + TraceLe choix A vs B dépend surtout du besoin “Kubernetes” (multi-services, jobs, contrôle réseau) vs “ops minimal”.
Front-door & sécurité : LB + Armor + (option) IAP
Public : protéger contre bots/flood
- Cloud Armor en amont : règles managées + règles custom.
- Rate limit sur endpoints sensibles :
/login,/admin,/api/*,/tools/*. - Blocklists : IP/ranges agressifs (tu sais déjà que ça arrive chez toi).
- Garde-fous : Cloud Run max instances / GKE HPA max (anti-facture).
Interne : admin/ops “zéro exposition”
Option recommandée:
- /admin, /ops, endpoints sensibles -> derrière IAP
=> accès par identité (groupes) + audit + MFARègles d’or
- Ne jamais “protéger” le statique comme l’app : /static doit rester performant.
- Armor d’abord, app ensuite : tu bloques tôt → CPU/DB protégées.
- Si public : prévoir un plan anti-scraping (rate-limit + tokens + analytics).
Data layer : Cloud SQL (PostgreSQL) + GCS (static/media)
Cloud SQL (PostgreSQL) : “prod basics”
- Mode HA + backups automatiques + tests de restore.
- Private IP (recommandé) + règles d’accès strictes.
- Monitoring : connections, IO latency, slow queries, replication lag.
- Users séparés : app runtime vs migrations vs read-only analytics.
GCS : static/media + lifecycle
Buckets:
- ideolab-static (builds statiques, immutable)
- ideolab-media (uploads, versioning si besoin)
Lifecycle:
- purge temp exports/build artifacts
- classes froides pour archivesLe duo Cloud SQL + GCS couvre 90% des besoins web. Le reste (cache, queue) se rajoute au fur et à mesure.
Moteur i18n / Weglot-like : jobs, dedup, quotas, perf
Composants typiques
| Brique | Rôle | Sur GCP | Point critique |
|---|---|---|---|
| API i18n | Découvre/sert traductions | Cloud Run ou GKE | Latence + cache |
| Workers | Batch traduction / traitement | Cloud Run Jobs (batch) ou GKE | Throughput + quotas |
| Dedup/cache | Éviter appels inutiles | DB + cache managé (selon design) | Chemin critique minimal |
| Observabilité | Coûts & erreurs | Monitoring + BigQuery | Budget tokens/calls |
Pattern “batch propre” (anti-latence / anti-coût)
Frontend -> enqueue (requests)
Workers -> batch translate (maxBatch) + dedup
DB -> store results
Dashboards -> throughput + errors + costs
=> pas de traduction “bloquante” côté UXTu as déjà la mentalité “dedup hors chemin critique” : sur GCP, ça devient encore plus rentable (coût API).
NetGuard sur GCP : API, WAF, analytics sécurité (très puissant)
Architecture recommandée
Internet
-> Load Balancer
-> Cloud Armor (WAF + rate-limit + blocklists)
-> Cloud Run (NetGuard API)
Data/Analytics
-> Logging (security events) -> BigQuery
Ops
-> Dashboards + alerting (spikes, top ranges, 5xx)Pourquoi ce pattern est ROI immédiat
- Armor réduit le bruit avant l’app → baisse CPU/latence.
- Cloud Run scale, mais tu gardes un cap (max instances).
- BigQuery te donne des stats sur ranges/ASN/pays → règles plus intelligentes.
Le “point dur” : ne pas exporter tous les logs. Exporter curated security events seulement.
BigQuery analytics (trafic, bots, perf, sécurité)
Pipeline recommandé
LB/Armor/App logs
-> Logging filters (requests + security)
-> BigQuery dataset (partition par date)
-> clustering (ip_range / path / status / user_agent_category)
-> tables “marts” (KPI quotidiens)
-> dashboardsKPI utiles (IDEO-Lab)
- Top endpoints (RPS) + latence p95.
- Ratio humains vs bots (user-agent categ + patterns).
- Top IP ranges / ASN / pays (si enrichissement).
- Top erreurs (5xx) corrélées à une release (sha/tag).
- Coût : bytes scanned / queries → discipline partition/clustering.
BigQuery devient ton “radar” anti-abus + perf, à condition de partitionner et d’éviter les full scans.
CI/CD & releases : Cloud Build + Artifact Registry + canary
Pipeline “prod ready”
Git push / tag rel-*
-> Cloud Build (tests + build)
-> push Artifact Registry (digest)
-> deploy staging
-> smoke tests (/healthz, /version)
-> promotion prod (Cloud Run traffic split / GKE rollout)
-> rollback prêt (revision/digest précédent)Conventions (très pratiques)
- Tag image immuable :
git-<sha>+rel-YYYY.MM.DD-N. - Endpoint
/versionrenvoie release tag + sha (corrélation logs/incident). - Déploiement par digest en prod (pas
latest).
Observabilité & SLO : rendre l’ensemble opérable
Golden dashboard (minimum)
- RPS global + top endpoints
- Latence p95/p99
- HTTP 4xx/5xx
- Saturation (CPU/RAM) + instances/pods
- DB connections + DB latency
- Top errors (Error Reporting)
- Top slow tracesAlertes (qui servent)
- 5xx > seuil (impact user direct).
- Latence p95 > seuil (dégradation).
- DB : connections/IO saturées.
- Scaling anormal (Run instances proche max, pods pending).
Si tu as ces alertes + un runbook rollback, tu gères 90% des incidents.
DR multi-région : backups, runbooks, tests (sans fantasme)
Définir RPO/RTO (exemples)
- RPO (perte acceptable) : 15 min / 1h / 24h selon criticité.
- RTO (temps reprise) : 15 min / 1h / 4h selon ton niveau.
DRP minimal (déjà très bon)
- Cloud SQL : backups planifiés + restore tests
- Exports vers GCS (bucket multi-région) si besoin long-terme
- Images/snapshots (si VMs)
- Runbook de bascule (DNS/traffic) + personnes responsables
- Monitoring du plan (alert si backup échoue)DRP “plus sérieux” (progressif)
- Multi-zone partout (au minimum)
- Réplication / read-replica (selon DB)
- Infra as Code (Terraform) pour rebuild rapide
- Tests DR trimestriels (sinon DR = illusion)Le DR n’existe pas tant que tu n’as pas fait au moins 1 test de restore/bascule.
Checklist “prod” (IDEO-Lab)
- 3 projets : dev/stage/prod + budgets + alertes.
- LB global + Armor (WAF + rate limit) pour tout service public.
- Admin/backoffice derrière IAP (recommandé).
- Cloud SQL private + HA + backups + restore tests.
- GCS static/media + lifecycle rules.
- CI/CD : Cloud Build + Artifact Registry + deploy digest + canary/rollback.
- Observabilité : dashboards + alertes (5xx/latence/DB/scale).
- Analytics : logs “curated” → BigQuery (partition+cluster).
- DR : runbook + tests réguliers.
Pièges & anti-patterns (IDEO-Lab sur GCP)
| Anti-pattern | Symptôme | Risque | Correction |
|---|---|---|---|
| Tout public, sans Armor | Flood/bots | CPU/DB saturées + coût | LB + Armor + rate-limit + cap scaling |
| Cloud Run sans max instances | Scaling infini | Facture surprise | Max instances + WAF/rate-limit |
| DB saturée par connexions | “too many connections” | Indispo | Limiter concurrency/pool + read replicas si besoin |
| Logs exportés “en brut” | Volume énorme | Coût + bruit | Exports “curated” + rétention |
| BigQuery non partitionné | Bytes scanned explosent | Facture | Partition + clustering + marts |
| DR non testé | Restore incertain | Catastrophe le jour J | Restore tests + runbooks |
Résumé “IDEO-Lab cloud-ready”
- Bloquer tôt (Armor)
- Déployer safe (revisions/canary + rollback)
- Data solide (Cloud SQL HA + backups testés)
- Logs utiles (curated -> BigQuery)
- DR réel (tests)