MVAESTECH
Guide .NET · 12 · Hébergement

Publié le · par Mathieu Vaes

Google Cloud (GCP)

Sur GCP, une appli .NET conteneurisée se déploie surtout sur Cloud Run ou GKE. L'architecte choisit le bon service managé, câble l'identité sans clé, et garde les coûts et les limites en vue.

Chapitres du guide
En clair

Google Cloud loue des services prêts à l'emploi : exécuter un conteneur (Cloud Run), une base SQL entretenue pour vous (Cloud SQL), une file de messages (Pub/Sub). Vous ne gérez plus de serveurs, mais vous devez régler précisément qui a accès à quoi (IAM) et surveiller les coûts.

Architecture de référence Senior

Utilisateursweb · mobile Cloud LoadBalancing+ Cloud Armor (WAF) Région europe-west9 (Paris) Cloud Run · API .NETconteneur, 0 → N instances Cloud Run · Workerabonné Pub/Sub (push) GKE Autopilotalternative : services avec état,sidecars, contrôle fin réseau Cloud SQLSQL Server · PostgreSQL · IP privée Memorystore Pub/Sub Secret Manager Cloud Logging / TraceOpenTelemetry Cloud Build→ Artifact Registry
Orange : requête synchrone (utilisateur → LB → API → base). Bleu : événement asynchrone publié par l'API, poussé par Pub/Sub vers le worker. Chaque service tourne sous son propre compte de service IAM.

Où exécuter le code .NET Confirmé

ServiceModèlePourÀ surveiller
Cloud RunConteneurs serverless, facturés à l'usage, scale-to-zeroAPI HTTP sans état, workers Pub/Sub, jobs (Cloud Run Jobs)Démarrage à froid, durée max d'une requête (60 min), concurrence par instance (80 par défaut)
GKE AutopilotKubernetes managé, facturé aux podsNombreux services, besoins réseau ou sidecars spécifiquesComplexité Kubernetes, coût de base
GKE StandardKubernetes, vous gérez les nœudsGPU, contrôle total des nœudsExploitation des nœuds
Compute Engine (Windows Server)VM avec licence incluseApplis .NET Framework / IIS non migrablesPatching, coût de licence, pas de scale-to-zero
Cloud Functions (Cloud Run functions)Fonctions événementiellesPetits déclencheursMoins adapté à une API structurée
# Build et push dans Artifact Registry, puis déploiement Cloud Run
gcloud builds submit --tag europe-west9-docker.pkg.dev/acme/shop/api:1.8.2

gcloud run deploy shop-api \
  --image europe-west9-docker.pkg.dev/acme/shop/api:1.8.2 \
  --region europe-west9 \
  --service-account shop-api@acme.iam.gserviceaccount.com \
  --set-secrets "ConnectionStrings__Shop=shop-db-conn:latest" \
  --add-cloudsql-instances acme:europe-west9:shop-sql \
  --min-instances 1 --max-instances 20 --concurrency 80 \
  --cpu 1 --memory 512Mi --no-allow-unauthenticated

Cloud Run injecte la variable PORT (8080 par défaut, ce qui correspond au défaut .NET). La convention __ dans les noms de variables d'environnement correspond au séparateur : de la configuration .NET.

Services managés et équivalences Confirmé

BesoinService GCPCôté .NET
Base relationnelleCloud SQL (SQL Server, PostgreSQL, MySQL), AlloyDB, SpannerEF Core SqlServer / Npgsql ; connecteur ou proxy Cloud SQL Auth
CacheMemorystore (Redis / Valkey)StackExchange.Redis, HybridCache
MessagesPub/SubGoogle.Cloud.PubSub.V1 (au moins une fois : consommateurs idempotents)
FichiersCloud StorageGoogle.Cloud.Storage.V1, URL signées
SecretsSecret ManagerMontés en variables d'env. ou fichiers, ou lus via SDK
ChiffrementCloud KMSProtection des clés Data Protection
Tâches planifiéesCloud Scheduler + Cloud Run JobsRemplace un BackgroundService à minuterie
ObservabilitéCloud Logging, Monitoring, TraceLogs JSON sur stdout, OpenTelemetry (OTLP)
CI/CDCloud Build, Artifact Registry, Cloud DeployOu GitHub Actions avec Workload Identity Federation

Identité et sécurité Senior

  • Un compte de service par charge de travail, avec le minimum de rôles (roles/cloudsql.client, roles/secretmanager.secretAccessor sur le seul secret utile).
  • Aucune clé JSON de compte de service : les SDK Google utilisent les Application Default Credentials. Sur GKE, Workload Identity Federation for GKE ; depuis GitHub Actions, Workload Identity Federation.
  • Réseau : Cloud SQL en IP privée, Cloud Run en sortie VPC directe (Direct VPC egress), services internes en --ingress internal ou derrière IAP.
  • Infrastructure as Code : Terraform (provider google) versionné, pas de clic dans la console en production.
// Logs structurés compris par Cloud Logging : JSON sur stdout avec un champ "severity"
builder.Logging.ClearProviders();
builder.Logging.AddJsonConsole(o => o.JsonWriterOptions = new() { Indented = false });
// Pour un mapping exact de severity et la corrélation avec Cloud Trace :
// Google.Cloud.Diagnostics.AspNetCore3 ou un formateur Serilog dédié

// Clés Data Protection partagées entre instances, chiffrées par KMS
builder.Services.AddDataProtection()
    .PersistKeysToGoogleCloudStorage("acme-shop-keys", "dataprotection/keys.xml")
    .ProtectKeysWithGoogleKms("projects/acme/locations/europe-west9/keyRings/shop/cryptoKeys/dp");
    // packages Google.Cloud.AspNetCore.DataProtection.Storage et .Kms
Optimiser Cloud Run pour .NET
  • Démarrage à froid : --min-instances 1 sur les services critiques, publication ReadyToRun (<PublishReadyToRun>true</PublishReadyToRun>), ou Native AOT pour les petits services, et l'option de démarrage accéléré du CPU (startup CPU boost).
  • Facturation à la requête : le CPU est fortement réduit hors traitement de requête. Un BackgroundService ou du travail après la réponse exige la facturation à l'instance (CPU toujours alloué).
  • Concurrence : une API async .NET gère bien 80 requêtes simultanées ou plus par instance ; la baisser pour un traitement CPU lourd.
Piège
  • Connexions Cloud SQL : max-instances × Max Pool Size peut dépasser la limite de connexions de l'instance. Réduire la taille du pool ou plafonner les instances.
  • Data Protection non partagée : chaque instance Cloud Run génère ses clés, les cookies et jetons anti-CSRF échouent dès que le load balancer change d'instance.
  • Logs en texte brut : tout apparaît en sévérité « Default » ; impossible de filtrer les erreurs.
  • Région : base et services dans la même région (latence, coût de sortie réseau, conformité RGPD — europe-west9 Paris, europe-west1 Belgique).

À retenir

  • Cloud Run par défaut pour les API .NET sans état ; GKE Autopilot quand Kubernetes apporte un vrai plus.
  • Identité sans clé (ADC, Workload Identity), un compte de service par service, secrets dans Secret Manager.
  • Logs JSON avec severity, traces OpenTelemetry, Data Protection persistée et chiffrée.

Un projet .NET à cadrer ou à reprendre ?

API REST documentées et testées, applications ASP.NET MVC (y compris VB.NET), migration de services anciens vers une architecture claire : parlons de votre code.