🚀 DĂ©ploiement d’une Application Node.js sur Google Cloud Platform (GCP)

Guide Complet pour Débutants - De Zéro à Production sur GCP

Par samba-diallo | Octobre 2025

GCP Node.js License DevOps


📑 Table des Matiùres


🎯 Introduction

Qu’allez-vous Apprendre ?

Ce guide vous apprend Ă  dĂ©ployer une application web simple sur Google Cloud Platform (GCP) en utilisant Compute Engine (Ă©quivalent d’EC2 sur AWS). Vous dĂ©couvrirez l’écosystĂšme Google Cloud et comparerez avec AWS.

🎓 CompĂ©tences Acquises

  • ✅ CrĂ©er et configurer un compte Google Cloud
  • ✅ GĂ©rer les identitĂ©s avec IAM (Identity and Access Management)
  • ✅ Lancer une VM (Virtual Machine) sur Compute Engine
  • ✅ Configurer des rĂšgles de pare-feu (Firewall Rules)
  • ✅ Automatiser avec Startup Scripts
  • ✅ DĂ©ployer une application Node.js sur GCP
  • ✅ Comparer GCP et AWS

đŸ’Œ Pourquoi Google Cloud Platform ?

🌐 GCP dans le Monde
   → #3 mondial du cloud (10% de parts de marchĂ©)
   → UtilisĂ© par : Spotify, Twitter, Snapchat, PayPal
   → Infrastructure de Google (Gmail, YouTube, Search)

