đ 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
đ Table des MatiĂšres
- Introduction
- Prérequis
- Partie 1 : Configuration GCP
- Partie 2 : Déploiement Compute Engine
- Partie 3 : Comprendre le Code
- Partie 4 : Test & Vérification
- Exercices Pratiques
- Dépannage
- Nettoyage
- GCP vs AWS : Comparaison
- Conclusion
- Ressources
đŻ 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
| Niveau | Requis |
|---|---|
| Essentiel | Utilisation dâun navigateur web |
| Recommandé | Notions de ligne de commande (bash/shell) |
| Utile | Bases de JavaScript/Node.js |
| Bonus | Connaissance dâAWS (pour comparaison) |
Outils Nécessaires
| Outil | Utilité | Téléchargement |
|---|---|---|
| Navigateur Web | AccÚs GCP Console | Chrome (recommandé), Firefox |
| Compte Google | Authentification | Gmail |
| Carte Bancaire | Vé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
| Information | Exemple | Requis |
|---|---|---|
| Pays | France | â |
| Type de compte | Individual (Particulier) | â |
| Carte bancaire | VISA/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Ă©ment | Description | Emplacement |
|---|---|---|
| Navigation Menu | â° Tous les services GCP | Haut gauche |
| Project Selector | Choisir/créer un projet | Haut (nom du projet) |
| Search Bar | Rechercher services/ressources | Haut centre |
| Cloud Shell | Terminal dans le navigateur | IcĂŽne >_ en haut |
| Notifications | Alertes et logs | IcĂŽ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 :
| Champ | Valeur | Exemple |
|---|---|---|
| Project name | Nom descriptif | sample-app-project |
| Project ID | Identifiant unique (généré auto) | sample-app-project-438201 |
| Organization | Laisser vide (pas dâorganisation) | - |
| Location | No 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 :
| Champ | Valeur |
|---|---|
| Service account name | sample-app-sa |
| Service account ID | sample-app-sa (auto-généré) |
| Description | Service 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Ăštre | Valeur |
|---|---|
| Name | Sample App Budget |
| Projects | Sélectionner votre projet |
| Budget amount | 10 USD |
| Alert threshold | 50%, 90%, 100% |
| Email notifications | Votre 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Ăštre | Valeur | Explication |
|---|---|---|
| Name | sample-app-vm | Identifiant de la VM |
| Labels | env=dev, app=sample | Organisation (optionnel) |
| Region | us-central1 | Iowa, USA (Free Tier) |
| Zone | us-central1-a | Zone 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 :
| Famille | Usage | Exemple |
|---|---|---|
| E2 | Usage général, économique | e2-micro, e2-small |
| N2 | Balanced, haute performance | n2-standard-2 |
| C2 | Compute-optimized | c2-standard-4 |
| M2 | Memory-optimized | m2-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 :
| Type | vCPU | RAM | Coût/mois | Free Tier |
|---|---|---|---|---|
| e2-micro | 2 | 1 GB | $6.11 | â |
| e2-small | 2 | 2 GB | $12.22 | â |
| e2-medium | 2 | 4 GB | $24.44 | â |
| e2-standard-2 | 2 | 8 GB | $48.88 | â |
3ïžâŁ Boot Disk (Disque de DĂ©marrage)
Cliquer sur âCHANGEâ (Modifier)
| ParamĂštre | Valeur |
|---|---|
| Operating System | Ubuntu |
| Version | Ubuntu 22.04 LTS (Jammy Jellyfish) |
| Boot disk type | Standard persistent disk |
| Size | 10 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 :
| Ligne | Signification |
|---|---|
#!/bin/bash | Exécute avec Bash |
set -e | ArrĂȘte si erreur |
exec > >(tee ...) | Redirige sortie vers fichier + écran |
exec 2>&1 | Redirige 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 -yPourquoi ?
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 :
| Aspect | AWS (Amazon Linux) | GCP (Ubuntu) |
|---|---|---|
| Gestionnaire | yum | apt-get |
| Repo Node.js | rpm.nodesource.com | deb.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}`);
});
EOFAmé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 saveQuâ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 :
| Commande | Action |
|---|---|
pm2 start app.js | DĂ©marre lâapp |
pm2 stop app | ArrĂȘte lâapp |
pm2 restart app | RedĂ©marre lâapp |
pm2 logs | Voir les logs |
pm2 list | Lister les apps |
pm2 monit | Monitoring temps réel |
pm2 save | Sauvegarder 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 :
| Information | Exemple | Utilité |
|---|---|---|
| Name | sample-app-vm | Identifiant |
| Zone | us-central1-a | Localisation |
| Internal IP | 10.128.0.2 | Réseau interne GCP |
| External IP | 34.122.45.67 | AccĂšs Internet |
| Status | RUNNING | Ă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 disponibleCré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 :
| Aspect | AWS Version | GCP Version |
|---|---|---|
| Content-Type | text/plain | text/html |
| Corps | Hello, World!\n | Page HTML complĂšte |
| Infos | Aucune | Hostname, Platform, Uptime |
| Styling | Non | CSS avec gradient |
| Professionalisme | Basique | Production-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-appCluster 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-appConfiguration 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.jsComparaison : Startup Script vs User Data
| Aspect | GCP Startup Script | AWS User Data |
|---|---|---|
| Exécution | à chaque boot | Premier boot uniquement |
| Stockage | Instance metadata | Instance metadata |
| Modification | Possible sans recréer VM | Nécessite recréer instance |
| Logs | Cloud Logging auto | Nécessite config |
| Taille max | 256 KB | 16 KB |
| Format | Bash, 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 :
| Colonne | Valeur | Signification |
|---|---|---|
| Name | sample-app-vm | Votre VM |
| Zone | us-central1-a | Localisation |
| Internal IP | 10.128.0.2 | IP privée GCP |
| External IP | 34.122.45.67 | IP publique Internet |
| Connect | SSH | Bouton 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 exitTest 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Ăštre | Valeur |
|---|---|
| Targets | Specified target tags: http-server |
| Source filter | IP ranges: 0.0.0.0/0 |
| Protocols / ports | tcp:80 |
| Action on match | Allow |
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-a2. 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 save3. Tester le Crash
# Dans la VM
curl http://localhost/crash
# Ou dans votre navigateur
http://VOTRE_IP/crash4. 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 augmenterRĂ©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
exitExercice 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-a2. 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!"
exitLeç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étrique | Catégorie | Description |
|---|---|---|
| CPU utilization | VM Instance | % utilisation CPU |
| Disk read bytes | VM Instance | Lecture disque (bytes/s) |
| Network bytes sent | VM Instance | Trafic réseau sortant |
| Memory usage | Agent requis | RAM 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Ăštre | Valeur |
|---|---|
| Target | VM Instance â CPU utilization |
| Filter | instance_name = sample-app-vm |
| Condition | CPU > 80% for 5 minutes |
| Notification | Email : votre-email@gmail.com |
3. SAVE
Comparaison GCP vs AWS
đĄ Cliquez pour voir la comparaison
| Aspect | GCP Cloud Logging/Monitoring | AWS CloudWatch |
|---|---|---|
| Logs | Gratuit (50 GB/mois) | Payant (5 GB gratuit) |
| Retention | 30 jours (configurable) | Configurable (coût) |
| Métriques | Gratuit (up to 150 MB/mois) | 10 métriques gratuit |
| Interface | Logs Explorer (moderne) | CloudWatch Insights (complexe) |
| Recherche | BigQuery integration | CloudWatch Logs Insights |
| Alertes | Gratuites | 10 alarmes gratuites |
| Dashboards | Illimité gratuit | 3 dashboards gratuits |
| Agent | Optional (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-serverCause 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Ă