ITSkillsCenter
Blog

GCP Cloud Run : serverless containers

8 min de lecture

Ce que vous saurez faire à la fin

  1. Déployer une application conteneurisée (Node.js, Python, PHP) sur Google Cloud Run sans gérer de serveur.
  2. Construire des images Docker optimisées et les pousser vers Artifact Registry.
  3. Configurer la mise à l’échelle automatique de 0 à plusieurs centaines d’instances selon le trafic.
  4. Connecter Cloud Run à Cloud SQL, Firestore ou un service externe via VPC Connector.
  5. Maîtriser le coût à l’usage (généralement entre 0 FCFA et 15 000 FCFA/mois pour une PME) et garantir un démarrage à froid acceptable.

Durée : 5h. Pré-requis : Compte Google Cloud (300 USD de crédit offert pendant 90 jours), gcloud CLI installée, Docker Desktop ou Podman, code source d’une application web (API REST, microservice, site dynamique), carte bancaire pour activer la facturation (les premiers 2 millions de requêtes/mois sont gratuits).

Étape 1 — Comprendre le modèle serverless containers

Cloud Run combine deux concepts : la flexibilité des conteneurs Docker (vous gardez le contrôle total du runtime, des dépendances, du système d’exploitation) et la simplicité du serverless (pas de VM à patcher, scaling automatique, facturation à la milliseconde de CPU consommée).

Concrètement, vous publiez une image Docker, Cloud Run la démarre uniquement lorsqu’une requête HTTPS arrive, garde l’instance chaude quelques minutes pour absorber le trafic suivant, puis l’éteint. Vous ne payez que le temps réel d’exécution. Pour une PME sénégalaise dont le site reçoit 200 visites/jour, la facture est souvent inférieure à 2 000 FCFA/mois.

Étape 2 — Installer gcloud CLI et créer un projet

# Installation gcloud (Linux/macOS)
curl https://sdk.cloud.google.com | bash
exec -l $SHELL

# Vérifier
gcloud --version

# S'authentifier
gcloud auth login
gcloud auth application-default login

# Créer un projet dédié
gcloud projects create pme-dakar-prod \
    --name="PME Dakar Production"

# Définir le projet courant
gcloud config set project pme-dakar-prod

# Activer la facturation (obligatoire avant Cloud Run)
gcloud beta billing projects link pme-dakar-prod \
    --billing-account=01ABCD-EFGH12-IJKL34

Étape 3 — Activer les API nécessaires

# Activer Cloud Run, Artifact Registry, Cloud Build
gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudbuild.googleapis.com \
    secretmanager.googleapis.com

# Définir la région par défaut (europe-west1 pour latence vers Dakar)
gcloud config set run/region europe-west1
gcloud config set artifacts/location europe-west1

La région europe-west1 (Belgique) offre une latence d’environ 90 ms depuis Dakar via les câbles ACE et MainOne. africa-south1 (Johannesburg) existe mais ajoute 60 ms supplémentaires.

Étape 4 — Préparer une application Node.js minimale

Créez un dossier de projet avec deux fichiers : un serveur HTTP simple et un Dockerfile.

// index.js
const express = require('express');
const app = express();
const port = process.env.PORT || 8080;

app.get('/', (req, res) => {
  res.json({
    message: 'Bonjour depuis Cloud Run',
    region: process.env.K_SERVICE,
    timestamp: new Date().toISOString()
  });
});

app.get('/health', (req, res) => res.send('OK'));

app.listen(port, () => {
  console.log(`Serveur démarré sur le port ${port}`);
});
# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
ENV PORT=8080
EXPOSE 8080
CMD ["node", "index.js"]

Étape 5 — Créer un dépôt Artifact Registry

# Créer un dépôt Docker
gcloud artifacts repositories create pme-images \
    --repository-format=docker \
    --location=europe-west1 \
    --description="Images Docker PME Dakar"

# Configurer Docker pour s'authentifier auprès du registry
gcloud auth configure-docker europe-west1-docker.pkg.dev

# Lister les dépôts
gcloud artifacts repositories list

Étape 6 — Construire et pousser l’image avec Cloud Build

Cloud Build construit l’image directement dans le cloud, ce qui économise la bande passante de votre connexion à Dakar (Orange Fibre 100 Mbps suffit largement, mais inutile de pousser 200 Mo de couches Docker à chaque déploiement).