💡 Avantages Uniques de GCP
   → RĂ©seau privĂ© global le plus rapide
   → Pricing transparent et prĂ©visible
   → Live migration (maintenance sans downtime)
   → BigQuery (analytics Ă  l'Ă©chelle mondiale)
   → Kubernetes natif (GKE - Google Kubernetes Engine)

💰 OpportunitĂ©s CarriĂšre
   → Cloud Engineer (GCP) : 65-110k€/an
   → Data Engineer (GCP) : 70-120k€/an
   → CompĂ©tence complĂ©mentaire Ă  AWS

🔄 Comparaison avec AWS
   → GCP : SimplicitĂ©, innovation, data analytics
   → AWS : MaturitĂ©, breadth de services, market leader
   → Multi-cloud = Valeur ajoutĂ©e sur le marchĂ©

📋 PrĂ©requis

Connaissances

NiveauRequis
EssentielUtilisation d’un navigateur web
RecommandéNotions de ligne de commande (bash/shell)
UtileBases de JavaScript/Node.js
BonusConnaissance d’AWS (pour comparaison)

Outils Nécessaires

OutilUtilitéTéléchargement
Navigateur WebAccÚs GCP ConsoleChrome (recommandé), Firefox
Compte GoogleAuthentificationGmail
Carte BancaireVérification (300$ gratuits)-

💰 CoĂ»ts GCP

✅ GCP Free Tier (Toujours gratuit)
   → e2-micro VM : 1 instance/mois GRATUIT (US regions)
   → 30 GB stockage persistant
   → 5 GB snapshots
   → 1 GB rĂ©seau sortant/mois

🎁 GCP Free Trial (Nouvel utilisateur)
   → 300 USD de crĂ©dits GRATUITS
   → Valable 90 jours
   → Aucune facturation automatique aprùs expiration
   → Carte bancaire requise (vĂ©rification, pas de dĂ©bit)

💡 Pour ce Tutoriel
   → CoĂ»t : 0€ (avec Free Trial)
   → VM e2-micro (Always Free Tier)
   → DurĂ©e : ~2-3 heures de test
   → N'oubliez pas de supprimer aprùs !

⚠ Important
   → Utilisez e2-micro (Always Free)
   → RĂ©gion : us-central1, us-west1, ou us-east1
   → Supprimez les ressources aprùs test

🔐 Partie 1 : Configuration GCP

Étape 1.1 : CrĂ©er un Compte Google Cloud

🔗 Inscription

1. Accéder à GCP

https://cloud.google.com

2. Cliquer sur “Get started for free” (Commencer gratuitement)

3. Se Connecter avec Compte Google

Utilisez un compte Gmail existant
OU
Créez un nouveau compte Google

4. Accepter les Conditions d’Utilisation

☑ Terms of Service
☑ Email updates (optionnel)

5. Informations de Compte

InformationExempleRequis
PaysFrance✅
Type de compteIndividual (Particulier)✅
Carte bancaireVISA/MasterCard✅ (vĂ©rification)

6. Vérification de la Carte

PrĂ©lĂšvement : 0€ ou ~1€ (remboursĂ© immĂ©diatement)
But : VĂ©rification que vous n'ĂȘtes pas un robot
⚠ Aucune facturation automatique aprĂšs Free Trial

7. Confirmation

✅ 300 USD de crĂ©dits ajoutĂ©s
✅ Valables 90 jours
✅ Compte GCP créé !

🎹 Interface GCP Console

Accéder à la Console :

https://console.cloud.google.com

ÉlĂ©ments ClĂ©s :

ÉlĂ©mentDescriptionEmplacement
Navigation Menu☰ Tous les services GCPHaut gauche
Project SelectorChoisir/créer un projetHaut (nom du projet)
Search BarRechercher services/ressourcesHaut centre
Cloud ShellTerminal dans le navigateurIcĂŽne >_ en haut
NotificationsAlertes et logsIcĂŽne cloche

Étape 1.2 : CrĂ©er un Projet GCP

🎯 Qu’est-ce qu’un Projet GCP ?

Projet GCP = Conteneur logique pour vos ressources

Caractéristiques :
→ Isole les ressources (VMs, databases, etc.)
→ Facturation sĂ©parĂ©e
→ Permissions granulaires (IAM)
→ Quotas et limites indĂ©pendants

Analogie :
→ Projet = Dossier pour organiser vos fichiers
→ Ressources = Fichiers dans le dossier

Bonnes Pratiques :
→ 1 projet par environnement (dev, staging, prod)
→ 1 projet par application
→ Nommage cohĂ©rent (ex : mon-app-dev)

📝 CrĂ©ation du Projet

MĂ©thode 1 : Via l’Interface

1. Cliquer sur le sélecteur de projet (haut de la page)
2. Cliquer sur "NEW PROJECT" (Nouveau projet)
3. Remplir les informations

Configuration :

ChampValeurExemple
Project nameNom descriptifsample-app-project
Project IDIdentifiant unique (généré auto)sample-app-project-438201
OrganizationLaisser vide (pas d’organisation)-
LocationNo organization-

4. Cliquer sur “CREATE”

5. Confirmation

✅ Projet créé !
🔄 Basculer vers le nouveau projet (sĂ©lecteur en haut)

Méthode 2 : Via Cloud Shell (Avancé)

# Ouvrir Cloud Shell (icĂŽne >_ en haut)
 
# Créer un projet
gcloud projects create sample-app-project-$RANDOM \
    --name="Sample App Project"
 
# Définir comme projet par défaut
gcloud config set project sample-app-project-XXXXX
 
# Vérifier
gcloud config get-value project

⚙ Activer les APIs NĂ©cessaires

GCP nĂ©cessite d’activer les APIs avant utilisation

APIs Ă  Activer :

1. Compute Engine API
2. Cloud Resource Manager API (déjà activée)

Activation via Interface :

1. Navigation Menu (☰)
2. APIs & Services → Library
3. Rechercher : "Compute Engine API"
4. Cliquer dessus
5. Bouton "ENABLE" (Activer)
6. Attendre ~30 secondes

Activation via Cloud Shell :

# Activer Compute Engine API
gcloud services enable compute.googleapis.com
 
# Vérifier les APIs activées
gcloud services list --enabled

Étape 1.3 : Configuration IAM (Identity and Access Management)

🎯 Comprendre IAM sur GCP

IAM = Who can do What on Which resource

Concepts Clés :

1. Members (Qui)
   → Google Account (user@gmail.com)
   → Service Account (app@project.iam.gserviceaccount.com)
   → Google Group
   → Cloud Identity domain

2. Roles (Quoi)
   → Primitive : Owner, Editor, Viewer
   → Predefined : roles/compute.admin
   → Custom : Créés par vous

3. Resources (Sur quoi)
   → Project
   → VM instance
   → Storage bucket
   → Etc.

ModĂšle :
Member + Role → Access to Resource

🔐 CrĂ©er un Compte de Service (Service Account)

Qu’est-ce qu’un Service Account ?

Service Account = Identité pour applications/VMs

Différence User vs Service Account :

User Account :
→ Pour humains (vous)
→ Connexion via Google login
→ MFA, rĂ©cupĂ©ration de compte

Service Account :
→ Pour applications/scripts
→ Authentification via clĂ©s
→ Pas d'interface utilisateur

Usage :
→ VM qui accùde à Cloud Storage
→ Application qui Ă©crit dans BigQuery
→ Script qui crĂ©e des ressources

Création :

Via Interface :

1. Navigation Menu (☰)
2. IAM & Admin → Service Accounts
3. "+ CREATE SERVICE ACCOUNT"
4. Configuration :
ChampValeur
Service account namesample-app-sa
Service account IDsample-app-sa (auto-généré)
DescriptionService account for sample app
5. CONTINUE
6. Grant this service account access to project :
   Role : Compute Admin (roles/compute.admin)
7. CONTINUE
8. DONE

Via Cloud Shell :

# Créer service account
gcloud iam service-accounts create sample-app-sa \
    --display-name="Sample App Service Account"
 
# Ajouter le rĂŽle
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:sample-app-sa@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/compute.admin"

đŸ›Ąïž Activer l’Authentification Ă  Deux Facteurs (2FA)

Pour votre Compte Google :

1. Aller sur : https://myaccount.google.com/security
2. Section "Signing in to Google"
3. Cliquer sur "2-Step Verification"
4. Suivre les instructions :
   - Numéro de téléphone (SMS)
   OU
   - Google Authenticator (recommandé)
5. Activer

Pourquoi c’est CRITIQUE :

Statistiques Sécurité :
→ 2FA bloque 100% des bots automatisĂ©s (Google)
→ 99% des attaques de phishing (Microsoft)
→ Protection compte Google = Protection GCP

⚠ Sans 2FA :
❌ Compte Google compromis = Accùs GCP
❌ Peut gĂ©nĂ©rer des milliers d'euros de factures
❌ Peut supprimer toutes vos donnĂ©es

✅ Avec 2FA :
✅ Protection maximale
✅ Standard entreprise
✅ Obligation pour comptes critiques

Étape 1.4 : Configuration de la Facturation

💳 Comprendre la Facturation GCP

ModĂšle de Facturation :

GCP Billing = Pay-as-you-go

Concepts :
→ Billing Account (Compte de facturation)
→ Projects liĂ©s au compte
→ Budgets et alertes
→ Free Tier toujours actif

Transparence :
→ Pricing Calculator
→ Facturation à la seconde (vs minute sur AWS)
→ Sustained Use Discounts (rĂ©ductions automatiques)
→ Committed Use Discounts (contrats long terme)

Vérifier le Compte de Facturation :

1. Navigation Menu (☰)
2. Billing
3. Vous devriez voir :
   - My Billing Account
   - Free trial status : $300 remaining
   - Days remaining : ~90

Configurer un Budget (Recommandé) :

1. Billing → Budgets & alerts
2. CREATE BUDGET
3. Configuration :
ParamĂštreValeur
NameSample App Budget
ProjectsSélectionner votre projet
Budget amount10 USD
Alert threshold50%, 90%, 100%
Email notificationsVotre email
4. FINISH

Résultat :

✅ Email si dĂ©penses > 5 USD (50%)
✅ Email si dĂ©penses > 9 USD (90%)
✅ Email si dĂ©penses > 10 USD (100%)
⚠ Budget = Alerte seulement (pas de coupure automatique)

đŸ–„ïž Partie 2 : DĂ©ploiement Compute Engine

Qu’est-ce que Compute Engine ?

Compute Engine = Service de VMs (Virtual Machines) de GCP

Définition :
→ Équivalent d'EC2 sur AWS
→ Serveurs virtuels à la demande
→ Infrastructure Google mondiale

Avantages :
✅ DĂ©marrage ultra-rapide (~20 secondes)
✅ Live migration (maintenance sans interruption)
✅ RĂ©seau privĂ© Google (latence minimale)
✅ Disques persistants haute performance
✅ Snapshots et backups automatiques

Cas d'usage :
→ HĂ©berger applications web
→ Serveurs de base de donnĂ©es
→ Calcul haute performance
→ Containers (avant Kubernetes)
→ CI/CD runners

Étape 2.1 : Lancer une Instance VM

🚀 AccĂ©der Ă  Compute Engine

Via Interface :

1. Navigation Menu (☰)
2. Compute Engine → VM instances
3. Si premiĂšre utilisation :
   - Attendre initialisation (~1 minute)
   - API Compute Engine s'active
4. Cliquer "CREATE INSTANCE"

📝 Configuration de l’Instance

1ïžâƒŁ Nom et RĂ©gion

ParamĂštreValeurExplication
Namesample-app-vmIdentifiant de la VM
Labelsenv=dev, app=sampleOrganisation (optionnel)
Regionus-central1Iowa, USA (Free Tier)
Zoneus-central1-aZone de disponibilité

Pourquoi us-central1 ?

Free Tier (Always Free) :
→ us-west1 (Oregon)
→ us-central1 (Iowa)
→ us-east1 (South Carolina)

Autres régions = Facturation normale

Pour ce tutoriel :
✅ Choisir us-central1 (Free Tier)
❌ europe-west1 (Belgique) = CoĂ»t

2ïžâƒŁ Machine Configuration (Type de VM)

GCP propose plusieurs familles de machines :

FamilleUsageExemple
E2Usage général, économiquee2-micro, e2-small
N2Balanced, haute performancen2-standard-2
C2Compute-optimizedc2-standard-4
M2Memory-optimizedm2-ultramem-208

Configuration pour ce Tutoriel :

☑ Machine family : General-purpose
☑ Series : E2
☑ Machine type : e2-micro

Specs :
- 2 vCPUs (shared-core)
- 1 GB RAM
- ✅ FREE TIER (Always Free)

Coût (si hors Free Tier) :
- ~$6.11/mois (730 heures)
- ~$0.008365/heure

Comparaison Types de Machines :

TypevCPURAMCoût/moisFree Tier
e2-micro21 GB$6.11✅
e2-small22 GB$12.22❌
e2-medium24 GB$24.44❌
e2-standard-228 GB$48.88❌

3ïžâƒŁ Boot Disk (Disque de DĂ©marrage)

Cliquer sur “CHANGE” (Modifier)

ParamĂštreValeur
Operating SystemUbuntu
VersionUbuntu 22.04 LTS (Jammy Jellyfish)
Boot disk typeStandard persistent disk
Size10 GB

Pourquoi Ubuntu ?

Ubuntu 22.04 LTS :
✅ Long Term Support (5 ans de mises à jour)
✅ Large communautĂ©
✅ APT package manager (familier)
✅ Compatible avec la plupart des tutos
✅ Support Docker natif

Alternatives :
- Debian 11 (plus léger)
- CentOS Stream (Red Hat ecosystem)
- Container-Optimized OS (pour containers)

Cliquer “SELECT” (SĂ©lectionner)


4ïžâƒŁ Firewall (Pare-feu) đŸ”„ CRITIQUE

Dans la section “Firewall” :

☑ Allow HTTP traffic
☐ Allow HTTPS traffic (pas nécessaire pour ce tuto)

⚠ IMPORTANT :

Cocher "Allow HTTP traffic" :
→ CrĂ©e automatiquement une rĂšgle de firewall
→ Autorise le port 80 (HTTP)
→ Source : 0.0.0.0/0 (tout Internet)

Sans cette option :
❌ Firewall bloque tout le trafic HTTP
❌ Erreur "Connection timeout"
❌ Application inaccessible

5ïžâƒŁ Management, Security, Disks, Networking, Sole Tenancy

Cliquer sur “Management” pour dĂ©velopper

Naviguer vers “Automation” (en bas de Management)

Section “Startup script” :

C’est ici que nous allons coller notre script d’installation !


Étape 2.2 : Le Startup Script

🎯 Qu’est-ce qu’un Startup Script ?

Startup Script = Script exécuté au démarrage de la VM

Équivalent :
→ AWS : User Data
→ GCP : Startup Script / Metadata

Caractéristiques :
✅ ExĂ©cutĂ© automatiquement par GCP
✅ À chaque dĂ©marrage (diffĂ©rence avec AWS !)
✅ Privilùges root
✅ Permet automation

Différence AWS vs GCP :
AWS User Data → 1 seule fois (premier boot)
GCP Startup Script → À chaque boot (par dĂ©faut)

Configuration :
→ StockĂ© dans instance metadata
→ Peut ĂȘtre mis Ă  jour sans recrĂ©er la VM

📝 Le Script Complet

Copier-coller dans “Startup script” :

#!/bin/bash
set -e
 
# Log everything
exec > >(tee /var/log/startup-script.log)
exec 2>&1
 
echo "=========================================="
echo "Starting Startup Script"
echo "Time: $(date)"
echo "=========================================="
 
# Update system
echo "Updating system packages..."
apt-get update
apt-get upgrade -y
 
# Install Node.js 21.x
echo "Installing Node.js..."
curl -fsSL https://deb.nodesource.com/setup_21.x | bash -
apt-get install -y nodejs
 
# Verify installation
echo "Node.js version: $(node --version)"
echo "npm version: $(npm --version)"
 
# Create application directory
echo "Creating application directory..."
mkdir -p /opt/sample-app
cd /opt/sample-app
 
# Create app.js
echo "Creating app.js..."
cat > /opt/sample-app/app.js << 'EOF'
const http = require('http');
const os = require('os');
 
const server = http.createServer((req, res) => {
  const hostname = os.hostname();
  const platform = os.platform();
  const uptime = process.uptime();
  
  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.end(`
    <!DOCTYPE html>
    <html>
    <head>
      <title>Hello from GCP!</title>
      <style>
        body {
          font-family: Arial, sans-serif;
          max-width: 800px;
          margin: 50px auto;
          padding: 20px;
          background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
          color: white;
        }
        .container {
          background: rgba(255,255,255,0.1);
          padding: 30px;
          border-radius: 10px;
          backdrop-filter: blur(10px);
        }
        h1 { margin-top: 0; }
        .info { margin: 10px 0; }
        code {
          background: rgba(0,0,0,0.3);
          padding: 2px 6px;
          border-radius: 3px;
        }
      </style>
    </head>
    <body>
      <div class="container">
        <h1>🎉 Hello from Google Cloud Platform!</h1>
        <p class="info">✅ Your Node.js app is running successfully on GCP Compute Engine</p>
        <hr>
        <p class="info"><strong>Hostname:</strong> <code>${hostname}</code></p>
        <p class="info"><strong>Platform:</strong> <code>${platform}</code></p>
        <p class="info"><strong>App Uptime:</strong> <code>${uptime.toFixed(2)}s</code></p>
        <p class="info"><strong>Node.js:</strong> <code>${process.version}</code></p>
        <hr>
        <p style="font-size: 12px; opacity: 0.8;">
          Deployed by: samba-diallo | Tutorial: GCP Compute Engine Deployment
        </p>
      </div>
    </body>
    </html>
  `);
});
 
const port = process.env.PORT || 80;
server.listen(port, () => {
  console.log(`Server running on port ${port}`);
  console.log(`Hostname: ${os.hostname()}`);
});
EOF
 
# Install PM2 for process management
echo "Installing PM2..."
npm install -g pm2
 
# Start application with PM2
echo "Starting application with PM2..."
pm2 start /opt/sample-app/app.js --name sample-app
 
# Configure PM2 to start on boot
echo "Configuring PM2 startup..."
pm2 startup systemd -u root --hp /root
pm2 save
 
echo "=========================================="
echo "Startup Script Completed Successfully!"
echo "Time: $(date)"
echo "=========================================="

Étape 2.3 : Explication DĂ©taillĂ©e du Script

Partie 1 : Initialisation et Logging

#!/bin/bash
set -e
 
# Log everything
exec > >(tee /var/log/startup-script.log)
exec 2>&1
 
echo "Starting Startup Script"
echo "Time: $(date)"

Explication :

LigneSignification
#!/bin/bashExécute avec Bash
set -eArrĂȘte si erreur
exec > >(tee ...)Redirige sortie vers fichier + écran
exec 2>&1Redirige erreurs vers sortie standard

Résultat :

✅ Tous les logs sauvegardĂ©s dans /var/log/startup-script.log
✅ Visible dans console GCP (Cloud Logging)
✅ Facilite le dĂ©bogage

Partie 2 : Mise Ă  Jour SystĂšme

echo "Updating system packages..."
apt-get update
apt-get upgrade -y

Pourquoi ?

Sécurité :
→ Patches de sĂ©curitĂ© rĂ©cents
→ Corrections de bugs
→ Derniùres versions des packages

Bonnes pratiques :
✅ Toujours mettre à jour avant install
✅ Évite les conflits de dĂ©pendances

Partie 3 : Installation Node.js

echo "Installing Node.js..."
curl -fsSL https://deb.nodesource.com/setup_21.x | bash -
apt-get install -y nodejs
 
echo "Node.js version: $(node --version)"
echo "npm version: $(npm --version)"

Différence avec AWS :

AspectAWS (Amazon Linux)GCP (Ubuntu)
Gestionnaireyumapt-get
Repo Node.jsrpm.nodesource.comdeb.nodesource.com
Format packages.rpm.deb

Partie 4 : CrĂ©ation de l’Application

mkdir -p /opt/sample-app
cd /opt/sample-app
 
cat > /opt/sample-app/app.js << 'EOF'
const http = require('http');
const os = require('os');
 
const server = http.createServer((req, res) => {
  const hostname = os.hostname();
  const platform = os.platform();
  const uptime = process.uptime();
  
  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.end(`
    <!DOCTYPE html>
    <html>
    ...
  `);
});
 
const port = process.env.PORT || 80;
server.listen(port, () => {
  console.log(`Server running on port ${port}`);
});
EOF

Améliorations par rapport à AWS :

✅ HTML formatĂ© (plus joli qu'un simple texte)
✅ Affiche des infos systùme (hostname, uptime)
✅ CSS intĂ©grĂ© (gradient background)
✅ Plus professionnel

Modules utilisés :
→ http : Serveur HTTP
→ os : Informations systùme

Partie 5 : PM2 Process Manager 🚀 NOUVEAU !

npm install -g pm2
 
pm2 start /opt/sample-app/app.js --name sample-app
 
pm2 startup systemd -u root --hp /root
pm2 save

Qu’est-ce que PM2 ?

PM2 = Production Process Manager for Node.js

Avantages :
✅ RedĂ©marre l'app si crash
✅ DĂ©marre automatiquement au boot
✅ Load balancing (plusieurs instances)
✅ Logs centralisĂ©s
✅ Monitoring intĂ©grĂ©
✅ Zero-downtime reload

Différence avec AWS :
AWS User Data → "nohup node app.js &" (basique)
GCP Startup Script → PM2 (production-ready)

Commandes PM2 :

CommandeAction
pm2 start app.jsDĂ©marre l’app
pm2 stop appArrĂȘte l’app
pm2 restart appRedĂ©marre l’app
pm2 logsVoir les logs
pm2 listLister les apps
pm2 monitMonitoring temps réel
pm2 saveSauvegarder la config

Étape 2.4 : Lancement de l’Instance

Actions Finales :

1. ✅ VĂ©rifier tous les paramĂštres :
   - Name : sample-app-vm
   - Region : us-central1
   - Machine type : e2-micro
   - Boot disk : Ubuntu 22.04 LTS
   - Firewall : HTTP autorisé
   - Startup script : Collé

2. ✅ Faire dĂ©filer en bas de la page

3. 🚀 Cliquer sur "CREATE" (bouton bleu)

Timeline de Création :

00:00 - Clic sur CREATE
00:05 - GCP alloue les ressources
00:10 - VM démarre (boot Ubuntu)
00:20 - État : RUNNING ✅
00:30 - Startup Script commence
01:00 - Installation Node.js
01:30 - Installation PM2
02:00 - Application démarrée
02:30 - PrĂȘt Ă  tester ! ✅

Temps total : ~2-3 minutes


Page de Résultat :

✅ Message : "Instance created"

Informations Visibles :

InformationExempleUtilité
Namesample-app-vmIdentifiant
Zoneus-central1-aLocalisation
Internal IP10.128.0.2Réseau interne GCP
External IP34.122.45.67AccĂšs Internet
StatusRUNNINGÉtat

đŸ’» Partie 3 : Comprendre le Code

Architecture de l’Application sur GCP

┌─────────────────────────────────┐
│    Internet (Clients)           │
└────────────┬────────────────────┘
             │ HTTP Request
             ↓
┌────────────────────────────────────┐
│  GCP VPC Firewall Rules            │
│  default-allow-http (tag: http)    │
│  Ports: 80                         │
└────────────┬───────────────────────┘
             │ Traffic autorisĂ©
             ↓
┌────────────────────────────────────┐
│  Compute Engine VM                 │
│  Region: us-central1               │
│  Zone: us-central1-a               │
│                                    │
│  ┌──────────────────────────────┐  │
│  │  Ubuntu 22.04 LTS            │  │
│  │  ┌────────────────────────┐  │  │
│  │  │  Node.js 21.x          │  │  │
│  │  │  ┌──────────────────┐  │  │  │
│  │  │  │  PM2 Manager     │  │  │  │
│  │  │  │  ┌────────────┐  │  │  │  │
│  │  │  │  │  app.js    │  │  │  │  │
│  │  │  │  │  Port 80   │  │  │  │  │
│  │  │  │  └────────────┘  │  │  │  │
│  │  │  └──────────────────┘  │  │  │
│  │  └────────────────────────┘  │  │
│  └──────────────────────────────┘  │
│                                    │
│  Logs → Cloud Logging              │
└────────────┬───────────────────────┘
             │ HTTP Response
             │ HTML + CSS
             ↓
┌────────────────────────────────────┐
│   Navigateur (Client)              │
│   Affiche page stylisĂ©e            │
└────────────────────────────────────┘

Code Node.js Expliqué

Import des Modules

const http = require('http');
const os = require('os');

Module os (Operating System) :

os.hostname()  // Nom de la machine (ex: sample-app-vm)
os.platform()  // SystĂšme d'exploitation (ex: linux)
os.uptime()    // Temps depuis démarrage OS
os.cpus()      // Informations CPUs
os.totalmem()  // RAM totale
os.freemem()   // RAM disponible

Création du Serveur avec Infos SystÚme

const server = http.createServer((req, res) => {
  const hostname = os.hostname();
  const platform = os.platform();
  const uptime = process.uptime();
  
  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.end(`...HTML...`);
});

Différences avec version AWS :

AspectAWS VersionGCP Version
Content-Typetext/plaintext/html
CorpsHello, World!\nPage HTML complĂšte
InfosAucuneHostname, Platform, Uptime
StylingNonCSS avec gradient
ProfessionalismeBasiqueProduction-ready

Template Literals Avancés

res.end(`
  <!DOCTYPE html>
  <html>
  <head>
    <title>Hello from GCP!</title>
    <style>
      body {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
      }
    </style>
  </head>
  <body>
    <h1>Hello from Google Cloud Platform!</h1>
    <p>Hostname: <code>${hostname}</code></p>
    <p>Uptime: <code>${uptime.toFixed(2)}s</code></p>
  </body>
  </html>
`);

Fonctionnalités :

Template Literals :
→ Backticks `...` (pas quotes '...')
→ Multiligne sans concatĂ©nation
→ Interpolation ${variable}
→ Expressions ${expr.method()}

CSS Inline :
→ Linear gradient background
→ Responsive (max-width)
→ Glass morphism effect (backdrop-filter)
→ Professional look

Gestion de Processus avec PM2

Pourquoi PM2 est Crucial

Sans PM2 (approche AWS basique) :

ProblĂšmes :
❌ App crash → Downtime complet
❌ RedĂ©marrage VM → App ne redĂ©marre pas
❌ Pas de logs persistants
❌ Pas de monitoring
❌ Pas de load balancing

Exemple de crash :
→ Exception non gĂ©rĂ©e
→ MĂ©moire insuffisante
→ Bug dans le code
→ App s'arrĂȘte → Site down ❌

Avec PM2 (approche GCP de ce tuto) :

Avantages :
✅ Crash → RedĂ©marrage automatique (0.1s)
✅ RedĂ©marrage VM → App redĂ©marre auto
✅ Logs sauvegardĂ©s dans /root/.pm2/logs/
✅ Monitoring : pm2 monit
✅ Cluster mode : pm2 start -i max (multi-CPU)

Exemple de crash :
→ Exception non gĂ©rĂ©e
→ PM2 dĂ©tecte le crash
→ RedĂ©marre l'app en 100ms
→ Site reste up ✅

Cycle de Vie d’une App avec PM2

1. Démarrage
   pm2 start app.js
   ↓
2. App Running
   PM2 surveille le processus
   ↓
3. Crash détecté
   App s'est arrĂȘtĂ©e
   ↓
4. Redémarrage Auto
   PM2 relance l'app (< 1s)
   ↓
5. Back to Running
   App disponible Ă  nouveau

VM Reboot :
1. Systemd démarre
2. Systemd lance PM2
3. PM2 lit la config sauvegardée
4. PM2 relance toutes les apps
5. Apps disponibles ✅

Commandes PM2 Utiles

Gestion de Base :

# Lister les applications
pm2 list
 
# Voir les logs en temps réel
pm2 logs
 
# Logs d'une app spécifique
pm2 logs sample-app
 
# Monitoring en temps réel
pm2 monit
 
# Redémarrer une app
pm2 restart sample-app
 
# ArrĂȘter une app
pm2 stop sample-app
 
# Supprimer une app de PM2
pm2 delete sample-app

Cluster Mode (Load Balancing) :

# Démarrer en mode cluster (autant d'instances que de CPUs)
pm2 start app.js -i max
 
# Ou nombre spécifique
pm2 start app.js -i 4
 
# Recharger sans downtime
pm2 reload sample-app

Configuration Avancée :

# Créer fichier ecosystem.config.js
cat > ecosystem.config.js << 'EOF'
module.exports = {
  apps: [{
    name: 'sample-app',
    script: '/opt/sample-app/app.js',
    instances: 2,
    exec_mode: 'cluster',
    watch: true,
    max_memory_restart: '300M',
    env: {
      NODE_ENV: 'production',
      PORT: 80
    }
  }]
};
EOF
 
# Démarrer avec config
pm2 start ecosystem.config.js

Comparaison : Startup Script vs User Data

AspectGCP Startup ScriptAWS User Data
ExĂ©cutionÀ chaque bootPremier boot uniquement
StockageInstance metadataInstance metadata
ModificationPossible sans recréer VMNécessite recréer instance
LogsCloud Logging autoNécessite config
Taille max256 KB16 KB
FormatBash, Python, etc.Bash, PowerShell

✅ Partie 4 : Test & VĂ©rification

Étape 4.1 : Observer le DĂ©marrage

Page VM Instances

Compute Engine → VM instances

Vous devriez voir :

ColonneValeurSignification
Namesample-app-vmVotre VM
Zoneus-central1-aLocalisation
Internal IP10.128.0.2IP privée GCP
External IP34.122.45.67IP publique Internet
ConnectSSHBouton de connexion

États de la VM

Progression :
⏳ PROVISIONING → Allocation des ressources
⏳ STAGING → PrĂ©paration
🟱 RUNNING → VM active ✅

Autres états possibles :
🔮 STOPPING → En arrĂȘt
âč TERMINATED → ArrĂȘtĂ©e
🔄 SUSPENDING → Suspension en cours

Étape 4.2 : RĂ©cupĂ©rer l’IP Publique

Option 1 : Via l’Interface

VM instances → Colonne "External IP"
Exemple : 34.122.45.67

Option 2 : Via Cloud Shell

# Ouvrir Cloud Shell (icĂŽne >_ en haut)
 
# Lister les instances
gcloud compute instances list
 
# Obtenir l'IP externe
gcloud compute instances describe sample-app-vm \
  --zone=us-central1-a \
  --format='get(networkInterfaces[0].accessConfigs[0].natIP)'

Étape 4.3 : VĂ©rifier les Logs de DĂ©marrage

Via l’Interface :

1. VM instances
2. Cliquer sur "sample-app-vm"
3. Onglet "Logs" (ou "OBSERVABILITY" → "Logs")
4. Chercher : "startup-script"

Vous devriez voir :

Starting Startup Script
Updating system packages...
Installing Node.js...
Node.js version: v21.x.x
Installing PM2...
Starting application with PM2...
Startup Script Completed Successfully!

Via Cloud Shell (SSH) :

# Se connecter Ă  la VM
gcloud compute ssh sample-app-vm --zone=us-central1-a
 
# Voir les logs du startup script
sudo cat /var/log/startup-script.log
 
# Vérifier le statut PM2
sudo pm2 list
 
# Voir les logs de l'app
sudo pm2 logs sample-app
 
# Quitter SSH
exit

Étape 4.4 : Tester l’Application

Dans votre Navigateur

1. Copier l'IP externe : 34.122.45.67
2. Ouvrir navigateur
3. Taper : http://34.122.45.67
   
⚠ Important : http:// (pas https://)

4. Appuyer sur Entrée

🎉 RĂ©sultat Attendu

Vous devriez voir une page stylisée avec :

🎉 Hello from Google Cloud Platform!

✅ Your Node.js app is running successfully on GCP Compute Engine

────────────────────────────────────

Hostname: sample-app-vm
Platform: linux
App Uptime: 123.45s
Node.js: v21.x.x

────────────────────────────────────

Deployed by: samba-diallo | Tutorial: GCP Compute Engine Deployment

Design :

✅ Fond avec gradient violet/bleu
✅ Conteneur avec effet glass morphism
✅ Informations systùme dynamiques
✅ Aspect professionnel

FÉLICITATIONS ! 🎊

✅ Application dĂ©ployĂ©e sur GCP !
✅ VM accessible sur Internet
✅ PM2 gùre votre app
✅ Logs centralisĂ©s
✅ Production-ready setup !

Étape 4.5 : Tests AvancĂ©s

Test 1 : RafraĂźchissement Multiple

Action :
→ Appuyer sur F5 plusieurs fois dans le navigateur

Observation :
→ "App Uptime" augmente à chaque refresh
→ Hostname reste le mĂȘme
→ RĂ©ponse rapide (< 100ms)

Conclusion :
✅ App stable
✅ PM2 maintient le processus
✅ Pas de restart intempestif

Test 2 : Vérifier PM2 Status

# SSH dans la VM
gcloud compute ssh sample-app-vm --zone=us-central1-a
 
# Statut PM2
sudo pm2 status
 
# Résultat attendu :
┌─────┬──────────────┬─────────────┬─────────┬─────────┬──────────┐
│ id  │ name         │ mode        │ â†ș       │ status  │ cpu      │
├─────┌──────────────┌─────────────┌─────────┌─────────┌───────────
│ 0   │ sample-app   │ fork        │ 0       │ online  │ 0%       │
└─────┮──────────────┮─────────────┮─────────┮─────────┮──────────┘
 
# Monitoring temps réel
sudo pm2 monit
 
# Quitter : Ctrl+C puis exit

Test 3 : Vérifier les RÚgles de Firewall

Via Interface :

1. Navigation Menu (☰)
2. VPC network → Firewall
3. Chercher : "default-allow-http"
4. Vérifier :
ParamĂštreValeur
TargetsSpecified target tags: http-server
Source filterIP ranges: 0.0.0.0/0
Protocols / portstcp:80
Action on matchAllow

Via Cloud Shell :

gcloud compute firewall-rules list --filter="name:default-allow-http"

đŸ‹ïž Exercices Pratiques

Exercice 1 : Test de Crash Recovery

Objectif

Démontrer la résilience de PM2 en cas de crash applicatif.


Actions

1. Se Connecter Ă  la VM

gcloud compute ssh sample-app-vm --zone=us-central1-a

2. Modifier l’App pour Crasher

# Créer une version qui crash
sudo cat > /opt/sample-app/crash-app.js << 'EOF'
const http = require('http');
 
const server = http.createServer((req, res) => {
  if (req.url === '/crash') {
    // Crash intentionnel
    throw new Error('Intentional crash!');
  }
  
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello! Visit /crash to crash the app\n');
});
 
server.listen(80, () => {
  console.log('Crash test server running on port 80');
});
EOF
 
# Remplacer l'app par la version crash
sudo pm2 stop sample-app
sudo pm2 delete sample-app
sudo pm2 start /opt/sample-app/crash-app.js --name sample-app
sudo pm2 save

3. Tester le Crash

# Dans la VM
curl http://localhost/crash
 
# Ou dans votre navigateur
http://VOTRE_IP/crash

4. Observer le Comportement

# Voir les logs PM2
sudo pm2 logs
 
# Vous devriez voir :
# Error: Intentional crash!
# PM2: App [sample-app] will restart in 100ms
 
# Statut PM2
sudo pm2 status
 
# Colonne "â†ș" (restarts) devrait augmenter

Résultat Attendu

✅ App crash dĂ©tectĂ© par PM2
✅ RedĂ©marrage automatique en ~100ms
✅ App disponible à nouveau
✅ Compteur de restarts incrĂ©mentĂ©

Comparaison avec approche basique :
❌ Sans PM2 : App down dĂ©finitivement
✅ Avec PM2 : Downtime < 1 seconde

5. Restaurer l’App Originale

sudo pm2 stop sample-app
sudo pm2 delete sample-app
sudo pm2 start /opt/sample-app/app.js --name sample-app
sudo pm2 save
exit

Exercice 2 : Test de Redémarrage VM

Objectif

VĂ©rifier que l’application redĂ©marre automatiquement aprĂšs un reboot de la VM.


Actions

1. Redémarrer la VM

Via Interface :

VM instances
→ SĂ©lectionner sample-app-vm (checkbox)
→ Bouton "RESET" (en haut)
→ Confirmer

Via Cloud Shell :

gcloud compute instances reset sample-app-vm --zone=us-central1-a

2. Observer l’État

État : RUNNING → STOPPING → PROVISIONING → RUNNING
Temps : ~30-60 secondes

3. Attendre 2 Minutes

Laisser le temps au startup script de s'exécuter

4. Tester l’Application

Navigateur : http://VOTRE_IP

Question

L’application fonctionne-t-elle aprùs le reboot ?

💡 Cliquez pour voir la rĂ©ponse

RĂ©ponse : ✅ OUI !

Pourquoi ?

Différence GCP vs AWS :

AWS User Data :
❌ ExĂ©cution UNE SEULE FOIS (premier boot)
→ AprĂšs reboot : Script ne rĂ©exĂ©cute pas
→ App non redĂ©marrĂ©e automatiquement

GCP Startup Script :
✅ ExĂ©cution À CHAQUE BOOT
→ AprĂšs reboot : Script s'exĂ©cute Ă  nouveau
→ App redĂ©marrĂ©e automatiquement

En plus, avec PM2 :
✅ pm2 startup systemd configurĂ©
✅ PM2 dĂ©marre avant l'app
✅ PM2 lit la config sauvegardĂ©e (pm2 save)
✅ PM2 relance toutes les apps

Double sécurité :
1. Startup Script relance l'app
2. PM2 startup relance aussi l'app
→ RĂ©silience maximale !

Vérification

SSH dans la VM :

gcloud compute ssh sample-app-vm --zone=us-central1-a
 
# Vérifier uptime de la VM
uptime
# Output : up 2 minutes (VM a redémarré récemment)
 
# Vérifier PM2
sudo pm2 status
# App devrait ĂȘtre "online"
 
# Vérifier logs startup script
sudo cat /var/log/startup-script.log | tail -20
# Devrait montrer "Startup Script Completed Successfully!"
 
exit

Leçon Importante

GCP Startup Script > AWS User Data pour la résilience :

✅ Avantage GCP :
→ RĂ©exĂ©cution Ă  chaque boot
→ App toujours redĂ©marrĂ©e
→ Moins de configuration manuelle

⚠ ConsidĂ©ration :
→ Script doit ĂȘtre idempotent (peut s'exĂ©cuter plusieurs fois)
→ Attention aux installations multiples
→ Utiliser des checks (if not installed, then install)

Best Practice :
→ GCP : Startup Script + PM2
→ AWS : User Data + Systemd Service
→ Les deux : Container orchestration (Kubernetes)

Exercice 3 : Explorer Cloud Logging

Objectif

Comprendre les outils de monitoring GCP et comparer avec CloudWatch (AWS).


Actions

1. Accéder à Cloud Logging

Navigation Menu (☰)
→ Logging (ou "Operations" → "Logging")
→ Logs Explorer

2. Filtrer les Logs de la VM

Dans la barre de recherche :

resource.type="gce_instance"
resource.labels.instance_id="VOTRE_INSTANCE_ID"

OU simplement :

logName="projects/VOTRE_PROJECT/logs/syslog"

3. Voir les Logs du Startup Script

Filtre :

jsonPayload.message=~"startup-script"

OU

textPayload=~"Installing Node.js"

4. Créer une Metric Basée sur les Logs

1. Dans Logs Explorer, cliquer "Actions" → "Create metric"
2. Configuration :
   - Metric Type : Counter
   - Filter : textPayload=~"Startup Script Completed"
   - Name : startup_script_success
3. CREATE METRIC

Cloud Monitoring (Anciennement Stackdriver)

Accéder aux Métriques :

Navigation Menu (☰)
→ Monitoring (ou "Operations" → "Monitoring")
→ Metrics Explorer

Métriques Disponibles :

MétriqueCatégorieDescription
CPU utilizationVM Instance% utilisation CPU
Disk read bytesVM InstanceLecture disque (bytes/s)
Network bytes sentVM InstanceTrafic réseau sortant
Memory usageAgent requisRAM utilisée

Visualiser CPU :

1. Resource type : VM Instance
2. Metric : compute.googleapis.com/instance/cpu/utilization
3. Filter : instance_name = sample-app-vm
4. Aggregator : mean
5. Group by : instance_name
6. Time range : 1 hour

Créer un Dashboard

1. Monitoring → Dashboards → CREATE DASHBOARD
2. Name : "Sample App Monitoring"
3. ADD CHART
4. Configuration :
   - Title : CPU Utilization
   - Resource : VM Instance
   - Metric : CPU utilization
   - Filter : sample-app-vm
5. SAVE
6. Ajouter d'autres charts (Network, Disk, etc.)

Configurer une Alerte

1. Monitoring → Alerting → CREATE POLICY
2. Configuration :
ParamĂštreValeur
TargetVM Instance → CPU utilization
Filterinstance_name = sample-app-vm
ConditionCPU > 80% for 5 minutes
NotificationEmail : votre-email@gmail.com
3. SAVE

Comparaison GCP vs AWS

💡 Cliquez pour voir la comparaison
AspectGCP Cloud Logging/MonitoringAWS CloudWatch
LogsGratuit (50 GB/mois)Payant (5 GB gratuit)
Retention30 jours (configurable)Configurable (coût)
MétriquesGratuit (up to 150 MB/mois)10 métriques gratuit
InterfaceLogs Explorer (moderne)CloudWatch Insights (complexe)
RechercheBigQuery integrationCloudWatch Logs Insights
AlertesGratuites10 alarmes gratuites
DashboardsIllimité gratuit3 dashboards gratuits
AgentOptional (memory metrics)Optional (detailed metrics)

Forces de GCP

✅ Logs gratuits (50 GB/mois vs 5 GB AWS)
✅ Interface plus moderne et intuitive
✅ BigQuery pour analyse avancĂ©e
✅ Dashboards illimitĂ©s gratuits
✅ Trace et Debugger intĂ©grĂ©s

Exemple Pricing :
→ GCP : 50 GB logs/mois = GRATUIT
→ AWS : 50 GB logs/mois = ~$25/mois

Forces d’AWS

✅ Plus mature (lancĂ© 2009 vs 2014)
✅ Plus de mĂ©triques prĂȘtes Ă  l'emploi
✅ IntĂ©gration avec tous services AWS
✅ CloudWatch Contributor Insights
✅ Anomaly Detection natif

Exemple :
→ AWS : Lambda logs automatiques
→ GCP : Cloud Functions logs automatiques
→ Équivalent mais AWS plus de services

Utilisation Multi-Cloud

Stratégie :
→ GCP : Analytics (BigQuery), ML, Logs
→ AWS : Compute (EC2), Storage (S3), CDN
→ Logs envoyĂ©s vers Datadog/Splunk
→ MĂ©triques agrĂ©gĂ©es dans Grafana

Outils Tiers :
→ Datadog (monitoring multi-cloud)
→ New Relic (APM)
→ Grafana + Prometheus
→ ELK Stack (Elasticsearch, Logstash, Kibana)

🔧 DĂ©pannage

ProblĂšme 1 : Connection Timeout

SymptĂŽme

Erreur navigateur :
"Ce site est inaccessible"
"ERR_CONNECTION_TIMED_OUT"

Causes et Solutions

Cause 1 : RÚgle de Firewall Absente ⭐⭐⭐⭐⭐

Vérifier :

gcloud compute firewall-rules list --filter="targetTags:http-server"

Si vide ou pas de rĂšgle pour port 80 :

# Créer la rÚgle de firewall
gcloud compute firewall-rules create allow-http \
  --allow=tcp:80 \
  --source-ranges=0.0.0.0/0 \
  --target-tags=http-server \
  --description="Allow HTTP traffic"
 
# Ajouter le tag Ă  la VM
gcloud compute instances add-tags sample-app-vm \
  --zone=us-central1-a \
  --tags=http-server

Cause 2 : VM pas encore PrĂȘte ⭐⭐⭐

Solution :
→ Attendre 3-4 minutes aprĂšs crĂ©ation
→ VĂ©rifier status : gcloud compute instances list
→ Doit ĂȘtre RUNNING

Cause 3 : Startup Script a ÉchouĂ© ⭐⭐

Vérifier les logs :

# SSH dans la VM
gcloud compute ssh sample-app-vm --zone=us-central1-a
 
# Voir logs startup
sudo cat /var/log/startup-script.log
 
# Chercher erreurs
sudo cat /var/log/startup-script.log | grep -i error
 
# Vérifier PM2
sudo pm2 status
 
# Si app pas listĂ©e → Startup script a Ă©chouĂ©
# Relancer manuellement :
cd /opt/sample-app
sudo pm2 start app.js --name sample-app
sudo pm2 save
 
exit

**Cause 4 : Port 80 dĂ©jĂ