# Construire et publier en une commande
gcloud builds submit \
    --tag europe-west1-docker.pkg.dev/pme-dakar-prod/pme-images/api:v1

# Lister les images construites
gcloud artifacts docker images list \
    europe-west1-docker.pkg.dev/pme-dakar-prod/pme-images

# Alternative : construction locale puis push
docker build -t europe-west1-docker.pkg.dev/pme-dakar-prod/pme-images/api:v1 .
docker push europe-west1-docker.pkg.dev/pme-dakar-prod/pme-images/api:v1

Étape 7 — Déployer le service sur Cloud Run

gcloud run deploy api-pme \
    --image=europe-west1-docker.pkg.dev/pme-dakar-prod/pme-images/api:v1 \
    --platform=managed \
    --region=europe-west1 \
    --allow-unauthenticated \
    --port=8080 \
    --memory=512Mi \
    --cpu=1 \
    --min-instances=0 \
    --max-instances=10 \
    --concurrency=80 \
    --timeout=60s

# La commande retourne une URL HTTPS publique
# https://api-pme-abc123-ew.a.run.app

# Tester immédiatement
curl https://api-pme-abc123-ew.a.run.app

Le drapeau --allow-unauthenticated rend le service public. Pour une API interne, retirez-le et accordez l’accès via IAM.

Étape 8 — Comprendre min-instances et démarrage à froid

Avec --min-instances=0, le service tombe à zéro après 15 minutes sans trafic. La requête suivante subit un démarrage à froid (cold start) de 800 ms à 3 s selon l’image. Pour un site vitrine, c’est acceptable. Pour une API critique (paiement Orange Money, validation OTP), définissez --min-instances=1.

Configuration Coût mensuel estimé Cold start Cas d’usage
min=0, max=10 0 à 5 000 FCFA 1 à 3 s Site vitrine, blog, API interne
min=1, max=20 9 000 à 18 000 FCFA 0 ms API client, dashboard, e-commerce
min=3, max=50 27 000 à 60 000 FCFA 0 ms Application critique, paiement

Étape 9 — Connecter à Cloud SQL (PostgreSQL)

# Créer une instance Cloud SQL PostgreSQL
gcloud sql instances create pme-db \
    --database-version=POSTGRES_15 \
    --tier=db-f1-micro \
    --region=europe-west1 \
    --root-password='MotDePasseFort2026!'

# Créer la base
gcloud sql databases create pme_app --instance=pme-db

# Récupérer le nom de connexion
gcloud sql instances describe pme-db \
    --format="value(connectionName)"
# Exemple : pme-dakar-prod:europe-west1:pme-db

# Redéployer Cloud Run avec connexion à Cloud SQL
gcloud run deploy api-pme \
    --image=europe-west1-docker.pkg.dev/pme-dakar-prod/pme-images/api:v1 \
    --add-cloudsql-instances=pme-dakar-prod:europe-west1:pme-db \
    --set-env-vars="DB_HOST=/cloudsql/pme-dakar-prod:europe-west1:pme-db,DB_NAME=pme_app"

L’instance db-f1-micro coûte environ 8 500 FCFA/mois, idéale pour démarrer. Sauvegardes automatiques activées par défaut.

Étape 10 — Gérer les secrets avec Secret Manager

Ne stockez jamais un mot de passe ou une clé API dans une variable d’environnement en clair. Utilisez Secret Manager.

# Créer un secret
echo -n "MotDePasseFort2026!" | gcloud secrets create db-password \
    --data-file=- \
    --replication-policy=automatic

# Donner accès au compte de service Cloud Run
PROJECT_NUMBER=$(gcloud projects describe pme-dakar-prod \
    --format="value(projectNumber)")

gcloud secrets add-iam-policy-binding db-password \
    --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
    --role="roles/secretmanager.secretAccessor"

# Injecter dans Cloud Run
gcloud run services update api-pme \
    --update-secrets=DB_PASSWORD=db-password:latest \
    --region=europe-west1

Étape 11 — Configurer un domaine personnalisé

# Mapper api.monentreprise.sn vers le service
gcloud beta run domain-mappings create \
    --service=api-pme \
    --domain=api.monentreprise.sn \
    --region=europe-west1

# Récupérer les enregistrements DNS à créer
gcloud beta run domain-mappings describe \
    --domain=api.monentreprise.sn \
    --region=europe-west1

Ajoutez le CNAME retourné chez votre registrar (NIC Sénégal, Cloudflare, OVH). Google génère automatiquement un certificat SSL Let’s Encrypt en moins de 30 minutes.

Étape 12 — Mettre en place les variables d’environnement

# Définir plusieurs variables en une fois
gcloud run services update api-pme \
    --update-env-vars="NODE_ENV=production,DEFAULT_CURRENCY=XOF,COUNTRY=SN" \
    --region=europe-west1

# Lister la configuration courante
gcloud run services describe api-pme \
    --region=europe-west1 \
    --format="export"

Étape 13 — Surveiller logs et métriques

# Suivre les logs en temps réel
gcloud run services logs tail api-pme --region=europe-west1

# Consulter les 50 dernières lignes
gcloud run services logs read api-pme \
    --region=europe-west1 \
    --limit=50

# Métriques clés à surveiller dans la console Cloud Run :
# - Request count
# - Request latency (P50, P95, P99)
# - Container CPU utilization
# - Container memory utilization
# - Container instance count

Configurez une alerte Cloud Monitoring pour être notifié par email ou WhatsApp (via Twilio) si la latence P95 dépasse 2 secondes ou si le taux d’erreur 5xx dépasse 1 %.

Étape 14 — Mettre en place un déploiement progressif (canary)

# Déployer une nouvelle révision sans envoyer de trafic
gcloud run deploy api-pme \
    --image=europe-west1-docker.pkg.dev/pme-dakar-prod/pme-images/api:v2 \
    --no-traffic \
    --tag=canary \
    --region=europe-west1

# Tester la nouvelle révision via un sous-domaine dédié
curl https://canary---api-pme-abc123-ew.a.run.app

# Envoyer 10 % du trafic vers v2
gcloud run services update-traffic api-pme \
    --to-tags=canary=10 \
    --region=europe-west1

# Si tout va bien, basculer 100 % vers v2
gcloud run services update-traffic api-pme \
    --to-tags=canary=100 \
    --region=europe-west1

Erreurs courantes à éviter

  • Image trop lourde (1 Go+) : démarrage à froid de 5 à 10 s. Utilisez des images Alpine, supprimez les outils de build (apt-get clean, multi-stage build).
  • PORT codé en dur : Cloud Run définit dynamiquement la variable PORT. Lisez toujours process.env.PORT ou os.environ.get("PORT").
  • Connexion Cloud SQL refusée : oubli du flag --add-cloudsql-instances ou du socket Unix /cloudsql/connection-name.
  • Timeout après 60 s : par défaut Cloud Run coupe à 60 s. Pour un job long, augmentez avec --timeout=900s (max 60 min).
  • Concurrency par défaut trop faible : 80 requêtes simultanées par instance, suffisant pour Node.js. Pour une app PHP/Python synchrone, descendez à 1 ou 4.
  • Permissions IAM manquantes : le compte de service Cloud Run par défaut n’a pas accès à Cloud SQL, Storage, Secrets. Accordez les rôles explicitement.
  • Cold start sur paiement Orange Money : appliquez --min-instances=1 sur les services de paiement, le surcoût (8 000 FCFA/mois) est négligeable face à un client perdu.

Checklist de mise en production

  • [ ] Projet GCP créé avec facturation activée
  • [ ] APIs run, artifactregistry, cloudbuild, secretmanager activées
  • [ ] Région europe-west1 configurée par défaut
  • [ ] Dépôt Artifact Registry créé
  • [ ] Image Docker construite et poussée avec tag versionné (v1, v2…)
  • [ ] Service Cloud Run déployé et accessible via HTTPS
  • [ ] Domaine personnalisé .sn ou .com mappé avec certificat SSL
  • [ ] Secrets stockés dans Secret Manager (jamais en clair)
  • [ ] Cloud SQL connectée si besoin de base relationnelle
  • [ ] min-instances ajusté selon criticité du service
  • [ ] Alertes Cloud Monitoring configurées (latence, erreurs, coûts)
  • [ ] Budget mensuel défini avec notification à 50 %, 80 %, 100 %
  • [ ] Workflow CI/CD en place (Cloud Build trigger sur git push)
  • [ ] Documentation interne du déploiement et rollback partagée
Besoin d'un site web ?

Confiez-nous la Création de Votre Site Web

Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.

À partir de 250.000 FCFA
Parlons de Votre Projet
Publicité