⚙️DevOps – Terraform, State, GitLab CI/CD & Gestion d'incidents (Part 3)
Guide pratique IDEO‑Lab pour nouveaux DevOps : infrastructure as code, modules, state, pipelines, déploiement contrôlé et production.
Debug pipeline
Diagnostiquer un pipeline GitLab qui bloque, echoue ou se comporte mal.
debugrunnerlogsStratégies de déploiement
Rolling, blue/green, canary, maintenance page et rollback applicatif.
rollingcanaryblue-greenCapacité & performance
CPU, RAM, disque, connexions, queues, saturation et seuils d'alerte.
capacityperfsaturationIncidents base de données
Connexions, locks, lenteurs, disque plein, backups et restauration.
DBlocksbackupIncidents réseau
DNS, TLS, Nginx, firewall, load balancer, routes et ports.
DNSTLSNginxIAM approfondi
Roles, policies, assume-role, separation des privileges et break-glass.
IAMrolesleast-privilegeSupply chain CI/CD
Images Docker, dépendances, runners, artifacts et provenance.
supply-chainimagesartifactsKubernetes pour DevOps
Concepts utiles même si le poste est surtout Terraform/GitLab.
K8spodshelmLinux hardening
Systemd, utilisateurs, SSH, firewall, logs, permissions et mises à jour.
LinuxSSHsystemdFormer les nouveaux DevOps
Progression, exercices, erreurs volontaires, revues et rituels d'equipe.
trainingjuniorteamGlossaire avancé
Les termes que les nouveaux DevOps rencontrent tous les jours.
glossaryvocabopsAnnexes pratiques
Plans de formation, matrices de risques, procédures go/no-go et modèles opérationnels.
AnnexesRiskOpsDéboguer un pipeline GitLab : lire une exécution comme une enquête
Un pipeline GitLab qui échoue ne doit pas être corrigé au hasard. Il faut lire le job comme un journal d’exécution : image Docker, runner utilisé, variables disponibles, dossier courant, before_script, commandes lancées, artifacts produits, credentials utilisés et message d’erreur exact.
La plupart des pannes CI/CD infra viennent de problèmes simples mais cachés : runner indisponible, tags incompatibles, variable protégée inaccessible, mauvais répertoire, mauvais environnement, artifact absent, state lock Terraform, droits cloud insuffisants, ou différence entre le contexte local et le contexte CI.
Les grandes familles de pannes
| Famille | Symptôme | Cause probable |
|---|---|---|
| Runner | Job bloqué en pending. | Runner indisponible, tags incorrects, runner non protégé. |
| Variables | Credentials absents ou vides. | Variable protected/scoped inaccessible. |
| Chemins | cd: no such file, artifact absent. | Mauvais TF_ROOT, paths relatifs incorrects. |
| Terraform init | Backend inaccessible. | Credentials, bucket, state key, réseau, IAM. |
| Terraform plan | Erreur provider, variable manquante. | Provider lock, tfvars, droits cloud, version. |
| Terraform apply | Lock, drift, plan expiré. | Apply concurrent, artifact perdu, state lock. |
Flux de diagnostic global
Pipeline échoué
│
▼
Identifier le job exact
│
├── stage
├── runner
├── branch
├── environment
└── commit
│
▼
Lire les logs depuis le début
│
├── image utilisée
├── before_script
├── dossier courant
├── variables présentes
├── terraform version
└── erreur exacte
│
▼
Classer la panne
├── runner
├── variables
├── paths/artifacts
├── credentials/IAM
├── terraform state
└── provider/cloud
│
▼
Corriger minimalement
│
▼
Relancer uniquement le job utileRègles de sécurité pendant debug
| Règle | Pourquoi |
|---|---|
| Ne jamais afficher les secrets | Les logs CI sont persistants et partagés. |
| Ne pas relancer apply à l’aveugle | Risque d’appliquer un plan obsolète. |
Ne pas faire force-unlock sans preuve | Peut casser un apply encore actif. |
| Isoler le job défaillant | Évite de modifier trop de choses en même temps. |
| Documenter la cause | Transforme le bug CI en amélioration durable. |
Méthode terrain : diagnostic en 9 étapes
Procédure standard
| Étape | Action | Résultat attendu |
|---|---|---|
| 1 | Identifier le pipeline, le job, le commit et la branche. | Contexte exact connu. |
| 2 | Lire le log depuis le début, pas seulement la dernière ligne. | Erreur replacée dans son contexte. |
| 3 | Identifier image, runner, tags et environnement. | Exécution CI comprise. |
| 4 | Vérifier dossier courant et chemins utilisés. | Moins d’erreurs de path/artifacts. |
| 5 | Vérifier présence des variables sans afficher leur valeur. | Secrets protégés. |
| 6 | Comparer local vs CI : versions, tfvars, backend, provider. | Différences identifiées. |
| 7 | Classer la panne : runner, variable, state, provider, cloud. | Hypothèse principale claire. |
| 8 | Corriger minimalement. | Pas de refactor inutile pendant incident CI. |
| 9 | Relancer le job nécessaire et documenter. | Résolution traçable. |
Arbre de décision rapide
Job failed ou pending
│
▼
Job pending ?
│
├── Oui
│ ├── runner actif ?
│ ├── tags corrects ?
│ ├── runner protégé ?
│ └── quota/concurrency ?
│
└── Non
│
▼
Erreur avant script ?
│
├── image introuvable
├── pull denied
└── runner/executor
│
▼
Erreur dans script ?
│
├── path
├── variable
├── terraform init
├── terraform plan
├── artifact
└── cloud/IAMCommandes de debug sûres
echo "Branch: $CI_COMMIT_BRANCH"
echo "Pipeline source: $CI_PIPELINE_SOURCE"
echo "Environment: $CI_ENVIRONMENT_NAME"
echo "Terraform root: $TF_ROOT"
pwd
ls -la
terraform --version
# Vérifier présence sans exposer
if [ -z "$AWS_ACCESS_KEY_ID" ]; then
echo "AWS_ACCESS_KEY_ID is missing"
else
echo "AWS_ACCESS_KEY_ID is present"
fienv, printenv, set -x, echo $SECRET dans un job qui manipule des credentials.Runner GitLab : jobs pending, tags, executor et disponibilité
Un pipeline peut être correct mais rester bloqué si aucun runner compatible n’est disponible. Le runner est l’agent d’exécution : tags, protection, executor, accès réseau et capacité sont critiques.
Symptômes runner
| Symptôme | Cause probable | Correction |
|---|---|---|
| Job pending | Aucun runner avec les tags demandés. | Corriger tags job ou runner. |
| Runner offline | Service runner arrêté ou serveur KO. | Vérifier service et logs runner. |
| Job bloqué sur protected branch | Runner non protégé. | Utiliser runner protégé. |
| Image pull failed | Registry inaccessible ou credentials absents. | Vérifier registry auth. |
| Timeout | Job trop long ou runner saturé. | Optimiser job ou timeout/concurrency. |
Commandes runner
# Vérifier runners
gitlab-runner verify
gitlab-runner list
# Service runner
systemctl status gitlab-runner --no-pager
journalctl -u gitlab-runner -n 100 --no-pager
journalctl -u gitlab-runner -f
# Ressources machine runner
uptime
free -h
df -h
topTags runner : exemple
terraform_plan_prod:
stage: plan
tags:
- protected
- terraform
- prod
script:
- terraform plan -out=tfplanMatrice runner
| Runner | Usage | Protection |
|---|---|---|
| shared | Tests simples, lint, docs. | Pas de secrets prod. |
| terraform-dev | Plan/apply dev. | Variables dev uniquement. |
| terraform-staging | Plan/apply staging. | Runner contrôlé. |
| terraform-prod | Plan/apply production. | Runner protégé, accès limité, audit. |
Diagramme runner
Job GitLab
│
├── tags demandés
├── branche protégée ?
├── environnement ?
└── secrets nécessaires ?
│
▼
Runner compatible
├── online
├── protected si prod
├── executor OK
├── réseau OK
└── ressources suffisantesVariables GitLab : protected, masked, scoped et absentes
Beaucoup de jobs échouent parce qu’une variable existe dans GitLab mais n’est pas disponible dans le contexte du job : branche non protégée, environnement différent, scope mal configuré, variable définie au mauvais niveau ou nom incorrect.
Causes fréquentes
| Symptôme | Cause probable | Diagnostic sûr |
|---|---|---|
| Variable vide | Variable protected sur branche non protégée. | Afficher présence, pas valeur. |
| Auth cloud failed | Credential absent ou scope incorrect. | Vérifier branch/env scope. |
| Backend inaccessible | Secret state backend manquant. | Contrôler variables backend. |
| Job local OK, CI KO | Différence de tfvars ou variables CI. | Comparer variables non sensibles. |
| Secret visible dans logs | Variable non masked ou debug dangereux. | Corriger variable + nettoyer logs si possible. |
Debug sécurisé
check_var() {
local name="$1"
local value="${!name:-}"
if [ -z "$value" ]; then
echo "$name is missing"
return 1
fi
echo "$name is present"
}
check_var "AWS_ACCESS_KEY_ID"
check_var "AWS_SECRET_ACCESS_KEY"
check_var "TF_VAR_environment"Scoping recommandé
| Variable | Protected | Scope | Usage |
|---|---|---|---|
| DEV credentials | Selon politique | development | Plan/apply dev. |
| STAGING credentials | Oui si release protégée | staging | Plan/apply staging. |
| PROD credentials | Oui | production | Plan/apply prod uniquement. |
| INFRACOST_API_KEY | Oui | MR ou projet | Estimation coût. |
Variables utiles à afficher
echo "CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH"
echo "CI_PIPELINE_SOURCE=$CI_PIPELINE_SOURCE"
echo "CI_ENVIRONMENT_NAME=$CI_ENVIRONMENT_NAME"
echo "TF_ROOT=$TF_ROOT"
echo "TF_WORKSPACE=${TF_WORKSPACE:-not-set}"À ne pas faire
# Bad examples
env
printenv
set -x
echo "$AWS_SECRET_ACCESS_KEY"
echo "$TF_VAR_db_password"Chemins, working directory, includes et artifacts
Les erreurs de chemins sont très fréquentes en GitLab CI : le job ne s’exécute pas dans le dossier attendu, l’artifact est généré ailleurs, ou TF_ROOT pointe vers un chemin différent entre dev, staging et prod.
Symptômes courants
| Erreur | Cause probable | Correction |
|---|---|---|
cd: no such file | TF_ROOT incorrect. | Afficher pwd, ls, corriger chemin. |
| Artifact absent | Path artifact relatif au mauvais dossier. | Aligner paths et working directory. |
tfplan introuvable | Apply ne récupère pas l’artifact du plan. | Ajouter dependencies ou needs. |
| Include non chargé | Chemin include incorrect ou rules non déclenchées. | Vérifier YAML final et règles. |
| Plan OK, apply KO | Apply lancé dans un autre dossier. | Standardiser TF_ROOT. |
Debug chemins
echo "TF_ROOT=$TF_ROOT"
pwd
ls -la
find . -maxdepth 3 -type f | sort | head -100
cd "$TF_ROOT"
pwd
ls -laArtifacts Terraform propres
terraform_plan:
stage: plan
script:
- cd "$TF_ROOT"
- terraform plan -out=tfplan
- terraform show -no-color tfplan > plan.txt
artifacts:
paths:
- "$TF_ROOT/tfplan"
- "$TF_ROOT/plan.txt"
expire_in: 3 days
terraform_apply:
stage: apply
dependencies:
- terraform_plan
script:
- cd "$TF_ROOT"
- terraform apply tfplan
when: manualPlan vs apply
plan job
│
├── cd $TF_ROOT
├── terraform plan -out=tfplan
└── artifact: $TF_ROOT/tfplan
│
▼
apply job
│
├── récupère artifact
├── cd même $TF_ROOT
└── terraform apply tfplanTF_ROOT entre plan et apply, et conserver le plan exact en artifact.Debug Terraform dans GitLab CI
Les erreurs Terraform en CI peuvent venir de la configuration, du backend, des credentials, des variables, du provider lock, de la version Terraform ou du cloud provider.
Diagnostic par commande
| Commande | Ce qu’elle valide |
|---|---|
terraform --version | Version Terraform réellement utilisée par CI. |
terraform init | Backend, providers, modules, credentials. |
terraform validate | Syntaxe et cohérence configuration. |
terraform providers | Providers utilisés et provenance. |
terraform plan | Droits cloud, variables, drift, diff réel. |
terraform state list | Accès au state et ressources connues. |
Bloc CI robuste
before_script:
- echo "TF_ROOT=$TF_ROOT"
- cd "$TF_ROOT"
- terraform --version
- terraform init -input=false
terraform_validate:
stage: validate
script:
- terraform fmt -check -recursive
- terraform validate
terraform_plan:
stage: plan
script:
- terraform plan -input=false -out=tfplan
- terraform show -no-color tfplan > plan.txtErreurs Terraform fréquentes
| Message / symptôme | Cause probable | Action |
|---|---|---|
| Provider not found | Provider mal déclaré ou lock obsolète. | Corriger required_providers, relancer init. |
| Backend init failed | Bucket/state inaccessible. | Vérifier credentials, région, key, IAM. |
| Variable not set | tfvars absent ou variable CI manquante. | Corriger tfvars ou TF_VAR_*. |
| Access denied | IAM insuffisant. | Identifier API refusée, ajuster rôle minimalement. |
| Inconsistent lock file | .terraform.lock.hcl pas aligné. | Mettre à jour lock file et committer. |
| Plan asks destroy unexpectedly | Mauvais state/env ou drift. | Stop, vérifier backend et variables. |
Comparaison local / CI
# À comparer entre local et CI
terraform --version
terraform providers
terraform workspace show
echo "$TF_ROOT"
echo "$TF_VAR_environment"
terraform plan -var-file="staging.tfvars"State lock, apply concurrent et plan obsolète
Les problèmes de state sont sensibles. Un lock Terraform protège contre les applies concurrents. Le déverrouiller sans preuve peut corrompre une opération en cours ou créer un état incohérent.
Symptômes state / lock
| Symptôme | Cause probable | Réflexe |
|---|---|---|
| State lock actif | Apply en cours ou job mort. | Identifier détenteur du lock. |
| Plan expiré | State changé entre plan et apply. | Relancer plan. |
| Apply concurrent | Deux jobs sur même state. | Bloquer concurrence CI. |
| Diff incohérent | Mauvais backend ou workspace. | Vérifier state key/env. |
| Resource already exists | Ressource créée hors state. | Import ou correction code/state. |
Commandes state utiles
terraform state list
terraform state show RESOURCE
terraform plan -refresh-only
terraform state pull > state-backup.json
# Dangereux : seulement après preuve que le lock est orphelin
terraform force-unlock LOCK_IDforce-unlock tant qu’un job apply pourrait encore être vivant.Procédure lock Terraform
Lock détecté
│
▼
Identifier lock info
├── ID
├── user
├── operation
├── created time
└── state path
│
▼
Chercher job actif
├── GitLab pipeline running ?
├── apply en cours ?
├── runner encore actif ?
└── logs récents ?
│
▼
Décision
├── job actif : attendre
├── job échoué : vérifier état
└── lock orphelin prouvé : force-unlock
│
▼
Relancer terraform planPrévention en CI
| Mesure | Effet |
|---|---|
| Resource group GitLab | Sérialiser les jobs par environnement. |
| Apply manuel | Éviter applies automatiques concurrents. |
| State séparé par env | Réduire blast radius. |
| Timeout cohérent | Éviter jobs zombies trop longs. |
| Plan relancé avant apply sensible | Éviter plan obsolète. |
Exemple GitLab resource group
terraform_apply_prod:
stage: apply
resource_group: terraform-prod
script:
- terraform apply tfplan
when: manualLogs utiles : quoi lire et quoi ajouter
Un bon log de pipeline doit aider à comprendre le contexte sans exposer de secret. Il doit afficher les informations non sensibles : branche, source du pipeline, environnement, dossier, versions, job, runner et chemins.
Logs utiles à ajouter
echo "Job: $CI_JOB_NAME"
echo "Stage: $CI_JOB_STAGE"
echo "Branch: $CI_COMMIT_BRANCH"
echo "Pipeline source: $CI_PIPELINE_SOURCE"
echo "Environment: ${CI_ENVIRONMENT_NAME:-not-set}"
echo "TF_ROOT: $TF_ROOT"
echo "Working directory:"
pwd
echo "Terraform version:"
terraform --versionDebug contrôlé des fichiers
echo "Repository files:"
find . -maxdepth 2 -type f | sort
echo "Terraform root files:"
cd "$TF_ROOT"
ls -la
find . -maxdepth 2 -type f | sortÀ ne pas logger
| À éviter | Pourquoi | Alternative |
|---|---|---|
env | Affiche potentiellement tous les secrets. | Afficher variables non sensibles une par une. |
printenv | Risque de fuite massive. | Fonction check_var. |
set -x | Trace commandes avec valeurs substituées. | Logs explicites contrôlés. |
cat *.tfvars | Peut contenir secrets ou configs sensibles. | Valider présence du fichier seulement. |
terraform output brut | Peut afficher outputs sensibles mal déclarés. | Afficher outputs non sensibles ciblés. |
Template de log de diagnostic
debug_context:
script:
- echo "Job=$CI_JOB_NAME"
- echo "Branch=$CI_COMMIT_BRANCH"
- echo "Source=$CI_PIPELINE_SOURCE"
- echo "Env=${CI_ENVIRONMENT_NAME:-not-set}"
- echo "TF_ROOT=$TF_ROOT"
- pwd
- test -d "$TF_ROOT" || exit 1
- cd "$TF_ROOT"
- terraform --version
- terraform validateDebug pipeline production : prudence renforcée
Un pipeline production qui échoue ne doit pas être traité comme un simple bug CI. Il peut révéler un problème de state, un drift, une erreur de droits, un lock actif, un plan dangereux ou une protection GitLab mal configurée.
Procédure production
| Étape | Action | But |
|---|---|---|
| 1 | Stopper les relances automatiques. | Éviter effet boule de neige. |
| 2 | Identifier si l’échec est plan ou apply. | Évaluer impact réel. |
| 3 | Vérifier state lock et jobs concurrents. | Éviter corruption state. |
| 4 | Relire le plan artifact. | Vérifier destroy/replace inattendus. |
| 5 | Vérifier credentials et environnement. | Éviter mauvais compte/région/state. |
| 6 | Corriger minimalement. | Limiter le changement pendant incident CI. |
| 7 | Relancer plan avant apply. | Éviter plan obsolète. |
Cas production typiques
| Cas | Risque | Réaction |
|---|---|---|
| Apply échoue à mi-parcours | Infrastructure partiellement modifiée. | Relancer plan avant action. |
| State lock persistant | Apply encore actif ou lock orphelin. | Identifier détenteur du lock. |
| Access denied en prod | Rôle CI trop faible ou mauvais rôle. | Corriger IAM minimalement. |
| Plan destroy inattendu | Mauvais state/env ou drift critique. | Stop, investigation senior. |
| Runner prod offline | Impossible de déployer/rollback. | Activer runner de secours validé. |
Diagramme production
Pipeline prod failed
│
▼
Plan ou apply ?
│
├── Plan failed
│ ├── variables
│ ├── backend
│ ├── provider
│ └── IAM read
│
└── Apply failed
├── vérifier état partiel
├── relancer plan
├── vérifier lock
├── surveiller prod
└── décider rollback/mitigationAnti-patterns du debug pipeline
| Anti-pattern | Pourquoi c’est dangereux | Correction professionnelle |
|---|---|---|
| Relancer sans lire les logs | Peut masquer une cause réelle ou aggraver. | Lire le log depuis le début. |
| Afficher toutes les variables | Fuite de secrets dans les logs. | Vérifier présence sans afficher valeur. |
| Modifier plusieurs choses à la fois | Impossible d’identifier la vraie correction. | Correction minimale et ciblée. |
force-unlock réflexe | Peut casser un apply actif. | Identifier le détenteur du lock. |
| Ignorer les différences local/CI | Le bug revient en pipeline. | Comparer versions, variables, paths, runner. |
| Appliquer un plan expiré | State changé depuis le plan. | Relancer plan avant apply sensible. |
| Utiliser runner partagé pour prod | Surface d’attaque plus large. | Runner protégé dédié ou risque documenté. |
| Ne pas documenter la cause | Le même incident CI reviendra. | Note MR, runbook ou ticket correctif. |
Mauvais modèle
Debug improvisé
├── relance aveugle
├── env affiché
├── set -x
├── force-unlock rapide
├── plan non relu
└── aucune documentationBon modèle
Debug professionnel
├── contexte identifié
├── logs lus depuis le début
├── variables vérifiées sans fuite
├── runner et paths contrôlés
├── state lock respecté
├── correction minimale
└── cause documentéeChecklist Debug pipeline GitLab
Checklist diagnostic rapide
| Point | Validation attendue |
|---|---|
| Job exact identifié | Pipeline, stage, job, commit, branche. |
| Logs lus depuis le début | Image, runner, before_script, erreur exacte. |
| Runner vérifié | Online, tags, protected, capacité. |
| Variables vérifiées | Présentes sans afficher leur valeur. |
| Chemins vérifiés | pwd, ls, TF_ROOT. |
| Artifacts vérifiés | tfplan, plan.txt, paths corrects. |
| Terraform vérifié | Version, init, validate, backend, providers. |
| State lock vérifié | Pas d’apply concurrent. |
Checklist sécurité
Pas de env / printenv | Évite fuite globale. |
Pas de set -x avec secrets | Évite trace des commandes sensibles. |
| Pas de secret dans artifacts | Plan, logs, outputs contrôlés. |
| Pas de force-unlock sans preuve | Protège le state. |
| Runner prod protégé | Évite exécution non maîtrisée. |
Checklist correction
| Question | Réponse attendue |
|---|---|
| La cause est-elle identifiée ? | Runner, variable, path, state, IAM, provider. |
| La correction est-elle minimale ? | Pas de refactor inutile. |
| Le job relancé est-il le bon ? | Pas de pipeline complet si inutile. |
| Le plan doit-il être régénéré ? | Oui si state/env/code a changé. |
| La prod est-elle touchée ? | Dashboards ouverts et approval si nécessaire. |
| La cause est-elle documentée ? | MR, ticket, runbook ou note d’incident. |
Mini-cheat-sheet
# Runner
gitlab-runner verify
gitlab-runner list
systemctl status gitlab-runner --no-pager
journalctl -u gitlab-runner -n 100 --no-pager
# Safe CI debug
echo "Branch=$CI_COMMIT_BRANCH"
echo "Source=$CI_PIPELINE_SOURCE"
echo "Env=${CI_ENVIRONMENT_NAME:-not-set}"
echo "TF_ROOT=$TF_ROOT"
pwd
ls -la
terraform --version
# Terraform
terraform init
terraform validate
terraform plan -out=tfplan
terraform show -no-color tfplan
terraform state list
terraform plan -refresh-only
# Avoid
env
printenv
set -x
echo "$SECRET"
terraform force-unlock LOCK_IDDéployer proprement : réduire le risque client
Un déploiement production ne consiste pas seulement à pousser une nouvelle version. C’est une opération contrôlée qui doit limiter l’impact utilisateur, surveiller les signaux critiques, permettre un retour arrière rapide et laisser une trace exploitable.
Le choix de stratégie dépend du contexte : criticité du service, nombre d’instances, présence d’un load balancer, compatibilité des migrations, tolérance au downtime, maturité monitoring, capacité de rollback et niveau de trafic.
Les questions à poser avant de déployer
| Question | Pourquoi | Réponse attendue |
|---|---|---|
| Quel est le risque utilisateur ? | Détermine la stratégie. | Faible, moyen, élevé, critique. |
| Peut-on avoir deux versions en même temps ? | Nécessaire pour rolling/canary. | Compatibilité API, DB, cache, sessions. |
| Le rollback est-il testé ? | Un rollback improvisé est dangereux. | Commande, image précédente, DB compatible. |
| Quels signaux surveiller ? | Détecter vite une mauvaise version. | 5xx, latence, erreurs métier, saturation. |
| Faut-il une fenêtre de maintenance ? | Changements incompatibles ou DB sensibles. | Oui/non, durée, communication. |
| Qui décide du go/no-go ? | Évite la confusion pendant l’opération. | Release owner, SRE, DevOps, métier. |
Flux standard d’un déploiement production
Préparation
│
├── MR approuvée
├── pipeline vert
├── image versionnée
├── rollback connu
├── migrations validées
└── dashboards ouverts
│
▼
Déploiement
│
├── rolling
├── blue/green
├── canary
└── maintenance window
│
▼
Vérification
│
├── health checks
├── logs
├── metrics
├── alertes
└── test métier
│
▼
Décision
│
├── continuer
├── pause
├── rollback
└── hotfix
│
▼
Clôture
├── note de changement
├── version active
└── incidents éventuelsPrincipes SRE
| Principe | Application |
|---|---|
| Réduire le blast radius | Canary, rolling progressif, feature flags. |
| Rendre le rollback rapide | Image précédente, config précédente, DB compatible. |
| Mesurer avant décision | Metrics et logs pendant la montée en charge. |
| Automatiser sans aveuglement | Garde-fous et approvals pour production. |
| Documenter | Timeline, décision, version, post-checks. |
Comparatif des stratégies de déploiement
| Stratégie | Principe | Avantages | Risques | Cas adapté |
|---|---|---|---|---|
| Recreate | Stop ancienne version, start nouvelle. | Simple. | Downtime. | Petites apps internes. |
| Rolling | Remplacer les instances progressivement. | Peu ou pas d’interruption. | Deux versions coexistent. | Services stateless. |
| Blue/Green | Deux environnements, bascule trafic. | Rollback rapide par rebascule. | Coût double temporaire. | Applications critiques. |
| Canary | Exposer un petit % du trafic. | Risque limité. | Observabilité obligatoire. | Fort trafic, SRE mature. |
| Feature flags | Activer fonction sans redéployer. | Rollback fonctionnel rapide. | Dette de flags. | Nouvelles fonctionnalités. |
| Maintenance page | Couper proprement l’accès utilisateur. | Sûr pour changements incompatibles. | Downtime visible. | Migration DB non compatible. |
Choix rapide
Changement simple et stateless ?
└── Rolling
Besoin rollback très rapide ?
└── Blue / Green
Risque produit élevé avec trafic suffisant ?
└── Canary
Migration incompatible ou downtime assumé ?
└── Maintenance page
Nouvelle fonctionnalité risquée ?
└── Feature flag + canary éventuelCritères de décision
| Critère | Impact sur choix |
|---|---|
| Nombre d’instances | Rolling nécessite plusieurs instances pour zéro downtime. |
| Compatibilité DB | Canary/rolling exigent souvent compatibilité ascendante. |
| Observabilité | Canary sans métriques est dangereux. |
| Coût | Blue/green peut doubler temporairement l’infrastructure. |
| Criticité | Plus c’est critique, plus le déploiement doit être progressif. |
Rolling deployment : remplacer progressivement
Le rolling deployment remplace les instances une par une ou par petits lots. Il est efficace pour les applications stateless derrière un load balancer, avec health checks fiables et compatibilité entre versions.
Principe
Version N active
│
├── instance 1 : vN
├── instance 2 : vN
├── instance 3 : vN
└── instance 4 : vN
│
▼
Rolling update
│
├── instance 1 → vN+1
├── healthcheck OK
├── instance 2 → vN+1
├── healthcheck OK
└── continuer
│
▼
Version N+1 active partoutConditions nécessaires
| Condition | Pourquoi |
|---|---|
| Healthcheck fiable | Ne pas envoyer du trafic vers une instance cassée. |
| Sessions externalisées | Éviter perte de session si instance remplacée. |
| Deux versions compatibles | Ancienne et nouvelle version coexistent temporairement. |
| Capacité suffisante | Supporter le trafic pendant remplacement partiel. |
| Rollback rapide | Revenir à l’image ou release précédente. |
Exemple Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 4
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
spec:
containers:
- name: api
image: registry.example.com/api:1.8.2
readinessProbe:
httpGet:
path: /health/
port: 8000Commandes utiles
kubectl rollout status deployment/api
kubectl get pods -l app=api
kubectl describe deployment/api
# Rollback Kubernetes
kubectl rollout undo deployment/api
# Vérifier version image
kubectl get deployment api -o wideRisques rolling
| Incompatibilité DB | Nouvelle version attend un schéma non compatible. |
| Healthcheck trop faible | Instance marquée healthy alors qu’elle est cassée. |
| Capacité insuffisante | Latence ou erreurs pendant remplacement. |
| Rollback incomplet | Image rollback OK mais migration non réversible. |
Blue / Green : basculer entre deux environnements
Le blue/green consiste à maintenir deux environnements : l’un sert le trafic, l’autre reçoit la nouvelle version. Après validation, le trafic bascule vers le nouvel environnement. Le rollback consiste souvent à rebascule le trafic vers l’ancien.
Principe
BLUE actif
├── version N
└── reçoit 100% trafic
GREEN préparé
├── version N+1
├── smoke tests
├── health checks
└── validation métier
│
▼
Bascule trafic
├── load balancer
├── DNS pondéré
└── service mesh
│
▼
GREEN actif
BLUE conservé temporairement pour rollbackAvantages
| Rollback rapide | Rebasculer vers l’environnement précédent. |
| Validation avant trafic | Tester green avant exposition utilisateur. |
| Downtime réduit | La bascule peut être quasi instantanée. |
| Isolation | Nouvelle version préparée sans toucher blue. |
Exemple de bascule load balancer
Load Balancer
│
├── Target Group BLUE
│ └── app version N
│
└── Target Group GREEN
└── app version N+1
Avant :
100% → BLUE
Après validation :
100% → GREEN
Rollback :
100% → BLUERisques blue/green
| Risque | Prévention |
|---|---|
| Coût double temporaire | Durée green limitée, cleanup blue après stabilisation. |
| DB partagée incompatible | Migrations backward compatible. |
| Sessions/caches incohérents | Externaliser sessions, compatibilité cache. |
| DNS TTL trop long | Préférer LB routing ou TTL maîtrisé. |
| Green non représentatif | Smoke tests et données réalistes. |
Canary deployment : exposer progressivement
Le canary déploie la nouvelle version sur une petite part du trafic ou des utilisateurs. On augmente progressivement si les signaux restent bons. C’est puissant, mais exige une observabilité solide et des critères de décision objectifs.
Progression canary
Version N : 100%
Version N+1 : 0%
│
▼
Canary 5%
├── surveiller 5xx
├── latence
├── erreurs métier
└── logs
│
▼
Canary 25%
│
▼
Canary 50%
│
▼
Canary 100%
│
▼
Ancienne version retiréeCritères de promotion
| Signal | Critère Go | Critère rollback |
|---|---|---|
| HTTP 5xx | Stable ou inférieur baseline. | Hausse anormale. |
| Latence p95/p99 | Pas de dérive significative. | Latence supérieure seuil. |
| Erreurs applicatives | Pas de nouvelle exception critique. | Nouvelle erreur fréquente. |
| Métriques métier | Parcours clé OK. | Échec paiement, login, commande, job. |
| Saturation | CPU/RAM/DB stables. | Queue backlog ou DB locks. |
Exemple routing canary
Load Balancer / Service Mesh
│
├── 95% → version stable
└── 5% → version canary
Si OK :
75% stable / 25% canary
50% stable / 50% canary
0% stable / 100% canary
Si KO :
100% stable / 0% canaryExemple Kubernetes conceptuel
# Stable deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-stable
spec:
replicas: 9
---
# Canary deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-canary
spec:
replicas: 1Quand éviter canary ?
| Trafic trop faible | Impossible d’obtenir un signal statistique fiable. |
| Observabilité insuffisante | On ne voit pas si le canary est mauvais. |
| DB incompatible | Ancienne et nouvelle version ne peuvent pas coexister. |
| Session locale | Utilisateur peut changer de version incohérente. |
Maintenance page : downtime contrôlé et assumé
Une page de maintenance est adaptée quand le changement n’est pas compatible avec un trafic actif : migration majeure, modification non backward compatible, opération DB sensible, changement de stockage, ou bascule d’infrastructure difficile à rendre transparente.
Quand l’utiliser ?
| Cas | Pourquoi maintenance |
|---|---|
| Migration DB non compatible | Ancien et nouveau code ne peuvent pas coexister. |
| Changement stockage | Risque d’écriture concurrente. |
| Bascule DNS/infra critique | État transitoire non stable. |
| Import massif ou correction data | Préserver cohérence des données. |
| Application mono-instance | Impossible de déployer sans interruption. |
Runbook maintenance
Before:
- annoncer fenêtre
- vérifier backup
- vérifier rollback
- préparer page maintenance
- arrêter jobs asynchrones
- ouvrir dashboards
During:
- activer maintenance
- vérifier que trafic utilisateur est bloqué proprement
- exécuter migration / déploiement
- exécuter smoke tests internes
After:
- désactiver maintenance
- vérifier health
- vérifier logs
- vérifier métriques
- confirmer retour utilisateurExemple Nginx maintenance simple
server {
listen 443 ssl;
server_name example.com;
if (-f /var/www/maintenance/ON) {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
root /var/www/maintenance;
rewrite ^(.*)$ /maintenance.html break;
}
location / {
proxy_pass http://app_backend;
}
}Points de vigilance
| Point | Risque |
|---|---|
| Jobs background | Peuvent continuer à écrire pendant maintenance. |
| API externes | Webhooks entrants peuvent échouer. |
| Cache/CDN | Maintenance page peut rester cachée trop longtemps. |
| Monitoring | Alertes attendues à inhiber ou annoter. |
| Communication | Utilisateurs ou support doivent être informés. |
Rollback applicatif : restaurer vite, sans improvisation
Le rollback applicatif consiste à revenir à une version stable de l’application, de la configuration ou du routage. Il doit être préparé avant le déploiement, testé en staging et documenté dans la MR.
Types de rollback
| Type | Action | Risque |
|---|---|---|
| Image précédente | Redéployer l’image N-1. | DB incompatible possible. |
| Config précédente | Restaurer variables/config. | Secrets ou cache à recharger. |
| Blue/Green | Rebasculer vers blue. | DB ou sessions modifiées. |
| Canary | Ramener trafic canary à 0%. | Utilisateurs déjà exposés. |
| Feature flag | Désactiver fonctionnalité. | Dette de flag à nettoyer. |
| DB restore | Restaurer backup/snapshot. | Perte de données récentes possible. |
Bloc rollback dans une MR
Rollback plan:
- Previous version: api:1.8.1
- New version: api:1.8.2
- Rollback command:
kubectl rollout undo deployment/api
- Conditions to rollback:
- 5xx > 2% for 5 minutes
- p95 latency > 800ms for 10 minutes
- critical business flow failing
- Validation after rollback:
- health endpoint OK
- 5xx back to baseline
- no new critical logs
- business smoke test OKCommandes rollback courantes
# Kubernetes
kubectl rollout status deployment/api
kubectl rollout undo deployment/api
kubectl rollout history deployment/api
# Docker compose
docker compose pull api
docker compose up -d api
# systemd app release symlink
ln -sfn /opt/app/releases/2026-04-previous /opt/app/current
sudo systemctl restart app.service
# Vérification
curl -fsS https://example.com/health/
journalctl -u app.service -n 100 --no-pagerDiagramme rollback
Signal KO
│
├── 5xx
├── latence
├── erreurs métier
└── saturation
│
▼
Décision rollback
│
├── stop rollout
├── restore previous version
├── reduce canary to 0%
└── switch blue/green
│
▼
Post-checks
├── health
├── logs
├── metrics
└── business testDéploiement et migrations de base de données
Les migrations DB sont souvent le point le plus dangereux d’un déploiement. Une stratégie de déploiement moderne impose des migrations compatibles, progressives et idéalement réversibles ou au moins mitigables.
Pattern expand / migrate / contract
1. Expand
├── ajouter nouvelle colonne nullable
├── ajouter nouvelle table
├── ajouter index sans casser ancien code
└── garder compatibilité
2. Migrate
├── backfill progressif
├── double-write éventuel
├── lecture nouvelle donnée
└── validation
3. Contract
├── supprimer ancien champ
├── retirer ancien code
└── nettoyer dette après stabilisationRègles DB pour rolling/canary
| Règle | Pourquoi |
|---|---|
| Migration backward compatible | Ancien et nouveau code coexistent. |
| Pas de suppression immédiate | Ancienne version peut encore lire l’ancien champ. |
| Backfill contrôlé | Éviter locks longs et saturation. |
| Index en ligne si possible | Limiter blocage DB. |
| Backup avant migration risquée | Mitigation en cas de problème data. |
Checklist migration DB
| Contrôle | Validation |
|---|---|
| Durée estimée | Test sur volume réaliste. |
| Locks | Pas de lock long sur table critique. |
| Rollback | Plan clair ou mitigation assumée. |
| Compatibilité versions | Ancien et nouveau code OK. |
| Backfill | Batché, surveillé, stoppable. |
| Monitoring | Connexions, locks, slow queries, CPU DB. |
Déploiement incompatible
Si migration non compatible
│
├── rolling impossible
├── canary dangereux
├── blue/green limité par DB commune
└── maintenance window souvent nécessaire
│
▼
Actions
├── backup
├── stop writes
├── migration
├── deploy app
├── smoke tests
└── reopen trafficCI/CD : intégrer les stratégies de déploiement
La CI/CD doit rendre la stratégie explicite : build, tests, package, deploy staging, smoke tests, approval production, stratégie de rollout, post-checks et rollback.
Pipeline type
Commit / MR
│
├── tests
├── build image
├── security scan
└── package
│
▼
Staging
├── deploy
├── migrations
├── smoke tests
└── validation
│
▼
Production approval
├── choose strategy
├── rolling / canary / blue-green
├── monitor
└── promote or rollbackExemple GitLab CI simplifié
stages:
- test
- build
- deploy_staging
- smoke
- deploy_prod
- postcheck
deploy_staging:
stage: deploy_staging
script:
- ./scripts/deploy.sh staging rolling
smoke_staging:
stage: smoke
script:
- curl -fsS https://staging.example.com/health/
deploy_prod_canary:
stage: deploy_prod
when: manual
environment:
name: production
script:
- ./scripts/deploy.sh production canary
postcheck_prod:
stage: postcheck
script:
- ./scripts/postcheck.sh productionVariables utiles
| Variable | Usage |
|---|---|
APP_VERSION | Version image ou release à déployer. |
DEPLOY_STRATEGY | rolling, canary, blue_green. |
CANARY_PERCENT | Pourcentage initial de trafic. |
ROLLBACK_VERSION | Version précédente connue. |
MAINTENANCE_MODE | Activer/désactiver maintenance. |
SMOKE_TEST_URL | Endpoint de vérification. |
Garde-fous CI
| Deploy prod manuel | Décision humaine explicite. |
| Environnement protégé | Seuls autorisés peuvent déployer. |
| Smoke tests bloquants | Détecter rapidement une version cassée. |
| Rollback job visible | Action rapide en cas de KO. |
| Artifacts de release | Trace version, commit, image, changelog. |
Anti-patterns des stratégies de déploiement
| Anti-pattern | Pourquoi c’est dangereux | Correction professionnelle |
|---|---|---|
| Déployer sans rollback testé | Improvisation en incident. | Tester rollback en staging. |
| Canary sans métriques | Impossible de savoir si la version est mauvaise. | Définir seuils 5xx, latence, erreurs métier. |
| Rolling avec migration incompatible | Ancienne et nouvelle version cassent ensemble. | Expand/migrate/contract ou maintenance. |
| Blue/green sans cleanup | Coût doublé et confusion opérationnelle. | Durée de conservation limitée. |
| Maintenance non communiquée | Support et utilisateurs subissent sans contexte. | Annonce, statut, fenêtre, message clair. |
| Healthcheck trop superficiel | Version marquée OK alors que métier KO. | Ajouter smoke tests métier. |
| Déploiement vendredi soir | Équipe réduite pour incident. | Fenêtre adaptée selon criticité. |
| Pas de trace de version | Difficile de savoir quoi rollback. | Version, commit, image, changelog dans release. |
Mauvais modèle
Déploiement fragile
├── git pull en prod
├── pas de healthcheck
├── pas de rollback
├── migration directe
├── pas de monitoring
└── pas de trace releaseBon modèle
Déploiement maîtrisé
├── stratégie choisie
├── pipeline tracé
├── version immuable
├── migrations compatibles
├── post-checks
├── seuils rollback
└── runbook disponibleChecklist Stratégies de déploiement
Checklist avant déploiement
| Point | Validation attendue |
|---|---|
| Stratégie choisie | Rolling, blue/green, canary, maintenance. |
| Version identifiée | Image, tag, commit, changelog. |
| Pipeline vert | Tests, build, scan, staging OK. |
| Rollback connu | Commande, version précédente, conditions. |
| Migrations validées | Compatibilité, durée, locks, rollback. |
| Dashboards ouverts | 5xx, latence, logs, DB, saturation. |
| Fenêtre validée | Si risque élevé ou maintenance. |
| Owner présent | DevOps/SRE/dev métier disponibles. |
Checklist pendant déploiement
| Suivre rollout | Statut instances/pods/targets. |
| Surveiller signaux | 5xx, latence, erreurs, logs. |
| Décision par seuil | Continuer, pause ou rollback. |
| Pas de changement concurrent | Éviter confusion de cause. |
| Communication | Canal release ou incident à jour. |
Checklist après déploiement
| Zone | Validation |
|---|---|
| Health | Endpoints OK. |
| HTTP | 5xx et latence revenus au nominal. |
| Logs | Pas de nouvelle erreur critique. |
| DB | Connexions, locks, slow queries OK. |
| Métier | Parcours critique testé. |
| Rollback conservé | Ancienne version disponible assez longtemps. |
| Trace | Version, heure, owner, résultat documentés. |
Mini-cheat-sheet
Strategies:
- rolling: progressive instance replacement
- blue/green: switch traffic between two environments
- canary: expose small traffic percentage
- maintenance: controlled downtime
- feature flag: enable/disable behavior
Signals:
- health endpoint
- HTTP 5xx
- latency p95/p99
- application errors
- DB locks / slow queries
- queue backlog
- business smoke test
Rollback:
- previous image
- previous config
- switch back blue/green
- canary to 0%
- disable feature flag
- DB mitigation if neededCapacité & performance : éviter la panne avant la panne
Un système ne tombe pas seulement quand une ressource atteint 100%. Il devient souvent instable avant : latence qui augmente, files d’attente qui grossissent, connexions saturées, disque lent, swap, timeouts, erreurs 5xx, workers bloqués ou base de données sous pression.
La capacité doit être suivie dans le temps : trafic normal, pics horaires, batchs de nuit, effets d’un déploiement, croissance mensuelle, saisonnalité, pics marketing, incidents externes et changements d’architecture.
Les grandes dimensions de capacité
| Zone | Ce qu’on observe | Risque si ignoré |
|---|---|---|
| CPU | Utilisation, load average, steal time, throttling. | Latence, timeouts, jobs lents. |
| RAM | Mémoire disponible, swap, OOM killer. | Crash process, redémarrages, lenteur. |
| Disque | Espace, inodes, I/O wait, latence disque. | Écriture impossible, DB lente, logs bloqués. |
| Réseau | Débit, erreurs, connexions, saturation LB. | Timeouts, pertes, erreurs intermittentes. |
| Database | Connexions, locks, slow queries, cache hit ratio. | Application lente ou bloquée. |
| Queues | Backlog, âge des messages, workers actifs. | Retards métier, jobs jamais traités. |
Modèle mental de la saturation
Trafic utilisateur / batchs / jobs
│
▼
Application
├── CPU
├── RAM
├── threads / workers
├── connexions DB
└── appels externes
│
▼
Dépendances
├── database
├── cache
├── queue
├── stockage
└── réseau
│
▼
Saturation
├── latence
├── timeouts
├── erreurs 5xx
├── backlog
└── crash / OOMCapacité vs performance
| Concept | Question | Exemple |
|---|---|---|
| Capacité | Combien peut-on absorber ? | 500 req/s avant saturation. |
| Performance | À quelle vitesse répond-on ? | p95 à 180 ms. |
| Saturation | Quelle ressource bloque ? | DB connections à 95%. |
| Scalabilité | Peut-on augmenter la capacité ? | Ajouter workers ou replicas. |
| Résilience | Que se passe-t-il en surcharge ? | Dégradation contrôlée plutôt que crash. |
Signaux clés de capacité et performance
Les bons signaux combinent métriques système, métriques applicatives et métriques métier. Une CPU haute seule ne suffit pas : il faut corréler avec la latence, les erreurs, la DB et les queues.
Golden signals production
| Signal | Exemple | Pourquoi |
|---|---|---|
| Latence | p50, p95, p99. | Montre l’expérience utilisateur réelle. |
| Trafic | Requests/sec, jobs/min, messages/sec. | Comprendre la charge entrante. |
| Erreurs | HTTP 5xx, exceptions, failed jobs. | Détecter régression ou saturation. |
| Saturation | CPU, RAM, DB connections, queue backlog. | Identifier la ressource limitante. |
Signaux faibles avant incident
- La latence p95 monte alors que le taux d’erreur reste bas.
- Les queues accumulent du retard, mais les workers ne crashent pas encore.
- La DB approche de la limite de connexions.
- Le disque est à 80%, mais les logs grossissent très vite.
- Le CPU est correct, mais l’I/O wait augmente.
- Les timeouts externes augmentent après un déploiement.
Dashboard capacité minimal
Production Capacity Dashboard
│
├── HTTP RPS
├── HTTP 5xx rate
├── Latency p50 / p95 / p99
├── CPU / load average
├── RAM / swap / OOM
├── Disk usage / I/O wait
├── DB connections / locks / slow queries
├── Redis / cache hit ratio
├── Queue backlog / oldest message age
├── Worker count / failed jobs
└── Last deployment markerCorrélation utile
| Observation | Hypothèse |
|---|---|
| Latence monte + DB connections hautes | Pool DB saturé ou requêtes lentes. |
| CPU bas + I/O wait haut | Blocage disque ou stockage lent. |
| Queue backlog monte + CPU workers bas | Workers bloqués sur I/O ou dépendance externe. |
| 5xx monte après release | Régression applicative probable. |
| Disque monte + logs explosent | Bug générant trop d’erreurs ou debug activé. |
CPU, RAM, load average et saturation mémoire
Commandes Linux essentielles
# Charge système
uptime
# Process CPU/RAM
top
ps aux --sort=-%cpu | head
ps aux --sort=-%mem | head
# Mémoire
free -h
vmstat 1 5
# OOM killer
dmesg | grep -i "killed process"
journalctl -k | grep -i "out of memory"
# CPU détaillé si outils installés
mpstat 1 5
pidstat 1 5CPU : ce qu’il faut comprendre
| Métrique | Lecture |
|---|---|
| CPU user | Temps passé dans le code applicatif. |
| CPU system | Temps noyau, réseau, I/O, syscalls. |
| I/O wait | CPU attend le disque ou stockage. |
| Steal time | VM pénalisée par l’hyperviseur. |
| Load average | Nombre de tâches en attente CPU/I/O. |
RAM : signaux dangereux
| Signal | Risque | Action |
|---|---|---|
| Mémoire disponible très basse | OOM imminent. | Identifier process, réduire charge, scaler. |
| Swap utilisée fortement | Latence importante. | Comprendre fuite mémoire ou sizing insuffisant. |
| OOM killer | Process tué par le kernel. | Analyser mémoire, limites, leak, workers. |
| RSS process augmente sans redescendre | Possible fuite mémoire. | Profiler, redémarrage contrôlé, fix applicatif. |
Diagnostic CPU/RAM
Latence élevée
│
▼
CPU haut ?
├── Oui
│ ├── code CPU-bound
│ ├── trop de requêtes
│ ├── compression/chiffrement
│ └── batch concurrent
│
└── Non
▼
RAM ou I/O ?
├── swap
├── OOM
├── I/O wait
└── blocage DB/API externeSeuils indicatifs
| CPU > 80% durable | Warning capacité. |
| CPU > 90% durable | Critique si latence augmente. |
| Swap active en prod web | À investiguer rapidement. |
| OOM killer détecté | Incident ou quasi-incident. |
Disque, I/O, inodes, logs et saturation stockage
Le disque est une cause très fréquente d’incident : logs trop volumineux, snapshots oubliés, uploads non nettoyés, inodes épuisés, I/O wait élevé, base de données ralentie ou partition système pleine.
Commandes disque
# Espace disque
df -h
# Inodes
df -i
# Gros dossiers
du -sh /* 2>/dev/null | sort -h
du -sh /var/log/* 2>/dev/null | sort -h
du -sh /tmp/* 2>/dev/null | sort -h
# Journald
journalctl --disk-usage
sudo journalctl --vacuum-time=7d
# Fichiers supprimés encore ouverts
lsof +L1
# I/O si outils installés
iostat -xz 1 5
iotopDiagnostic disque
| Symptôme | Cause probable | Action |
|---|---|---|
df -h haut | Logs, uploads, backups, cache. | Identifier dossier, cleanup contrôlé. |
df -i à 100% | Trop de petits fichiers. | Nettoyer cache/tmp/logs fragmentés. |
| I/O wait élevé | Disque lent ou saturé. | Identifier process, DB, backup, logs. |
| Fichier supprimé mais espace non libéré | Process garde le handle ouvert. | lsof +L1, restart service ciblé. |
| Logs explosent | Erreur en boucle ou debug activé. | Corriger cause, réduire niveau log. |
Seuils disque recommandés
| Seuil | Niveau | Action |
|---|---|---|
| 70% | Information | Surveiller tendance. |
| 80% | Warning | Identifier croissance. |
| 90% | Critique | Cleanup contrôlé ou extension urgente. |
| 95% | Incident imminent | Action immédiate. |
Database : connexions, locks, slow queries et saturation
Beaucoup de problèmes de performance applicative viennent de la base de données : trop de connexions, pool mal dimensionné, requêtes lentes, locks, index manquants, transactions longues ou saturation I/O.
Signaux DB à surveiller
| Signal | Pourquoi |
|---|---|
| Connexions actives | Risque d’atteindre la limite max connections. |
| Requêtes lentes | Augmentent latence et consommation CPU/I/O. |
| Locks | Peuvent bloquer toute une chaîne applicative. |
| Transactions longues | Maintiennent locks et empêchent vacuum/cleanup. |
| Cache hit ratio | Indique si DB lit trop sur disque. |
| Replication lag | Risque de lecture obsolète ou failover difficile. |
PostgreSQL : commandes utiles
-- Connexions actives
select state, count(*)
from pg_stat_activity
group by state;
-- Requêtes longues
select pid, now() - query_start as duration, state, query
from pg_stat_activity
where state <> 'idle'
order by duration desc
limit 10;
-- Locks
select * from pg_locks where not granted;
-- Taille des tables
select relname, pg_size_pretty(pg_total_relation_size(relid))
from pg_catalog.pg_statio_user_tables
order by pg_total_relation_size(relid) desc
limit 10;MySQL / MariaDB : commandes utiles
-- Processlist
show full processlist;
-- Variables importantes
show variables like 'max_connections';
show status like 'Threads_connected';
show status like 'Threads_running';
-- Requêtes lentes
show variables like 'slow_query_log';
show variables like 'long_query_time';
-- InnoDB status
show engine innodb status\GDiagnostic DB
Application lente
│
▼
DB impliquée ?
│
├── connexions hautes
├── locks
├── slow queries
├── CPU DB haut
├── I/O DB haut
└── replication lag
│
▼
Actions
├── index
├── query optimization
├── pool sizing
├── réduire transactions
├── read replicas
└── scaling DB prudentPool de connexions
| Trop petit | Requêtes en attente côté app. |
| Trop grand | DB saturée par trop de connexions. |
| Sans timeout | Threads bloqués longtemps. |
| Sans limite par worker | Explosion lors du scaling horizontal. |
Queues, workers, backlog et traitement asynchrone
Les queues permettent d’absorber des pics, mais elles peuvent aussi cacher une saturation. Un système peut répondre aux utilisateurs tout en accumulant des heures de retard dans les jobs.
Métriques queues essentielles
| Métrique | Ce qu’elle dit | Risque |
|---|---|---|
| Backlog | Nombre de messages en attente. | Retard de traitement. |
| Oldest message age | Âge du plus vieux message. | SLA métier dépassé. |
| Throughput | Messages traités par minute. | Capacité workers insuffisante. |
| Failed jobs | Jobs en erreur. | Bug applicatif ou dépendance KO. |
| Retries | Retentatives. | Peut amplifier la charge. |
| Worker utilization | Workers actifs ou bloqués. | Saturation ou deadlock. |
Commandes Celery utiles
# Inspecter workers
celery -A project inspect active
celery -A project inspect reserved
celery -A project inspect scheduled
celery -A project inspect stats
# Redémarrage contrôlé via systemd
systemctl status celery.service --no-pager
journalctl -u celery.service -n 100 --no-pager
sudo systemctl restart celery.serviceDiagnostic backlog
Backlog monte
│
▼
Workers actifs ?
├── Non
│ ├── service down
│ ├── crash
│ └── broker inaccessible
│
└── Oui
▼
Throughput suffisant ?
├── Non
│ ├── jobs lents
│ ├── DB lente
│ ├── API externe lente
│ └── workers insuffisants
│
└── Oui
└── pic temporaire à surveillerActions possibles
| Action | Quand | Risque |
|---|---|---|
| Ajouter workers | CPU/RAM disponibles, jobs parallélisables. | Saturer DB ou API externe. |
| Réduire concurrence | DB ou API externe saturée. | Backlog plus lent à résorber. |
| Prioriser queues | Jobs critiques vs non critiques. | Complexité opérationnelle. |
| Rate limit | Dépendance externe fragile. | Retard accepté. |
| Dead-letter queue | Messages toxiques ou retry infini. | Besoin traitement manuel. |
Seuils d’alerte : warning, critique et tendance
Les seuils doivent être adaptés au service. Une alerte utile combine un seuil, une durée, une sévérité, un runbook et un owner. Les alertes instantanées trop sensibles créent du bruit.
Seuils indicatifs de départ
| Métrique | Warning | Critique |
|---|---|---|
| CPU | > 80% pendant 10 min | > 90% pendant 10 min + latence |
| RAM | < 15% disponible | Swap forte ou OOM |
| Disque | > 80% | > 90% ou croissance rapide |
| HTTP 5xx | > 1% pendant 5 min | > 2-5% pendant 5 min |
| Latence p95 | > baseline + 50% | > seuil SLA/SLO |
| DB connections | > 75% | > 90% |
| Queue backlog | Backlog croissant | Âge message > SLA métier |
Structure d’une bonne alerte
Alert:
- Name: API latency p95 high
- Condition: p95 > 800ms for 10 minutes
- Severity: warning / critical
- Environment: production
- Impact: users may experience slow responses
- Dashboard: production-api-overview
- Runbook: runbooks/api-latency.md
- Owner: platform-team
- First checks:
- last deployment
- 5xx rate
- DB slow queries
- CPU/RAM
- queue backlogAlerte utile vs bruit
| Bruit | Alerte utile |
|---|---|
| CPU 90% pendant 5 secondes. | CPU 90% pendant 10 min avec latence. |
| Disque 70% sur volume stable. | Disque 80% avec croissance rapide. |
| Queue backlog ponctuel. | Âge du plus vieux message dépasse SLA. |
| Alerte sans runbook. | Alerte avec action claire. |
Scaling : vertical, horizontal, autoscaling et limites
Scaler peut résoudre un problème de capacité, mais pas toujours un problème de performance. Si le goulot est une requête SQL lente ou un lock, ajouter des instances applicatives peut aggraver la base.
Types de scaling
| Type | Principe | Quand |
|---|---|---|
| Vertical | Augmenter taille machine. | DB, instance unique, besoin rapide. |
| Horizontal | Ajouter replicas/instances. | Application stateless, workers, API. |
| Autoscaling | Scaler selon métriques. | Charge variable et métriques fiables. |
| Partitionnement | Découper données/charge. | Très gros volumes ou limites DB. |
| Cache | Réduire charge DB/app. | Lectures répétitives, données cacheables. |
| Optimisation code/SQL | Réduire coût par requête. | Avant scaling coûteux. |
Décision scaling
Saturation détectée
│
▼
Quel goulot ?
├── CPU app → horizontal/vertical
├── RAM app → leak ou vertical
├── DB → query/index/pool/scale DB
├── queue → workers/concurrency
├── disque → cleanup/resize/I/O
└── réseau → LB/cache/architecture
│
▼
Tester en staging si possible
│
▼
Apply contrôlé
│
▼
Surveiller post-changeAutoscaling : métriques possibles
| Métrique | Adapté pour | Limite |
|---|---|---|
| CPU | Apps CPU-bound. | Mauvais pour I/O-bound. |
| RPS | APIs web. | Ne reflète pas coût par requête. |
| Latence | Impact utilisateur. | Peut venir de DB ou API externe. |
| Queue backlog | Workers asynchrones. | Besoin limite pour protéger DB. |
| Custom business metric | Cas métier précis. | Plus complexe à maintenir. |
Garde-fous autoscaling
- Définir un minimum et un maximum réalistes.
- Ajouter cooldown pour éviter l’oscillation.
- Surveiller coût et limites cloud.
- Protéger la DB contre trop de workers/app instances.
- Tester le scale down, pas seulement le scale up.
- Éviter une métrique unique si le système est complexe.
Runbook capacité : diagnostiquer une saturation production
Procédure en 10 étapes
1. Confirmer l'impact utilisateur.
2. Identifier le service et l'environnement.
3. Vérifier dernier déploiement ou changement infra.
4. Ouvrir dashboard capacité.
5. Vérifier 5xx, latence p95/p99 et trafic.
6. Identifier la ressource saturée :
CPU, RAM, disque, DB, queue, réseau.
7. Vérifier logs applicatifs et erreurs récentes.
8. Mitiger :
rollback, scale, rate limit, désactivation feature, cleanup.
9. Surveiller retour à la normale.
10. Documenter cause, action et prévention.Commandes terrain
# Linux
uptime
top
free -h
df -h
df -i
ss -tulpn
journalctl -p err -n 100 --no-pager
# Service
systemctl status app.service --no-pager
journalctl -u app.service -n 100 --no-pager
# HTTP
curl -fsS https://example.com/health/
curl -I https://example.com/
# Logs proxy
tail -n 100 /var/log/nginx/error.log
grep " 500 " /var/log/nginx/access.log | tailMitigations rapides
| Cause | Mitigation | Attention |
|---|---|---|
| CPU app saturé | Scale horizontal ou rollback release. | Vérifier DB avant scale massif. |
| RAM / OOM | Restart contrôlé, scale, réduire workers. | Analyser fuite mémoire ensuite. |
| Disque plein | Cleanup logs/tmp, extension volume. | Ne pas supprimer fichiers DB. |
| DB saturée | Réduire concurrence, tuer requête fautive, rollback. | Action DBA si prod critique. |
| Queue backlog | Ajouter workers ou prioriser queues. | Protéger DB/API externes. |
| API externe lente | Timeout, circuit breaker, rate limit. | Éviter retries agressifs. |
Timeline incident capacité
Alerte capacité
│
▼
Impact confirmé ?
│
├── Non : surveillance renforcée
└── Oui
│
▼
Identifier goulot
│
▼
Mitigation courte
│
▼
Vérifier retour nominal
│
▼
RCA
├── pourquoi alerte ?
├── pourquoi saturation ?
├── pourquoi non anticipée ?
└── action préventiveAnti-patterns capacité & performance
| Anti-pattern | Pourquoi c’est dangereux | Correction professionnelle |
|---|---|---|
| Alerter seulement à 100% | Trop tard pour réagir. | Warning, critique et tendance. |
| Scaler sans identifier le goulot | Déplace ou aggrave la saturation. | Diagnostic CPU/RAM/DB/queue d’abord. |
| Ignorer la latence p95/p99 | La moyenne cache les utilisateurs impactés. | Suivre percentiles et erreurs. |
| Trop de connexions DB | La DB sature plus vite. | Pool sizing et limites par service. |
| Logs debug permanents | Coût, disque et I/O explosent. | Niveaux log contrôlés et retention. |
| Retries agressifs | Amplifient les incidents. | Backoff, jitter, circuit breaker. |
| Queues sans SLA | Backlog invisible côté utilisateur au début. | Alerter sur âge du plus vieux message. |
| Pas de test de charge | Limites découvertes en production. | Tests réalistes en staging/sandbox. |
Mauvais modèle
Capacité subie
├── pas de baseline
├── alertes trop tardives
├── moyenne seulement
├── pas de backlog monitoring
├── DB non surveillée
└── scaling au hasardBon modèle
Capacité pilotée
├── baseline historique
├── seuils warning/critique
├── p95/p99
├── DB metrics
├── queue backlog + age
├── runbooks
└── capacity planningChecklist Capacité & performance
Checklist dashboard production
| Zone | Métriques attendues |
|---|---|
| HTTP | RPS, 4xx, 5xx, latence p50/p95/p99. |
| Application | Exceptions, threads/workers, restarts, version active. |
| CPU | Utilisation, load, steal, throttling. |
| RAM | Disponible, swap, OOM, RSS process. |
| Disque | Espace, inodes, I/O wait, latence disque. |
| DB | Connexions, locks, slow queries, CPU, I/O. |
| Queues | Backlog, oldest message age, failed jobs, retries. |
| Déploiements | Annotations releases et changements infra. |
Checklist alertes
| Warning avant critique | Temps pour agir avant panne. |
| Durée minimum | Éviter bruit sur pics courts. |
| Runbook lié | Action claire pour l’astreinte. |
| Owner défini | Responsabilité de correction. |
| Seuils revus | Adaptés à la vraie baseline. |
Checklist incident capacité
| Question | Réponse attendue |
|---|---|
| Quel est l’impact utilisateur ? | Latence, erreurs, fonctionnalité touchée. |
| Quel est le goulot ? | CPU, RAM, disque, DB, queue, réseau. |
| Quand cela a commencé ? | Corrélation avec release, trafic, batch. |
| Quelle mitigation rapide ? | Rollback, scale, cleanup, rate limit. |
| Quels signaux de retour nominal ? | 5xx, p95, backlog, DB, CPU/RAM. |
| Quelle action préventive ? | Seuil, capacity planning, optimisation, runbook. |
Mini-cheat-sheet
# Linux
uptime
top
free -h
df -h
df -i
vmstat 1 5
ss -tulpn
journalctl -p err -n 100 --no-pager
# Disk
du -sh /var/log/* | sort -h
journalctl --disk-usage
lsof +L1
# Service
systemctl status app.service --no-pager
journalctl -u app.service -n 100 --no-pager
# HTTP
curl -fsS https://example.com/health/
# Key signals
CPU, RAM, disk, I/O wait
5xx, latency p95/p99
DB connections, locks, slow queries
Queue backlog, oldest message ageIncidents DB : le cœur de l’état métier
Une base de données n’est pas un service comme les autres : elle contient l’état métier, les commandes, comptes, paiements, sessions, événements, logs applicatifs ou données clients. Un incident DB peut ralentir tout le système, bloquer les écritures, provoquer une perte de données ou rendre un rollback applicatif beaucoup plus complexe.
La première règle pendant un incident DB est de commencer par des actions read-only : observer les connexions, les locks, les requêtes lentes, l’espace disque, les transactions, les erreurs et les derniers changements. On évite les actions destructives tant que le diagnostic n’est pas clair.
Familles d’incidents DB
| Famille | Symptômes | Risque |
|---|---|---|
| Connexions | Max connections atteint, pool saturé, timeouts. | Application incapable de parler à la DB. |
| Locks | Transactions bloquées, requêtes en attente. | Écritures ou lectures critiques figées. |
| Lenteurs SQL | Slow queries, CPU DB haut, latence applicative. | Dégradation progressive ou saturation. |
| Disque plein | Écritures impossibles, WAL/binlogs énormes, backups bloqués. | Arrêt brutal ou corruption si mal géré. |
| Backup / restore | Backup absent, restore non testé, RPO/RTO flous. | Perte de données ou indisponibilité prolongée. |
| Réplication | Replica lag, réplication cassée, failover risqué. | Données obsolètes, bascule dangereuse. |
Flux mental d’un incident DB
Alerte DB / application lente
│
▼
Confirmer l’impact
├── utilisateurs touchés ?
├── lectures ou écritures ?
├── service complet ou partiel ?
└── depuis quand ?
│
▼
Observer read-only
├── connexions
├── locks
├── slow queries
├── disque
├── replication lag
└── logs DB/app
│
▼
Mitiger prudemment
├── réduire trafic
├── tuer requête fautive si nécessaire
├── stopper batch
├── augmenter capacité
├── rollback app
└── failover si procédure testée
│
▼
Vérifier retour nominal
│
▼
RCA + actions préventivesRègles de prudence
| Règle | Pourquoi |
|---|---|
| Commencer en lecture seule | Éviter d’aggraver l’incident. |
| Identifier le dernier changement | Déploiement, migration, batch, index, trafic. |
| Ne pas supprimer des fichiers DB à la main | Risque de corruption ou perte irréversible. |
| Vérifier backup avant action destructrice | La restauration est le dernier filet de sécurité. |
| Documenter la timeline | Indispensable pour RCA et décision de restore. |
Triage incident DB : comprendre avant d’agir
Le triage consiste à répondre rapidement à trois questions : quel est l’impact utilisateur, quelle ressource DB est sous pression, et quelle mitigation réduit le risque sans détruire d’information.
Questions de triage
| Question | Pourquoi | Exemple de réponse |
|---|---|---|
| Lecture ou écriture touchée ? | Le risque diffère fortement. | Les inserts commandes échouent, lectures OK. |
| Erreur ou lenteur ? | Pas la même urgence. | Timeouts DB côté API après 10 s. |
| Depuis quand ? | Corrélation avec changement. | Depuis le déploiement 14:05. |
| Quel service consomme ? | Identifier source de charge. | Workers export CSV saturent DB. |
| Dernière migration ? | Possibles locks, index, table scan. | Ajout index non concurrent sur grande table. |
| Backup récent vérifié ? | Avant action destructive. | Snapshot disponible à 13:30. |
Commandes de première lecture
# Côté Linux / service
systemctl status postgresql --no-pager
systemctl status mariadb --no-pager
journalctl -u postgresql -n 100 --no-pager
journalctl -u mariadb -n 100 --no-pager
# Système
uptime
free -h
df -h
df -i
top
# Réseau local
ss -tulpnArbre de triage
Incident DB
│
▼
Application down ou lente ?
│
├── Down
│ ├── DB service up ?
│ ├── disque plein ?
│ ├── max connections ?
│ └── credentials/réseau ?
│
└── Lente
├── slow queries ?
├── locks ?
├── CPU DB haut ?
├── I/O wait ?
├── replication lag ?
└── pool saturé ?Triage par symptôme
| Symptôme | Hypothèse prioritaire |
|---|---|
| “Too many connections” | Pool trop large, fuite connexions, trafic élevé. |
| Timeouts SQL | Locks, requêtes lentes, I/O saturé. |
| Écritures échouent | Disque plein, locks, transaction log, quota. |
| Lectures obsolètes | Replica lag ou cache incohérent. |
| CPU DB à 100% | Requête lourde, manque index, batch, plan SQL. |
| DB service restart en boucle | Disque, corruption, config, mémoire. |
Connexions DB : saturation, pools et timeouts
Une saturation de connexions peut bloquer l’application même si la DB n’est pas très chargée. Trop de connexions côté application peut aussi empirer la DB : plus de context switching, plus de locks, plus de transactions concurrentes et plus de mémoire consommée.
PostgreSQL : connexions
-- Connexions par état
select state, count(*)
from pg_stat_activity
group by state
order by count(*) desc;
-- Connexions par application / utilisateur
select usename, application_name, client_addr, state, count(*)
from pg_stat_activity
group by usename, application_name, client_addr, state
order by count(*) desc;
-- Requêtes actives longues
select pid, now() - query_start as duration, state, wait_event_type, wait_event, query
from pg_stat_activity
where state <> 'idle'
order by duration desc
limit 20;
-- Limite configurée
show max_connections;PostgreSQL : terminer une requête
-- Annuler une requête sans tuer la connexion
select pg_cancel_backend(PID);
-- Terminer une connexion
-- À utiliser seulement si compris et validé
select pg_terminate_backend(PID);MySQL / MariaDB : connexions
-- Connexions et threads
show status like 'Threads_connected';
show status like 'Threads_running';
show variables like 'max_connections';
-- Processlist détaillée
show full processlist;
-- Tuer une requête ou connexion
-- Attention en production
kill QUERY_ID;Causes fréquentes
| Cause | Symptôme | Correction |
|---|---|---|
| Pool applicatif trop grand | Trop de connexions simultanées. | Réduire pool par instance. |
| Scaling horizontal non maîtrisé | Chaque instance ajoute son pool. | Calculer total max connexions. |
| Connexions idle non fermées | Beaucoup de sessions idle. | Timeouts, pooling, correction app. |
| Transactions longues | Connexions actives longtemps. | Réduire transaction, optimiser requête. |
| Workers batch trop nombreux | DB saturée lors jobs asynchrones. | Limiter concurrency workers. |
Calcul simple de pool
Connexions potentielles =
instances applicatives
× workers par instance
× pool size
Exemple :
6 instances
× pool 20
= 120 connexions possibles
Si max_connections = 150,
il reste peu de marge pour admin, migrations, workers, cron.max_connections sans comprendre la charge peut simplement repousser la panne vers CPU/RAM/locks.Locks : transactions bloquées et effet domino
Les locks sont l’une des causes les plus dangereuses de lenteur DB : une transaction peut bloquer une table, une ligne, un index ou une migration, puis créer une file d’attente qui finit par saturer les connexions applicatives.
PostgreSQL : locks et bloqueurs
-- Sessions bloquées et bloqueurs
select
blocked.pid as blocked_pid,
blocked.query as blocked_query,
blocking.pid as blocking_pid,
blocking.query as blocking_query,
now() - blocked.query_start as blocked_duration
from pg_stat_activity blocked
join pg_locks blocked_locks
on blocked_locks.pid = blocked.pid
join pg_locks blocking_locks
on blocking_locks.locktype = blocked_locks.locktype
and blocking_locks.database is not distinct from blocked_locks.database
and blocking_locks.relation is not distinct from blocked_locks.relation
and blocking_locks.page is not distinct from blocked_locks.page
and blocking_locks.tuple is not distinct from blocked_locks.tuple
and blocking_locks.virtualxid is not distinct from blocked_locks.virtualxid
and blocking_locks.transactionid is not distinct from blocked_locks.transactionid
and blocking_locks.classid is not distinct from blocked_locks.classid
and blocking_locks.objid is not distinct from blocked_locks.objid
and blocking_locks.objsubid is not distinct from blocked_locks.objsubid
and blocking_locks.pid != blocked_locks.pid
join pg_stat_activity blocking
on blocking.pid = blocking_locks.pid
where not blocked_locks.granted
and blocking_locks.granted;PostgreSQL : transactions longues
select pid, usename, application_name,
now() - xact_start as transaction_duration,
state, wait_event_type, wait_event, query
from pg_stat_activity
where xact_start is not null
order by transaction_duration desc
limit 20;MySQL / MariaDB : locks
-- Vue générale
show full processlist;
-- InnoDB status
show engine innodb status\G
-- Selon version, informations locks
select * from information_schema.innodb_trx\G
select * from information_schema.innodb_locks\G
select * from information_schema.innodb_lock_waits\GDécision sur un lock
| Situation | Action possible | Prudence |
|---|---|---|
| Requête SELECT longue | Cancel si impact élevé. | Vérifier origine et utilité. |
| Migration bloquante | Stopper migration, rollback si possible. | Vérifier état partiel. |
| Transaction métier longue | Contacter owner, terminer si nécessaire. | Risque rollback transaction. |
| Batch bloque prod | Stopper batch, réduire concurrence. | Documenter jobs interrompus. |
Diagramme locks
Requête bloquée
│
▼
Identifier bloqueur
│
├── migration ?
├── batch ?
├── transaction app ?
├── admin query ?
└── maintenance ?
│
▼
Évaluer impact
├── lectures seulement ?
├── écritures bloquées ?
├── service critique ?
└── durée ?
│
▼
Décision
├── attendre
├── cancel query
├── terminate session
└── rollback / mitigationLenteurs SQL : slow queries, index, plans et saturation
Une lenteur DB peut venir d’une requête sans index, d’un mauvais plan d’exécution, d’un volume qui a grandi, d’une statistique obsolète, d’un cache froid, d’un lock, d’un disque lent ou d’un déploiement qui multiplie les appels.
PostgreSQL : requêtes lentes
-- Requêtes actives les plus longues
select pid, now() - query_start as duration, state, wait_event_type, wait_event, query
from pg_stat_activity
where state <> 'idle'
order by duration desc
limit 20;
-- Si pg_stat_statements est activé
select calls,
total_exec_time,
mean_exec_time,
rows,
query
from pg_stat_statements
order by total_exec_time desc
limit 20;
-- Plan d'exécution
explain analyze
select * from my_table where column_name = 'value';MySQL / MariaDB : requêtes lentes
-- Processlist
show full processlist;
-- Slow query log
show variables like 'slow_query_log';
show variables like 'long_query_time';
-- Explain
explain select * from my_table where column_name = 'value';
-- Index existants
show index from my_table;Causes classiques de lenteur
| Cause | Signal | Correction |
|---|---|---|
| Index manquant | Table scan, CPU/I/O élevés. | Ajouter index adapté, tester coût écriture. |
| N+1 queries | Explosion nombre requêtes par page. | Optimiser ORM, prefetch/select related. |
| Requête trop large | Beaucoup de lignes lues/retournées. | Pagination, filtres, colonnes ciblées. |
| Stats obsolètes | Mauvais plan d’exécution. | Analyze/vacuum selon moteur. |
| Lock masqué | Requête “lente” mais en attente. | Identifier wait event / bloqueur. |
| Cache froid | Lenteur après restart/failover. | Surveiller, préchauffer si nécessaire. |
Optimisation prudente
Requête lente
│
▼
Mesurer
├── fréquence
├── durée moyenne
├── durée p95/p99
├── lignes lues
└── impact métier
│
▼
Expliquer
├── plan SQL
├── indexes
├── locks
├── stats
└── volume
│
▼
Corriger
├── index
├── rewrite SQL
├── cache
├── pagination
└── réduction appelsDisque plein : urgence DB à traiter avec méthode
Un disque DB plein est critique : les écritures peuvent échouer, les transactions logs grossir, les backups ne plus se produire, la réplication se bloquer, et certaines bases peuvent refuser de redémarrer correctement.
Diagnostic système
# Espace et inodes
df -h
df -i
# Gros répertoires
du -sh /var/lib/* 2>/dev/null | sort -h
du -sh /var/log/* 2>/dev/null | sort -h
du -sh /backup/* 2>/dev/null | sort -h
# Fichiers supprimés encore ouverts
lsof +L1
# Journaux systemd
journalctl --disk-usage
sudo journalctl --vacuum-time=7dÀ ne jamais faire
# Dangerous examples:
rm -rf /var/lib/postgresql/*
rm -rf /var/lib/mysql/*
rm -f ibdata1
rm -f *.ibd
rm -f pg_wal/*
rm -f mysql-bin.* without purge procedureCauses fréquentes
| Cause | Symptôme | Action prudente |
|---|---|---|
| Logs applicatifs | /var/log énorme. | Rotation, vacuum journald, corriger bruit. |
| Backups locaux | Répertoire backup plein. | Archiver/supprimer selon rétention validée. |
| WAL/binlogs | Journaux transactionnels énormes. | Vérifier réplication/backup avant purge. |
| Table énorme | Croissance data non prévue. | Archivage, partitionnement, purge applicative. |
| Index trop nombreux | DB grossit vite. | Audit index inutilisés, suppression contrôlée. |
| Temp files | Requêtes tri/hash massives. | Optimiser requêtes, mémoire, index. |
Mitigation disque plein
Disque DB critique
│
▼
Identifier ce qui grossit
├── logs OS/app
├── backups
├── WAL/binlogs
├── data files
└── temp files
│
▼
Libérer sans risque
├── logs non DB
├── backups hors rétention validée
├── extension volume
└── purge DB via commande officielle
│
▼
Vérifier reprise écritures
│
▼
Plan préventifBackups : RPO, RTO, vérification et stratégie
Un backup n’a de valeur que s’il est restaurable. L’existence d’un fichier ou d’un snapshot ne suffit pas : il faut connaître la fréquence, le périmètre, le chiffrement, la rétention, le temps de restauration et la dernière restauration testée.
Concepts essentiels
| Concept | Définition | Question opérationnelle |
|---|---|---|
| RPO | Perte de données maximale acceptable. | Peut-on perdre 5 min, 1 h, 24 h ? |
| RTO | Temps maximal pour restaurer le service. | Doit-on restaurer en 15 min ou 4 h ? |
| Full backup | Sauvegarde complète. | Combien de temps pour restaurer ? |
| Incremental / WAL / binlog | Permet point-in-time recovery. | Les journaux sont-ils complets ? |
| Retention | Durée de conservation. | Conforme métier/légal/coût ? |
| Restore test | Preuve de restaurabilité. | Dernier test réussi quand ? |
Commandes backup exemples
# PostgreSQL dump logique
pg_dump -Fc -f backup.dump my_database
# PostgreSQL restore logique
pg_restore -d restored_database backup.dump
# MySQL / MariaDB dump logique
mysqldump --single-transaction --routines --triggers my_database > backup.sql
# Restore MySQL / MariaDB
mysql restored_database < backup.sqlChecklist backup sérieux
| Point | Validation attendue |
|---|---|
| Automatisé | Pas de dépendance à une action humaine. |
| Surveillé | Alerte si backup échoue ou est trop vieux. |
| Chiffré | Données sensibles protégées. |
| Hors machine source | Résiste à perte serveur. |
| Rétention claire | Politique connue et appliquée. |
| Testé | Restauration testée régulièrement. |
| Documenté | Runbook restore disponible. |
Architecture backup
Production DB
│
├── full backup
├── incremental / WAL / binlogs
├── snapshots
└── metadata restore
│
▼
Backup storage
├── chiffré
├── rétention
├── accès limité
└── monitoring
│
▼
Restore test
├── sandbox
├── vérification intégrité
├── test applicatif
└── mesure RTORestauration : décision lourde, procédure contrôlée
Restaurer une base de données est une décision majeure. Cela peut résoudre une corruption ou une suppression massive, mais peut aussi perdre des données récentes. La restauration doit être décidée avec le métier, l’owner applicatif, DevOps/SRE et si possible un DBA.
Types de restauration
| Type | Usage | Risque |
|---|---|---|
| Restore complet | DB remplacée par backup. | Perte depuis backup. |
| Point-in-time recovery | Revenir juste avant erreur. | Complexité et validation. |
| Restore parallèle | Restaurer ailleurs pour extraire données. | Plus sûr, plus lent. |
| Table-level restore | Récupérer une table spécifique. | Cohérence référentielle. |
| Failover replica | Basculer sur réplica. | Replica lag ou données manquantes. |
Runbook restore décisionnel
Before restore:
- Confirm incident type: corruption, deletion, bad migration, outage.
- Freeze risky writes if needed.
- Identify last known good time.
- Confirm available backups / WAL / binlogs.
- Estimate data loss window.
- Validate with business owner.
- Prefer restore to parallel environment first.
- Document decision and approvers.
During restore:
- Follow tested procedure.
- Preserve original data if possible.
- Monitor logs, disk, replication.
After restore:
- Verify application health.
- Verify data consistency.
- Run business checks.
- Document RPO/RTO observed.Restore parallèle recommandé
Incident data
│
▼
Ne pas écraser immédiatement prod
│
▼
Restaurer backup en environnement isolé
│
├── vérifier intégrité
├── comparer données
├── extraire lignes/tables
└── préparer correction
│
▼
Décision
├── correction ciblée
├── restore complet
├── PITR
└── abandon restoreQuestions avant restore complet
| Quelle perte de données accepte-t-on ? | RPO métier validé. |
| Quel est le dernier bon point ? | Timestamp fiable. |
| Peut-on corriger sans restore complet ? | Moins destructif. |
| Les écritures doivent-elles être gelées ? | Éviter divergence. |
| Qui approuve la décision ? | Responsabilité claire. |
| Comment vérifier après ? | Tests métier et cohérence. |
Monitoring DB : alertes, dashboards et signaux faibles
Dashboard DB minimal
| Zone | Métriques |
|---|---|
| Disponibilité | DB up, connexions acceptées, erreurs. |
| Connexions | Active, idle, max connections, pool usage. |
| Performance | QPS/TPS, latence requêtes, slow queries. |
| Locks | Lock waits, transactions longues, deadlocks. |
| Stockage | Disque, croissance, WAL/binlogs, temp files. |
| Ressources | CPU, RAM, cache hit ratio, I/O wait. |
| Réplication | Replica lag, statut réplication, failover readiness. |
| Backups | Dernier backup réussi, durée, taille, restore test. |
Seuils d’alerte indicatifs
| Métrique | Warning | Critique |
|---|---|---|
| Connexions | > 75% | > 90% |
| Disque | > 80% | > 90% ou croissance rapide |
| Locks | Lock wait durable | Écritures bloquées |
| Slow queries | Hausse vs baseline | Impact latence app |
| Backup | Backup plus vieux que prévu | Aucun backup valide récent |
| Replication lag | Lag croissant | Lag dépasse RPO |
Alerte DB bien écrite
Alert:
- Name: PostgreSQL connections near limit
- Condition: active connections > 90% for 5 minutes
- Severity: critical
- Impact: application may fail to acquire DB connections
- Dashboard: db-production-overview
- Runbook: runbooks/db-connections.md
- First checks:
- pg_stat_activity by application_name
- last deployment
- worker count
- pool configuration
- long transactions
- First mitigations:
- reduce worker concurrency
- restart leaking service if confirmed
- block non-critical batch
- scale DB only if validatedSignaux faibles DB
- Connexions idle augmentent après un déploiement.
- Durée moyenne des requêtes monte lentement.
- WAL/binlogs grossissent plus vite que d’habitude.
- Le nombre de deadlocks augmente mais reste faible.
- Les backups prennent de plus en plus longtemps.
- Le replica lag apparaît uniquement pendant les batchs.
Anti-patterns incidents DB
| Anti-pattern | Pourquoi c’est dangereux | Correction professionnelle |
|---|---|---|
| Agir avant d’observer | On peut tuer la mauvaise session ou supprimer la mauvaise donnée. | Premières actions read-only. |
| Supprimer fichiers DB à la main | Risque corruption ou perte irréversible. | Procédures officielles DB uniquement. |
| Augmenter max_connections réflexe | Peut saturer CPU/RAM/locks. | Analyser pools et requêtes. |
| Tuer des sessions sans contexte | Rollback transaction métier possible. | Identifier owner, requête, durée, impact. |
| Restore complet trop rapide | Perte de données récentes non validée. | Restore parallèle ou PITR validé. |
| Backup jamais testé | Découverte du problème au pire moment. | Tests de restauration réguliers. |
| Ignorer les migrations | Locks, table scan, downtime caché. | Plan de migration, tests volume, fenêtre. |
| Pas de timeline | RCA floue, décisions contestables. | Chronologie incident en temps réel. |
Mauvais modèle
Incident DB improvisé
├── pas de triage
├── commandes destructives
├── kill sessions au hasard
├── restore non validé
├── backup supposé OK
└── pas de timelineBon modèle
Incident DB maîtrisé
├── impact confirmé
├── read-only first
├── connexions/locks/slow queries
├── backup vérifié
├── mitigation prudente
├── restore testé si besoin
└── RCA + préventionChecklist Incidents base de données
Checklist triage immédiat
| Point | Validation attendue |
|---|---|
| Impact utilisateur | Lecture, écriture, service complet ou partiel. |
| Environnement | Production, staging, replica, primary clairement identifiés. |
| Dernier changement | Déploiement, migration, batch, config, trafic. |
| Connexions | Active, idle, max, application source. |
| Locks | Bloqueur, bloqué, durée, type de requête. |
| Slow queries | Top requêtes par durée ou coût. |
| Disque | Espace, inodes, WAL/binlogs, backups, logs. |
| Backups | Dernier backup valide et stratégie restore connue. |
Checklist action prudente
| Action read-only d’abord | Observation sans modification. |
| Owner consulté si action destructive | DBA/SRE/app owner selon contexte. |
| Backup vérifié avant restore ou purge | Pas de décision à l’aveugle. |
| Mitigation préférée au grand geste | Réduire trafic, batch, pool, workers. |
| Timeline maintenue | Décisions et heures notées. |
Checklist post-incident
| Question | Réponse attendue |
|---|---|
| Quelle était la cause racine ? | Requête, lock, disque, pool, migration, trafic, bug. |
| Pourquoi l’alerte n’a pas suffi ? | Seuil, runbook, owner, dashboard à ajuster. |
| Le backup était-il utilisable ? | Oui/non, temps estimé, dernier test. |
| Quelle action préventive ? | Index, pool, migration policy, disque, monitoring. |
| Quel runbook mettre à jour ? | Connexions, locks, disque, restore, migrations. |
| Quel test ajouter ? | Load test, migration test, restore drill. |
Mini-cheat-sheet
# System
df -h
df -i
free -h
top
journalctl -u postgresql -n 100 --no-pager
journalctl -u mariadb -n 100 --no-pager
# PostgreSQL
select state, count(*) from pg_stat_activity group by state;
select pid, now() - query_start as duration, state, query
from pg_stat_activity
where state <> 'idle'
order by duration desc
limit 20;
select pg_cancel_backend(PID);
select pg_terminate_backend(PID);
# MySQL / MariaDB
show full processlist;
show status like 'Threads_connected';
show status like 'Threads_running';
show variables like 'max_connections';
show engine innodb status\G
# Backup examples
pg_dump -Fc -f backup.dump my_database
mysqldump --single-transaction --routines --triggers my_database > backup.sqlIncidents réseau : quand l’application semble morte mais ne l’est pas toujours
Les incidents réseau donnent souvent l’impression que l’application est tombée, alors que le problème peut venir d’un DNS mal propagé, d’un certificat expiré, d’un firewall trop restrictif, d’une règle Nginx incorrecte, d’un load balancer sans target healthy, d’une route cloud absente ou d’un port fermé.
Le diagnostic doit suivre le chemin réel de la requête : client → DNS → TLS → edge/load balancer → firewall → reverse proxy → application → dépendances. On évite de redémarrer les services au hasard avant d’avoir identifié où le flux se casse.
Familles d’incidents réseau
| Famille | Symptômes | Risque |
|---|---|---|
| DNS | Domaine ne résout pas, mauvaise IP, propagation incohérente. | Service inaccessible pour tout ou partie des utilisateurs. |
| TLS | Certificat expiré, chaîne invalide, SNI incorrect. | Erreur navigateur, API clients bloquées. |
| Nginx / proxy | 502, 503, 504, mauvais upstream, config cassée. | Application saine mais inaccessible. |
| Firewall / ports | Connexion refusée, timeout, port fermé. | Flux bloqué entre client, proxy, app ou DB. |
| Load balancer | Targets unhealthy, health check KO, mauvais listener. | Trafic non routé ou routé vers mauvais backend. |
| Routes / cloud network | Subnet isolé, route table incomplète, NAT absent. | Communication impossible entre composants. |
Diagnostic par couches
Utilisateur signale une panne
│
▼
DNS
├── domaine résout ?
├── bonne IP / CNAME ?
└── propagation correcte ?
│
▼
TLS
├── certificat valide ?
├── chaîne complète ?
└── SNI correct ?
│
▼
Edge / Load Balancer
├── listener actif ?
├── target healthy ?
└── règles correctes ?
│
▼
Firewall / Security Group
├── ports ouverts ?
├── source autorisée ?
└── routes valides ?
│
▼
Nginx / Reverse proxy
├── config valide ?
├── upstream joignable ?
└── logs 502/503/504 ?
│
▼
Application
├── service up ?
├── healthcheck OK ?
└── dépendances OK ?Commandes réflexes
# DNS
dig example.com
dig +trace example.com
nslookup example.com
# HTTP / TLS
curl -I https://example.com/
curl -vk https://example.com/health/
openssl s_client -connect example.com:443 -servername example.com
# Ports / sockets
ss -tulpn
nc -vz example.com 443
# Nginx
nginx -t
systemctl status nginx --no-pager
journalctl -u nginx -n 100 --no-pager
tail -n 100 /var/log/nginx/error.logChemin de la requête : cartographier avant de corriger
Avant toute action, il faut comprendre où passe le trafic. Une panne peut être visible côté utilisateur mais située très loin de l’application : DNS, CDN, WAF, load balancer, security group, reverse proxy ou service interne.
Carte type d’un flux web
Browser / Client API
│
▼
DNS resolver
│
▼
CDN / WAF éventuel
│
▼
Load Balancer
│
▼
Firewall / Security Group
│
▼
Nginx / Reverse Proxy
│
▼
Application server
│
├── database
├── cache
├── queue
└── external APIsQuestions à poser
| Question | Pourquoi |
|---|---|
| Tout le monde est-il impacté ? | Différencier panne globale, DNS local, opérateur, région. |
| HTTP ou HTTPS seulement ? | Identifier TLS, redirection, listener ou firewall. |
| Erreur immédiate ou timeout ? | Refus de connexion vs paquet perdu ou service lent. |
| IP directe fonctionne-t-elle ? | Isoler DNS du reste. |
| Healthcheck interne fonctionne-t-il ? | Isoler proxy/LB de l’application. |
Interpréter les symptômes
| Symptôme | Hypothèse prioritaire |
|---|---|
NXDOMAIN | Domaine ou zone DNS incorrecte. |
Connection refused | Port fermé ou service non écoutant. |
Connection timed out | Firewall, route, security group ou host inaccessible. |
SSL certificate problem | Certificat expiré, mauvais domaine, chaîne incomplète. |
502 Bad Gateway | Nginx/LB ne joint pas l’upstream. |
504 Gateway Timeout | Upstream trop lent ou timeout proxy trop court. |
Tests croisés
# Depuis son poste
curl -I https://example.com/
dig example.com
# Depuis le serveur proxy
curl -I http://127.0.0.1:8000/health/
curl -I http://app_backend:8000/health/
# Depuis une autre région / machine
curl -I https://example.com/
# Forcer résolution vers une IP connue
curl -vk --resolve example.com:443:203.0.113.10 https://example.com/DNS : résolution, propagation, TTL et mauvais records
Les incidents DNS sont trompeurs : certains utilisateurs voient l’ancien record, d’autres le nouveau, certains resolvers gardent le cache, et une erreur de CNAME/A/AAAA peut rendre un service inaccessible sans toucher l’application.
Commandes DNS utiles
# Résolution simple
dig example.com
dig www.example.com
# Type de record
dig A example.com
dig AAAA example.com
dig CNAME www.example.com
dig MX example.com
dig TXT example.com
# Trace complète
dig +trace example.com
# Interroger un resolver précis
dig @1.1.1.1 example.com
dig @8.8.8.8 example.com
# Voir TTL
dig example.com +noall +answerPoints à vérifier
| Point | Contrôle |
|---|---|
| Record A / CNAME | Pointe vers la bonne IP ou le bon load balancer. |
| AAAA | IPv6 ne pointe pas vers une cible cassée. |
| TTL | Pas trop long avant changement sensible. |
| Zone autoritative | La bonne zone DNS est modifiée. |
| Propagation | Résultats cohérents entre resolvers. |
Scénarios DNS fréquents
| Symptôme | Cause probable | Action |
|---|---|---|
| Certains clients OK, d’autres KO | Propagation ou cache DNS. | Comparer resolvers, attendre TTL si besoin. |
| Domaine pointe vers ancienne IP | Record non modifié ou mauvaise zone. | Corriger zone autoritative. |
| IPv4 OK, IPv6 KO | Record AAAA cassé. | Corriger ou retirer AAAA. |
| WWW OK, apex KO | Records différents entre domaines. | Comparer A/CNAME apex et www. |
| Validation certificat échoue | DNS validation CAA/TXT/CNAME incorrecte. | Vérifier records de validation. |
Runbook changement DNS
Avant changement
├── réduire TTL si possible
├── vérifier zone autoritative
├── préparer rollback record
└── noter valeur actuelle
Pendant
├── modifier record
├── tester plusieurs resolvers
├── tester curl vers domaine
└── surveiller erreurs
Après
├── confirmer propagation
├── restaurer TTL normal
└── documenterTLS / certificats : expiration, chaîne, SNI et redirections
Une panne TLS bloque souvent tout avant même que la requête atteigne l’application. Les causes courantes : certificat expiré, mauvais domaine, chaîne intermédiaire manquante, SNI incorrect, renouvellement Certbot échoué, redirection HTTP/HTTPS mal configurée.
Commandes TLS
# Tester HTTPS avec détails
curl -vk https://example.com/
# Voir headers uniquement
curl -I https://example.com/
# Inspecter certificat
openssl s_client -connect example.com:443 -servername example.com
# Extraire dates du certificat
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates -subject -issuer
# Certbot
certbot certificates
systemctl status certbot.timer --no-pager
journalctl -u certbot -n 100 --no-pagerÀ vérifier
| Point | Contrôle |
|---|---|
| Expiration | Date notAfter dans le futur. |
| Subject / SAN | Le domaine appelé est inclus. |
| Chaîne | Certificat intermédiaire fourni. |
| SNI | Bon certificat selon hostname. |
| Redirection | HTTP vers HTTPS sans boucle. |
Symptômes TLS
| Erreur | Cause probable | Correction |
|---|---|---|
| Certificate expired | Renouvellement échoué. | Renouveler certificat, recharger Nginx. |
| Hostname mismatch | Certificat ne couvre pas le domaine. | Émettre certificat avec SAN correct. |
| Unable to get issuer | Chaîne intermédiaire incomplète. | Utiliser fullchain. |
| Wrong certificate served | SNI/vhost incorrect. | Vérifier server_name et listen 443. |
| Too many redirects | Boucle proxy/CDN/Nginx. | Corriger headers proto / redirection. |
Nginx TLS typique
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://app_backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}nginx -t, puis reload contrôlé, puis test curl -vk.Nginx / reverse proxy : 502, 503, 504 et upstreams
Nginx peut être la couche qui signale la panne sans être la cause racine. Un 502 indique souvent un upstream inaccessible ou cassé. Un 504 indique souvent un upstream trop lent ou un timeout trop court.
Commandes Nginx
# Tester configuration
nginx -t
# Statut service
systemctl status nginx --no-pager
# Recharger sans couper brutalement
sudo systemctl reload nginx
# Logs
tail -n 100 /var/log/nginx/error.log
tail -n 100 /var/log/nginx/access.log
journalctl -u nginx -n 100 --no-pager
# Voir config chargée
nginx -T | lessTester upstream local
# Depuis le serveur Nginx
curl -I http://127.0.0.1:8000/health/
curl -I http://localhost:8000/health/
curl -I http://app_backend:8000/health/
# Ports écoutés
ss -tulpn | grep -E ':80|:443|:8000|:8080'Codes d’erreur proxy
| Code | Signification probable | Diagnostic |
|---|---|---|
| 400 | Host/header/proxy protocol incorrect. | Vérifier headers et vhost. |
| 404 | Mauvais vhost ou route app absente. | Vérifier server_name et location. |
| 502 | Upstream down/refuse/mauvais socket. | Tester app backend et logs. |
| 503 | Maintenance, overload ou upstream unavailable. | Vérifier mode maintenance / LB. |
| 504 | Timeout upstream. | Analyser lenteur app/DB/API externe. |
Exemple proxy robuste
location / {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}Firewall, security groups, ports et écoute réseau
Un service peut être en bonne santé localement mais inaccessible à cause d’un port fermé, d’une règle firewall, d’un security group, d’une ACL réseau ou d’un service qui écoute seulement sur 127.0.0.1 au lieu de l’interface attendue.
Commandes ports et firewall
# Ports ouverts localement
ss -tulpn
ss -ltnp
# Tester un port depuis une autre machine
nc -vz example.com 443
nc -vz 10.0.1.20 8000
# UFW
ufw status verbose
# iptables
iptables -L -n -v
iptables -S
# nftables
nft list ruleset
# Firewalld
firewall-cmd --list-allInterprétation
| Résultat | Signification probable |
|---|---|
| Connection refused | Host joignable, port fermé ou service down. |
| Timeout | Firewall, route, security group ou paquet perdu. |
| Port écoute sur 127.0.0.1 | Accessible localement seulement. |
| Port écoute sur 0.0.0.0 | Accessible sur toutes interfaces si firewall OK. |
Checklist firewall cloud
| Couche | Contrôle |
|---|---|
| Security group inbound | Source, port, protocole corrects. |
| Security group outbound | Sortie autorisée vers dépendances. |
| NACL / ACL réseau | Règles stateless dans les deux sens. |
| OS firewall | UFW/iptables/nftables cohérents. |
| Service listen address | Application écoute sur la bonne interface. |
| Port mapping container | Container expose et mappe le bon port. |
Flux port à valider
Client / LB
│
▼
Security group inbound
│
▼
OS firewall
│
▼
Nginx port 80/443
│
▼
Upstream app port 8000
│
▼
Application listening
│
▼
DB/cache/queue ports internes0.0.0.0/0 sur SSH, DB, Redis, admin panels ou ports internes pour “tester vite”.Load balancer : listeners, target groups et health checks
Le load balancer peut couper le trafic si ses targets sont unhealthy, si le healthcheck pointe vers le mauvais chemin, si le listener est mal configuré, si le certificat n’est pas le bon ou si les règles de routage envoient vers le mauvais backend.
Points à vérifier
| Zone | Contrôle |
|---|---|
| Listener | Port 80/443 actif, certificat correct. |
| Rules | Host/path routing vers bon target group. |
| Target health | Instances/pods healthy. |
| Healthcheck path | Chemin répond vite et sans dépendance fragile. |
| Security groups | LB peut joindre les backends. |
| Timeouts | Adaptés au comportement app. |
Healthcheck robuste
# Exemple endpoint recommandé
GET /health/
Expected:
- HTTP 200
- réponse rapide
- pas de dépendance lourde
- pas d'appel externe lent
- vérification minimale app readyDiagnostic target unhealthy
Target unhealthy
│
▼
Healthcheck répond localement ?
│
├── Non
│ ├── app down
│ ├── route /health cassée
│ ├── port incorrect
│ └── startup trop long
│
└── Oui
▼
LB peut joindre target ?
├── security group
├── subnet / route
├── NACL
├── mauvais port
└── mauvais protocol HTTP/HTTPSErreurs fréquentes LB
| Erreur | Effet |
|---|---|
| Healthcheck sur endpoint authentifié | Targets toujours unhealthy. |
| Healthcheck trop strict | Instances retirées malgré app utilisable. |
| Backend écoute HTTP mais LB parle HTTPS | Erreurs de connexion. |
| Mauvais target group après deploy | Trafic vers ancienne ou mauvaise version. |
| Timeout LB trop court | 504 sur traitements longs. |
Routes, subnets, NAT, gateways et réseau cloud
Les incidents réseau cloud viennent souvent d’une route manquante, d’une NAT gateway absente, d’un subnet mal associé, d’une ACL trop restrictive ou d’un peering/VPN cassé. Le symptôme est souvent un timeout plutôt qu’un refus de connexion.
Zones de contrôle
| Composant | Ce qu’il faut vérifier |
|---|---|
| Route table | Route vers internet, NAT, peering ou VPN. |
| Subnet public | Route vers internet gateway. |
| Subnet privé | Route vers NAT pour sorties internet si besoin. |
| NACL | Inbound/outbound stateless, ports éphémères. |
| Peering/VPN | Routes des deux côtés, CIDR non conflictuel. |
| DNS interne | Résolution privée, split-horizon, zones privées. |
Tests depuis machine
# Route locale
ip route
ip addr
# Résolution interne
dig internal.service.local
# Test port interne
nc -vz 10.0.2.15 5432
nc -vz redis.internal 6379
# Traceroute si disponible
traceroute example.com
tracepath example.com
# Connexion HTTP interne
curl -v http://internal-service:8080/health/Diagnostic routes
Timeout entre deux services
│
▼
Résolution DNS OK ?
│
├── Non → zone DNS / resolver
└── Oui
▼
Route existe ?
├── Non → route table
└── Oui
▼
Firewall autorise ?
├── Non → SG / NACL / OS firewall
└── Oui
▼
Service écoute ?
├── Non → app/service down
└── Oui → analyser protocole/timeoutsPièges cloud fréquents
| Piège | Symptôme |
|---|---|
| NAT absente en subnet privé | Instances ne sortent pas vers internet. |
| NACL bloque ports éphémères | Timeouts intermittents ou unidirectionnels. |
| Routes peering dans un seul sens | Flux aller OK, retour impossible. |
| CIDR chevauchants | Routage ambigu ou impossible. |
| DNS privé non associé au VPC | Nom interne ne résout pas. |
Runbook incident réseau : méthode terrain
Procédure en 10 étapes
1. Confirmer l’impact : qui est touché, depuis où, depuis quand.
2. Noter le dernier changement : DNS, TLS, Nginx, firewall, LB, deploy.
3. Tester DNS : dig, resolvers publics, TTL, A/CNAME/AAAA.
4. Tester TLS : curl -vk, openssl s_client, expiration, SNI.
5. Tester HTTP : curl -I, codes 301/302/4xx/5xx.
6. Tester Nginx : nginx -t, logs, upstream local.
7. Tester ports : ss, nc, firewall OS, security groups.
8. Tester LB : targets healthy, listener, rules, healthcheck.
9. Mitiger : rollback DNS/config, reload proxy, retirer règle fautive.
10. Documenter timeline, cause, correctif et prévention.Commandes incident rapide
dig example.com
dig +trace example.com
curl -I https://example.com/
curl -vk https://example.com/health/
openssl s_client -connect example.com:443 -servername example.com
nginx -t
systemctl status nginx --no-pager
tail -n 100 /var/log/nginx/error.log
ss -tulpn
nc -vz example.com 443
ip route
df -hMitigations fréquentes
| Cause | Mitigation | Prudence |
|---|---|---|
| DNS mauvais record | Rollback record précédent. | TTL peut ralentir correction. |
| Certificat expiré | Renouveler, vérifier fullchain, reload Nginx. | Tester SNI et tous domaines. |
| Nginx config cassée | Revert config, nginx -t, reload. | Ne pas restart brutal si reload suffit. |
| Firewall trop restrictif | Restaurer règle précédente minimale. | Ne pas ouvrir largement. |
| Targets LB unhealthy | Rollback app ou healthcheck, corriger port. | Vérifier logs app. |
| Route cloud manquante | Restaurer route table / NAT / peering. | Valider blast radius. |
Timeline incident
T0 alerte utilisateur
│
├── test DNS
├── test TLS
├── test HTTP
├── test proxy
├── test port interne
├── mitigation
├── validation retour nominal
└── RCA réseauAnti-patterns incidents réseau
| Anti-pattern | Pourquoi c’est dangereux | Correction professionnelle |
|---|---|---|
| Redémarrer avant diagnostic | Masque la cause et peut aggraver l’incident. | Observer DNS/TLS/proxy/ports/logs d’abord. |
| Confondre 502 et panne applicative | Le problème peut être upstream, socket ou proxy. | Tester backend depuis Nginx. |
Ouvrir 0.0.0.0/0 pour tester | Expose SSH, DB ou services internes. | Autoriser source minimale temporaire. |
| Modifier DNS sans noter l’ancien record | Rollback difficile. | Capturer valeur avant changement. |
Reload Nginx sans nginx -t | Config invalide peut casser production. | Toujours tester avant reload. |
| Ignorer IPv6 / AAAA | Certains clients peuvent être KO seulement en IPv6. | Tester A et AAAA. |
| Healthcheck trop complexe | LB retire des instances pour une dépendance externe lente. | Healthcheck rapide et stable. |
| Pas de timeline | RCA floue et récidive probable. | Documenter commandes, heures et décisions. |
Mauvais modèle
Incident réseau improvisé
├── restart nginx direct
├── firewall ouvert large
├── DNS modifié sans rollback
├── logs non lus
├── LB non vérifié
└── aucune timelineBon modèle
Incident réseau maîtrisé
├── chemin requête cartographié
├── DNS testé
├── TLS testé
├── proxy vérifié
├── ports/firewall contrôlés
├── LB health analysé
└── rollback documentéChecklist Incidents réseau
Checklist diagnostic immédiat
| Zone | Validation attendue |
|---|---|
| Impact | Utilisateurs touchés, région, navigateur/API, depuis quand. |
| DNS | A/CNAME/AAAA, TTL, resolvers publics, zone autoritative. |
| TLS | Expiration, SAN, chaîne, SNI, redirections. |
| HTTP | Code retour, headers, redirections, health endpoint. |
| Nginx | nginx -t, logs, upstream, reload récent. |
| Ports | ss, nc, service listening, firewall OS. |
| Load balancer | Listeners, rules, target health, healthcheck path. |
| Cloud network | Security groups, NACL, routes, NAT, peering, VPN. |
Checklist avant correction
| Ancienne configuration capturée | DNS, Nginx, firewall ou LB rollbackable. |
| Blast radius compris | Quel service ou environnement sera touché. |
| Commande relue | Pas de modification destructive improvisée. |
| Fenêtre ou communication | Si production fortement impactée. |
| Post-check prêt | curl, logs, dashboard, healthcheck. |
Checklist post-incident
| Question | Réponse attendue |
|---|---|
| Quelle couche a cassé ? | DNS, TLS, proxy, firewall, LB, route, app. |
| Pourquoi l’alerte n’a pas suffi ? | Monitoring réseau/TLS/DNS à améliorer. |
| Le rollback était-il prêt ? | Oui/non, délai observé. |
| Quel test automatique ajouter ? | Certificat, DNS, endpoint, target health. |
| Quelle documentation mettre à jour ? | Runbook, diagramme de flux, ports autorisés. |
| Quelle règle éviterait la récidive ? | CI config test, Terraform review, alerting. |
Mini-cheat-sheet
# DNS
dig example.com
dig +trace example.com
dig @1.1.1.1 example.com
dig A example.com
dig AAAA example.com
# HTTP / TLS
curl -I https://example.com/
curl -vk https://example.com/health/
openssl s_client -connect example.com:443 -servername example.com
# Nginx
nginx -t
nginx -T | less
systemctl status nginx --no-pager
journalctl -u nginx -n 100 --no-pager
tail -n 100 /var/log/nginx/error.log
# Ports / firewall
ss -tulpn
nc -vz example.com 443
ufw status verbose
iptables -L -n -v
nft list ruleset
# Network
ip route
ip addr
traceroute example.com
tracepath example.comIAM : la frontiere entre automatisation utile et risque majeur
IAM controle qui peut faire quoi, sur quelle ressource, dans quel environnement, depuis quel contexte et sous quelles conditions. Dans une equipe DevOps, IAM touche les humains, les pipelines CI/CD, Terraform, les workloads applicatifs, les comptes cloud, les secrets, les roles d’urgence et les audits de securite.
Trop peu de droits casse les pipelines et ralentit les operations. Trop de droits expose la production, les donnees et les comptes cloud. Le bon niveau consiste a donner le droit minimal necessaire, pendant le temps necessaire, avec une trace d’audit exploitable.
Les dimensions IAM a maitriser
| Dimension | Question | Risque si mal gere |
|---|---|---|
| Identite | Qui ou quoi agit ? | Utilisateur ou service non identifie. |
| Permission | Quelles actions sont autorisees ? | Droits trop larges ou pipeline bloque. |
| Ressource | Sur quoi l’action s’applique ? | Impact hors perimetre attendu. |
| Contexte | Depuis quelle branche, compte, IP, OIDC, MFA ? | Utilisation depuis un contexte non fiable. |
| Duree | Acces permanent ou temporaire ? | Credentials oublies ou compromis. |
| Audit | Peut-on prouver qui a fait quoi ? | Incident impossible a reconstruire. |
Modele mental IAM DevOps
Humains
├── developer
├── devops
├── sre
├── security
└── break-glass admin
│
▼
Controle d'acces
├── groupes
├── roles
├── MFA
├── approvals
└── federation / SSO
│
▼
Automatisation
├── GitLab CI
├── Terraform plan
├── Terraform apply
├── deploy app
└── monitoring / backup
│
▼
Cloud resources
├── compute
├── network
├── database
├── storage
├── secrets
└── audit logsIAM en une phrase
| Mauvais modele | Bon modele |
|---|---|
| Un compte admin partage. | Des roles nominatifs ou federes, traces et limites. |
| Un token long terme dans GitLab. | OIDC ou credentials courts selon contexte. |
| Terraform admin partout. | Role plan, role apply, env separes. |
| Break-glass permanent. | Break-glass rare, MFA, ticket, audit, revue. |
Concepts IAM essentiels
Pour debugger ou concevoir IAM proprement, il faut distinguer identite, role, policy, trust policy, permission boundary, session temporaire, condition et audit trail.
Glossaire operationnel
| Concept | Definition | Exemple |
|---|---|---|
| User | Identite humaine ou technique permanente. | Compte admin, service account historique. |
| Role | Identite assumable avec permissions. | prod-terraform-apply-role. |
| Policy | Document qui autorise ou refuse des actions. | s3:GetObject sur un bucket. |
| Trust policy | Definit qui peut assumer un role. | GitLab OIDC peut assumer role CI. |
| Assume-role | Obtention de credentials temporaires. | Pipeline prend role Terraform staging. |
| Condition | Restriction contextuelle. | Branche main, MFA, IP, tag, audience OIDC. |
| Permission boundary | Limite maximale meme si policy plus large. | Role projet ne peut pas toucher IAM global. |
Decision IAM
Une action est demandee
│
▼
Identite connue ?
│
▼
Role assumable ?
│
▼
Policy autorise action ?
│
▼
Resource autorisee ?
│
▼
Conditions respectees ?
│
▼
Aucun deny explicite ?
│
▼
Action autoriseeQuestions a poser sur chaque droit
| Question | But |
|---|---|
| Qui utilise ce droit ? | Identifier owner humain ou service. |
| Pour quelle action precise ? | Eviter les wildcards inutiles. |
| Sur quelles ressources ? | Reduire le blast radius. |
| Dans quel environnement ? | Separer dev, staging, production. |
| Combien de temps ? | Eviter les acces permanents. |
| Quelle trace d’audit ? | Reconstruction post-incident. |
Exemple de policy trop large
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}Exemple plus cible
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-app-prod-artifacts/*"
]
}Action: "*" et Resource: "*" doivent etre traites comme des exceptions a justifier, pas comme un standard.Roles IAM : par environnement, par usage et par niveau de risque
Un bon modele IAM evite les roles fourre-tout. On separe les roles par environnement et par usage : lecture, plan Terraform, apply Terraform, deploiement applicatif, operations DB, audit, break-glass.
Matrice de roles recommandee
| Role | Usage | Risque |
|---|---|---|
dev-readonly-role | Lire ressources dev, debug simple. | Faible. |
staging-terraform-plan-role | Lire state et ressources pour plan. | Moyen. |
staging-terraform-apply-role | Modifier infra staging. | Moyen a eleve. |
prod-terraform-plan-role | Lire production et produire un plan. | Eleve en lecture sensible. |
prod-terraform-apply-role | Modifier infrastructure production. | Critique. |
prod-breakglass-admin-role | Urgence exceptionnelle. | Critique maximal. |
Naming clair
Pattern:
<environment>-<system>-<purpose>-role
Examples:
dev-api-readonly-role
staging-terraform-plan-role
prod-terraform-apply-role
prod-security-audit-role
prod-breakglass-admin-roleSeparation par usage
Terraform pipeline
│
├── plan role
│ ├── read cloud resources
│ ├── read remote state
│ └── no destructive change
│
└── apply role
├── create/update/delete allowed scope
├── protected environment only
├── manual approval
└── audit mandatoryRole design
| Bonne pratique | Pourquoi |
|---|---|
| Un role par environnement | Evite qu’un job dev touche production. |
| Un role par usage | Reduit le blast radius. |
| Sessions temporaires | Evite les credentials long terme. |
| Trust policy stricte | Limite qui peut assumer le role. |
| Tags et owner | Facilite audit et revue. |
Policies IAM : least privilege et blast radius
Une policy professionnelle limite les actions, les ressources et les conditions. Elle evite les permissions globales, les wildcards non justifiees et les droits qui permettent une escalation indirecte.
Structure d’une policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadSpecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-app-prod-artifacts",
"arn:aws:s3:::my-app-prod-artifacts/*"
]
}
]
}Controle des ressources
| Mauvais | Meilleur |
|---|---|
Resource: "*" | ARN exact ou prefixe limite. |
Action: "s3:*" | Actions necessaires seulement. |
| Policy unique massive | Policies par usage. |
| Pas de condition | Conditions sur env, tags, OIDC, MFA. |
Permissions dangereuses a surveiller
| Permission | Risque |
|---|---|
iam:PassRole | Peut permettre d’utiliser un role plus privilegie. |
iam:CreatePolicyVersion | Peut modifier une policy pour s’ajouter des droits. |
sts:AssumeRole large | Peut prendre des roles non prevus. |
kms:Decrypt | Acces a secrets ou donnees chiffrees. |
secretsmanager:GetSecretValue | Exposition de secrets applicatifs. |
ec2:AuthorizeSecurityGroupIngress | Ouverture reseau dangereuse. |
Exemple condition MFA
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::123456789012:role/prod-breakglass-admin-role",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}PassRole, creation de policy, modification de trust policy ou acces secrets.Assume-role : credentials temporaires et trust policy
Assume-role permet d’obtenir des credentials temporaires pour agir avec un role donne. C’est preferable aux access keys permanentes, a condition que la trust policy soit stricte et que les sessions soient auditees.
Flux assume-role
Identite source
├── humain via SSO
├── GitLab OIDC
├── service account
└── role intermediaire
│
▼
sts:AssumeRole
│
▼
Trust policy du role cible
├── principal autorise ?
├── conditions respectees ?
├── MFA / OIDC / branch ?
└── session duration OK ?
│
▼
Credentials temporaires
│
▼
Actions cloud selon policyCommande AWS CLI
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/prod-readonly-role \
--role-session-name incident-readonly-checkVerifier son identite
aws sts get-caller-identity
Trust policy conceptuelle
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/gitlab-ci-base-role"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/environment": "production"
}
}
}Risques assume-role
| Risque | Correction |
|---|---|
| Trust trop large | Limiter principal et conditions. |
| Session trop longue | Reduire duree selon usage. |
| Role chain complexe | Documenter chemins d’assumption. |
| Pas de session name explicite | Forcer noms utiles pour audit. |
| Assume-role cross-account non controle | Limiter comptes et roles cibles. |
IAM pour CI/CD : GitLab, Terraform, OIDC et roles separes
Les pipelines CI/CD sont des acteurs IAM critiques. Ils doivent pouvoir lire, planifier, deployer ou appliquer Terraform selon le contexte, mais ne doivent pas disposer d’un acces production permanent sur toutes les branches.
Modele GitLab CI recommande
| Job | Role IAM | Contexte |
|---|---|---|
| fmt / validate | Aucun role cloud. | Toutes branches. |
| plan dev | dev-terraform-plan-role | Branches dev. |
| plan prod | prod-terraform-plan-role | MR/main protegee. |
| apply staging | staging-terraform-apply-role | Environment staging protege. |
| apply prod | prod-terraform-apply-role | Manual job + protected environment. |
Exemple GitLab CI
terraform_plan_prod:
stage: plan
environment:
name: production
script:
- aws sts get-caller-identity
- terraform init
- terraform plan -out=tfplan
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
terraform_apply_prod:
stage: apply
environment:
name: production
script:
- aws sts get-caller-identity
- terraform apply tfplan
when: manual
rules:
- if: '$CI_COMMIT_BRANCH == "main"'OIDC : principe
GitLab job
│
▼
OIDC token emis par GitLab
│
▼
Cloud IAM trust policy
├── project id
├── ref / branch
├── environment
├── audience
└── protected context
│
▼
Temporary credentials
│
▼
Terraform plan/applyControles obligatoires
| Controle | But |
|---|---|
| Variables protected | Pas de secrets prod en feature branch. |
| Environment scope | Credential prod uniquement pour prod. |
| Protected runner | Execution sur runner maitrise. |
| Manual apply | Decision humaine production. |
| Identity check | aws sts get-caller-identity dans logs. |
Separation des privileges : humains, pipelines et production
La separation des privileges empeche qu’une seule personne ou un seul pipeline puisse tout faire : ecrire le code, approuver, merger, obtenir les secrets, appliquer en production et effacer les traces.
Matrice des droits
| Acteur | Droits normaux | Droits interdits |
|---|---|---|
| Developer | MR, lecture dev, logs non sensibles. | Apply prod, secrets prod. |
| DevOps | Plan, staging apply, review infra. | Admin global permanent. |
| SRE | Production operations, incident response. | Contourner audit ou approvals. |
| Security | Review IAM, audit, policies. | Deploy applicatif sans procedure. |
| GitLab CI | Roles par job et environnement. | Credential permanent multi-env. |
Separation plan / apply
Terraform plan
├── read resources
├── read state
├── generate plan
└── no modification
Terraform apply
├── modify resources
├── requires protected env
├── manual trigger
├── approval
└── audit trailRegles de separation
| Regle | Pourquoi |
|---|---|
| Pas d’admin permanent par defaut | Reduit impact compromission. |
| Pas de compte partage | Audit impossible sinon. |
| Production via role dedie | Separation env et audit. |
| Apply prod manuel | Decision explicite. |
| Break-glass hors routine | Urgence uniquement. |
| Revue periodique des acces | Supprime droits accumules. |
Workflow securise
Auteur MR
│
├── propose changement
└── explique le besoin
│
▼
Reviewer
│
├── relit plan
├── verifie IAM impact
└── approuve risque
│
▼
Authorized deployer
│
├── lance apply
├── surveille prod
└── documente resultatBreak-glass : acces d’urgence rare, fort, temporaire et audite
Le break-glass est un acces exceptionnel permettant d’agir quand les chemins normaux sont indisponibles : incident critique, pipeline casse, IAM bloque, production inaccessible. Il ne doit jamais devenir un raccourci quotidien.
Caracteristiques d’un bon break-glass
| Caracteristique | Exigence |
|---|---|
| Rare | Utilise seulement en incident ou urgence validee. |
| Fort | Peut corriger une situation bloquante. |
| Temporaire | Session courte, expiration, retrait apres usage. |
| MFA obligatoire | Protection contre compromission simple. |
| Journalise | Chaque action doit etre reconstruisible. |
| Revu apres usage | Post-incident et verification des actions. |
Procedure break-glass
Before:
- Confirm incident severity.
- Open incident ticket.
- Identify why normal path is unavailable.
- Get approval from incident commander or senior owner.
- Use MFA.
- Start audit note.
During:
- Assume break-glass role.
- Execute minimal required actions.
- Avoid unrelated changes.
- Capture commands and results.
After:
- Exit session.
- Revoke temporary access if needed.
- Review audit logs.
- Document RCA.
- Fix normal path.Flux break-glass
Incident critique
│
▼
Chemin normal indisponible ?
│
├── Non
│ └── utiliser procedure standard
│
└── Oui
▼
Approval urgence
│
▼
MFA + assume break-glass role
│
▼
Action minimale
│
▼
Audit logs + timeline
│
▼
Revocation / review / RCACe qui doit declencher une revue
| Break-glass utilise hors incident | Signal de contournement process. |
| Session longue | Risque de derive operationnelle. |
| Actions non documentees | Audit insuffisant. |
| Usage recurrent | Le chemin normal est mal concu. |
| Acces non revoque | Dette securite critique. |
Audit IAM : prouver, detecter, nettoyer
IAM doit etre auditable. En cas d’incident, l’equipe doit pouvoir retrouver : quelle identite a agi, quel role a ete assume, depuis quel pipeline ou utilisateur, quelles permissions ont ete utilisees, quelles ressources ont ete modifiees.
Elements a auditer
| Element | Preuve attendue |
|---|---|
| Assume-role | Role source, role cible, session name, heure. |
| GitLab pipeline | Job, commit, branche, environment, trigger user. |
| Terraform apply | Plan artifact, approver, job manuel, logs. |
| Policy changes | Diff Git, approver security, audit cloud. |
| Secret access | Qui a lu quel secret et pourquoi. |
| Break-glass | Ticket incident, MFA, duree, actions, review. |
Questions d’audit
- Who assumed the role?
- Which role was assumed?
- From which system or pipeline?
- Was MFA or OIDC used?
- What actions were executed?
- Which resources were modified?
- Was this linked to a MR, ticket or incident?
- Was the access still needed?
- Did any permission exceed least privilege?Revue periodique des acces
| Frequence | Action |
|---|---|
| Mensuelle | Revoir break-glass usage et comptes inactifs. |
| Trimestrielle | Revoir roles production et Maintainers GitLab. |
| Apres incident | Verifier actions IAM et chemins de privilege. |
| Avant audit externe | Exporter preuves, owners, policies, exceptions. |
Audit trail ideal
MR IAM
│
├── diff policy
├── risk analysis
├── security approval
└── plan artifact
│
▼
Pipeline
├── OIDC identity
├── assume-role
├── job logs
└── manual trigger
│
▼
Cloud audit
├── API calls
├── resources changed
├── session name
└── timestamp
│
▼
Review
├── expected actions?
├── excessive privileges?
└── cleanup needed?Anti-patterns IAM
| Anti-pattern | Pourquoi c’est dangereux | Correction professionnelle |
|---|---|---|
| Compte admin partage | Audit impossible, responsabilite floue. | SSO, roles nominatifs, MFA. |
| Access keys permanentes dans CI | Fuite durable si logs ou variables compromises. | OIDC ou credentials temporaires. |
Action: "*" partout | Blast radius enorme. | Actions minimales par usage. |
Resource: "*" sans justification | Impact hors perimetre. | ARNs cibles et conditions. |
| Pas de separation dev/prod | Erreur dev peut toucher prod. | Roles et comptes separes. |
| Terraform admin global | Pipeline compromis = compte compromis. | Plan/apply roles limites. |
| Break-glass quotidien | Process normal contourne. | Corriger permissions standard. |
| Pas de revue des acces | Droits accumules au fil du temps. | Access review periodique. |
Mauvais modele
IAM fragile
├── users permanents
├── admin partage
├── secrets longs dans CI
├── wildcards partout
├── pas d'audit
└── break-glass banaliseBon modele
IAM maitrise
├── federation / SSO
├── roles par env
├── OIDC CI/CD
├── least privilege
├── approvals IAM
├── audit trail
└── break-glass controleChecklist IAM approfondi
Checklist design IAM
| Point | Validation attendue |
|---|---|
| Roles par environnement | Dev, staging et prod separes. |
| Roles par usage | Read, plan, apply, deploy, audit, break-glass. |
| Least privilege | Actions et ressources limitees. |
| Trust policy stricte | Principal et conditions controles. |
| Credentials temporaires | OIDC ou assume-role plutot que keys longues. |
| Conditions contextuelles | MFA, branch, env, tags, audience si pertinent. |
| Owners identifies | Chaque role critique a un responsable. |
| Audit active | Cloud audit logs exploitables. |
Checklist CI/CD IAM
| Feature branch sans prod apply | Impossible d’assumer role prod. |
| Plan role different de apply role | Separation lecture/modification. |
| Protected environment | Apply prod limite aux autorises. |
| Identity printed safely | aws sts get-caller-identity sans secrets. |
| Manual approval | Production non modifiee automatiquement. |
Checklist audit & break-glass
| Question | Reponse attendue |
|---|---|
| Qui peut assumer le role prod ? | Liste courte, justifiee et revue. |
| Qui peut modifier les policies IAM ? | Security/Platform senior uniquement. |
| Le break-glass est-il MFA ? | Oui, obligatoire. |
| Le break-glass expire-t-il ? | Session courte et revue apres usage. |
| Les acces sont-ils revus ? | Mensuel/trimestriel selon criticite. |
| Les exceptions sont-elles documentees ? | Owner, raison, expiration, risque. |
Mini-cheat-sheet
# Identity
aws sts get-caller-identity
# Assume role
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/prod-readonly-role \
--role-session-name ticket-1234-check
# Terraform IAM safety
terraform fmt -recursive
terraform validate
terraform plan -out=tfplan
terraform show -no-color tfplan
# Review points
- Who can assume the role?
- What actions are allowed?
- Which resources are in scope?
- Are there wildcards?
- Is MFA/OIDC required?
- Is production separated?
- Is break-glass audited?
- When was last access review?Supply chain CI/CD : sécuriser ce qui construit et déploie
La supply chain CI/CD désigne toute la chaîne qui transforme un commit en artifact, image Docker, package, infrastructure ou déploiement production. Elle inclut le code source, les dépendances, les images de build, les templates CI, les runners, les secrets, les artifacts, les registres, les signatures et les droits cloud utilisés par les pipelines.
C’est une zone critique : si un attaquant modifie une dépendance, une image Docker, un template GitLab CI, un runner ou un artifact, il peut injecter du code, voler des secrets, modifier une image de production ou obtenir un accès indirect à l’infrastructure.
Les maillons de la chaîne
| Maillon | Risque principal | Contrôle attendu |
|---|---|---|
| Source Git | Commit malveillant, branche non protégée. | MR, approvals, branches protégées. |
| Templates CI | Job modifié pour exfiltrer secrets. | Templates versionnés, review sécurité. |
| Images Docker | Base image compromise ou vulnérable. | Pin par digest, scan, registry contrôlé. |
| Dépendances | Package compromis, typosquatting, CVE. | Lockfiles, SCA, registry interne si besoin. |
| Runner | Runner partagé, non isolé, persistance de secrets. | Runner protégé, éphémère, tags stricts. |
| Artifacts | Artifact manipulé ou contenant secrets. | Expiration, contrôle contenu, accès limité. |
| Registry | Image remplacée ou tag mutable. | Immutabilité, signature, droits push limités. |
| Déploiement | Apply/deploy depuis contexte non fiable. | Protected environment, OIDC, approval. |
Flux supply chain CI/CD
Commit Git
│
├── MR
├── review
├── pipeline
└── branch protection
│
▼
Build environment
├── runner
├── image Docker de build
├── dependencies
├── secrets
└── templates CI
│
▼
Outputs
├── artifact
├── image Docker
├── SBOM
├── plan Terraform
└── security reports
│
▼
Delivery
├── registry
├── deploy staging
├── approval production
└── deploy production
│
▼
Audit & provenance
├── commit
├── pipeline id
├── image digest
├── signature
└── release notesPrincipes de défense
| Principe | Application |
|---|---|
| Immutabilité | Déployer un digest, pas seulement un tag. |
| Traçabilité | Relier release à commit, pipeline et image. |
| Isolation | Runner prod séparé des jobs non fiables. |
| Least privilege | Le job build ne doit pas pouvoir apply prod. |
| Vérification | Scan, signature, SBOM, policy gates. |
Menaces supply chain : comprendre les scénarios réels
Les attaques supply chain visent rarement uniquement le code applicatif. Elles ciblent souvent les dépendances, les scripts de build, les images de base, les runners, les tokens CI, les artifacts ou les templates partagés.
Scénarios typiques
| Scénario | Exemple | Impact |
|---|---|---|
| Package compromis | Dépendance npm/pip modifiée. | Code malveillant dans build ou runtime. |
| Typosquatting | Package au nom proche d’un package connu. | Installation involontaire d’un malware. |
| Image Docker non maîtrisée | latest change sans contrôle. | Build non reproductible, vulnérabilité. |
| Template CI modifié | Ajout d’un curl exfiltrant secrets. | Compromission multi-projets. |
| Runner compromis | Secrets persistants sur machine de build. | Vol de credentials, injection artifact. |
| Artifact remplacé | Binary ou image modifié après build. | Déploiement d’un contenu non revu. |
| Registry compromise | Tag production repointé vers autre image. | Déploiement d’une image non autorisée. |
Chaîne d’attaque possible
Dépendance ou image compromise
│
▼
Pipeline CI exécute le code
│
├── accès variables
├── accès artifacts
├── accès registry
└── accès cloud role
│
▼
Exfiltration ou injection
├── secret volé
├── artifact modifié
├── image pushée
└── deploy déclenché
│
▼
Production impactée
├── code malveillant
├── données exposées
├── infra modifiée
└── audit difficileContrôles par niveau
| Niveau | Contrôle |
|---|---|
| Prévention | Pin, scan, review, protected branch. |
| Détection | Alertes registry, audit logs, SCA, secret scan. |
| Limitation | Least privilege, runners isolés, variables scoped. |
| Réponse | Révocation tokens, rebuild propre, rollback image. |
Images Docker : pinning, scan, digest et registry
Les images Docker sont un maillon central. Une image de base non contrôlée peut contenir des vulnérabilités, outils inattendus, backdoors, versions obsolètes ou changements imprévus.
Bonnes pratiques Docker
| Pratique | Pourquoi | Exemple |
|---|---|---|
Éviter latest | Tag mutable, build non reproductible. | python:3.12.3-slim |
| Pinner par digest | Garantit le contenu exact. | image@sha256:... |
| Scanner les images | Détecter CVE critiques. | Trivy, Grype, GitLab scanning. |
| Réduire l’image | Moins de surface d’attaque. | slim, distroless, multi-stage. |
| Utilisateur non-root | Limiter impact runtime. | USER appuser |
| Registry privé | Contrôle des images autorisées. | GitLab Registry, ECR, GCR, ACR. |
Dockerfile plus sûr
FROM python:3.12.3-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
RUN addgroup --system app && adduser --system --group app
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
USER app
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]Scan image en CI
container_scan:
stage: security
image:
name: aquasec/trivy:latest
entrypoint: [""]
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'Image promotion model
Build image
│
├── tag commit SHA
├── scan
├── SBOM
└── signature
│
▼
Push registry
│
├── immutable digest
├── restricted push
└── retention policy
│
▼
Deploy staging
│
▼
Promote same digest to prod
│
▼
No rebuild between staging and prodRisques à surveiller
| Tag mutable | Le contenu change sans changement Git. |
| Base image obsolète | CVE non corrigées. |
| Build en root | Risque accru en cas de compromission. |
| Secrets dans image | Fuite durable via layers Docker. |
Dépendances : lockfiles, SCA, versions et registres
Les dépendances applicatives sont une porte d’entrée classique : package compromis, maintainer account piraté, dépendance abandonnée, CVE critique, typosquatting ou confusion entre registry public et privé.
Contrôles dépendances
| Contrôle | But | Exemples |
|---|---|---|
| Lockfile | Reproductibilité des versions. | package-lock.json, poetry.lock. |
| SCA scan | Détection vulnérabilités connues. | Dependabot, GitLab, Snyk, osv-scanner. |
| Pin version | Éviter upgrades invisibles. | Django==4.2.11. |
| Registry contrôlé | Limiter confusion dépendances. | Proxy interne, allowlist. |
| Review upgrades | Comprendre impact sécurité/runtime. | MR dédiée dépendances. |
| Secret scan | Éviter tokens dans repo ou packages. | Gitleaks, GitLab secret detection. |
Exemple Python
# requirements.txt
Django==4.2.11
gunicorn==21.2.0
psycopg[binary]==3.1.18
# Installation reproductible
pip install --require-hashes -r requirements.txtExemple Node.js
# Installer depuis lockfile en CI
npm ci
# Audit
npm audit --audit-level=highPipeline dépendances
Dependency change
│
▼
MR dédiée
│
├── lockfile updated
├── changelog reviewed
├── SCA scan
├── tests
└── security approval if critical
│
▼
Build image
│
▼
Scan image
│
▼
Deploy staging
│
▼
Promote productionSignaux d’alerte
| Signal | Pourquoi suspect |
|---|---|
| Package nouveau et inconnu | Typosquatting possible. |
| Upgrade massif non expliqué | Risque régression ou dépendance compromise. |
| Script postinstall agressif | Peut exécuter du code en CI. |
| Dépendance non maintenue | CVE futures non corrigées. |
| Registry public utilisé pour package interne | Dependency confusion. |
Runners GitLab : isolation, tags, privilèges et nettoyage
Le runner exécute le code du pipeline. Si le runner est partagé, persistant ou trop privilégié, un job peut lire des fichiers résiduels, exploiter Docker socket, voler des secrets ou modifier l’environnement d’autres pipelines.
Modèle de runners
| Runner | Usage | Protection |
|---|---|---|
| shared-low-risk | Lint, tests sans secrets. | Pas de variables sensibles. |
| build-docker | Build images. | Registry push limité. |
| terraform-dev | Plan/apply dev. | Secrets dev uniquement. |
| terraform-prod | Plan/apply production. | Protected runner, protected env. |
| security-scan | Scans SAST/SCA/images. | Accès lecture, pas apply. |
Contrôles runner
# Vérifier runners
gitlab-runner verify
gitlab-runner list
# Service
systemctl status gitlab-runner --no-pager
journalctl -u gitlab-runner -n 100 --no-pager
# Machine
df -h
free -h
docker ps
docker images
docker system dfRunner sécurisé : principes
Job non fiable
│
└── runner sans secrets
│
▼
Job build image
│
└── runner build isolé
│
▼
Job production
│
├── protected runner
├── protected branch
├── protected environment
├── variables scoped
└── audit logsRisques runner
| Risque | Correction |
|---|---|
| Runner partagé avec secrets prod | Runner protégé dédié prod. |
| Docker socket exposé | Éviter ou isoler très strictement. |
| Cache persistant sensible | Nettoyage et cache sans secrets. |
| Runner non patché | Mises à jour et hardening OS. |
| Tags trop larges | Tags précis par usage et environnement. |
Artifacts, cache et logs : outputs utiles mais sensibles
Les artifacts et caches accélèrent les pipelines et facilitent les reviews, mais ils peuvent contenir des secrets, plans sensibles, binaires, rapports de scan, outputs Terraform, logs détaillés ou fichiers temporaires.
Types d’outputs CI
| Output | Usage | Risque |
|---|---|---|
plan.txt | Review humaine Terraform. | Noms de ressources sensibles. |
plan.json | Policy-as-code. | Contenu infrastructure détaillé. |
| Binary/package | Release applicative. | Remplacement ou corruption. |
| Cache dependencies | Accélération build. | Cache poisoning. |
| Logs CI | Debug pipeline. | Secrets affichés par erreur. |
| Rapports sécurité | Review vulnérabilités. | Informations exploitables. |
Artifacts Terraform propres
terraform_plan:
stage: plan
script:
- cd "$TF_ROOT"
- terraform plan -out=tfplan
- terraform show -no-color tfplan > plan.txt
- terraform show -json tfplan > plan.json
artifacts:
paths:
- "$TF_ROOT/tfplan"
- "$TF_ROOT/plan.txt"
- "$TF_ROOT/plan.json"
expire_in: 3 days
when: alwaysRègles artifacts/cache
| Règle | Pourquoi |
|---|---|
| Expiration courte | Réduire exposition. |
| Pas de secrets | Artifacts sont consultables selon droits GitLab. |
| Paths explicites | Éviter d’embarquer trop de fichiers. |
| Cache non sensible | Éviter fuite ou poisoning. |
| Review des outputs | Identifier données sensibles. |
À ne pas faire
# Dangerous
artifacts:
paths:
- .
# Dangerous debug
script:
- env
- printenv
- cat .env
- cat terraform.tfvarsDebug sûr
echo "Job=$CI_JOB_NAME"
echo "Branch=$CI_COMMIT_BRANCH"
echo "TF_ROOT=$TF_ROOT"
pwd
ls -la
if [ -z "$AWS_ACCESS_KEY_ID" ]; then
echo "AWS_ACCESS_KEY_ID is missing"
else
echo "AWS_ACCESS_KEY_ID is present"
fiProvenance : savoir exactement ce qui a été construit et déployé
La provenance permet de répondre à une question simple mais critique : “Cette image ou cet artifact vient-il bien de ce commit, construit par ce pipeline, avec ces dépendances, puis déployé dans cet environnement ?”
Éléments de provenance
| Élément | Exemple | Utilité |
|---|---|---|
| Commit SHA | CI_COMMIT_SHA | Relier image au code source. |
| Pipeline ID | CI_PIPELINE_ID | Retrouver logs et jobs. |
| Image digest | sha256:... | Identifier contenu immuable. |
| SBOM | Liste dépendances. | Impact CVE et audit. |
| Signature | Image signée. | Vérifier origine. |
| Release notes | Changelog, MR, ticket. | Comprendre contexte. |
Metadata dans une image
docker build \
--label org.opencontainers.image.revision="$CI_COMMIT_SHA" \
--label org.opencontainers.image.source="$CI_PROJECT_URL" \
--label org.opencontainers.image.created="$CI_JOB_STARTED_AT" \
-t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" .Provenance flow
Commit SHA
│
▼
Pipeline ID
│
▼
Build job
│
├── dependencies locked
├── image scanned
├── SBOM generated
└── image signed
│
▼
Image digest
│
▼
Deploy staging
│
▼
Promote same digest
│
▼
Production release
│
▼
Audit trail completeQuestions d’audit
| Quelle image tourne en production ? | Tag + digest. |
| Quel commit a produit cette image ? | Label ou release metadata. |
| Quel pipeline l’a construite ? | Pipeline ID et job logs. |
| La même image a-t-elle été testée en staging ? | Promotion sans rebuild. |
| Qui a approuvé la promotion ? | MR, approval, protected environment. |
GitLab CI : intégrer les contrôles supply chain
La protection supply chain doit être intégrée au pipeline : lint, tests, SCA, scan image, secret detection, SBOM, signature, publication registry, déploiement contrôlé et rollback.
Pipeline type
MR pipeline
│
├── lint
├── unit tests
├── dependency scan
├── secret scan
├── build image
├── image scan
└── SBOM
│
▼
Merge main
│
▼
Build release image
├── tag commit SHA
├── digest
├── scan
└── signature
│
▼
Deploy staging
│
▼
Approval production
│
▼
Deploy same digestExemple GitLab CI simplifié
stages:
- test
- security
- build
- publish
- deploy
dependency_scan:
stage: security
script:
- echo "Run dependency scan"
secret_scan:
stage: security
script:
- echo "Run secret detection"
build_image:
stage: build
script:
- docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" .
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
image_scan:
stage: security
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
deploy_prod:
stage: deploy
when: manual
environment:
name: production
script:
- ./deploy.sh "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"Gates recommandés
| Gate | Bloquant ? | Pourquoi |
|---|---|---|
| Tests unitaires | Oui | Qualité minimale. |
| Secret scan | Oui | Éviter fuite directe. |
| Dependency critical CVE | Oui ou exception validée | Risque runtime. |
| Image critical CVE | Oui ou exception validée | Risque container. |
| SBOM | Recommandé | Audit et impact CVE. |
| Signature | Production critique | Provenance vérifiable. |
Protected production
deploy_prod:
stage: deploy
environment:
name: production
when: manual
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
tags:
- protected
- prod
script:
- echo "Deploying image digest: $IMAGE_DIGEST"
- ./deploy.sh "$IMAGE_DIGEST"Réponse incident supply chain
Une suspicion supply chain doit être traitée comme un incident sécurité : il faut contenir, identifier les artifacts/images concernés, révoquer les credentials exposés, reconstruire depuis une source saine et auditer les déploiements.
Runbook suspicion compromission
1. Stopper promotions et déploiements automatiques.
2. Identifier le maillon suspect :
- dépendance
- image base
- runner
- template CI
- registry
- artifact
3. Lister les pipelines exécutés depuis le changement suspect.
4. Identifier les secrets potentiellement exposés.
5. Révoquer / renouveler tokens et credentials.
6. Bloquer ou supprimer images/artifacts suspects.
7. Rebuilder depuis commit propre et environnement sain.
8. Redéployer une image vérifiée.
9. Auditer logs cloud, registry, GitLab et runners.
10. Rédiger RCA et actions préventives.Premières actions sûres
| Geler deploy prod | Évite propagation. |
| Révoquer tokens exposés | Réduit persistance attaquant. |
| Désactiver runner suspect | Stoppe nouvelles exécutions. |
| Bloquer image suspecte | Empêche déploiement. |
| Préserver logs | Nécessaire pour analyse. |
Analyse d’impact
Maillon suspect
│
▼
Quels pipelines touchés ?
│
├── MR only
├── main
├── release
└── production deploy
│
▼
Quels secrets accessibles ?
├── none
├── staging
├── production
└── cloud admin
│
▼
Quels outputs produits ?
├── artifacts
├── images
├── packages
└── terraform plans
│
▼
Actions
├── revoke
├── rebuild
├── redeploy
├── audit
└── RCAQuestions incident
| Quelle version a introduit le risque ? | Commit, package, image, template. |
| Quels environnements ont été touchés ? | Dev, staging, production. |
| Quels secrets étaient disponibles ? | Scope des variables et roles. |
| Quelle image tourne en prod ? | Digest et pipeline d’origine. |
| Peut-on reconstruire proprement ? | Runner sain, dépendances sûres, registry contrôlé. |
Anti-patterns supply chain CI/CD
| Anti-pattern | Pourquoi c’est dangereux | Correction professionnelle |
|---|---|---|
Utiliser latest | Build non reproductible. | Pinner version et digest. |
| Runner partagé avec secrets prod | Risque d’exfiltration. | Runner prod protégé et isolé. |
| Secrets dans Dockerfile | Fuite durable dans layers. | Secrets runtime ou secret manager. |
| Artifacts trop larges | Embarque fichiers sensibles. | Paths explicites et expiration. |
| Pas de scan image | CVE critiques non détectées. | Scan bloquant ou exception validée. |
Template CI inclus depuis main | Changement global non maîtrisé. | Include versionné par tag. |
| Déployer un tag mutable | Impossible de prouver le contenu. | Déployer un digest immuable. |
| Rebuild entre staging et prod | Prod n’exécute pas ce qui a été testé. | Promouvoir la même image. |
Mauvais modèle
Supply chain fragile
├── images latest
├── dependencies non pinnées
├── runner partagé
├── secrets dans logs
├── artifacts larges
├── pas de SBOM
└── tag mutable en prodBon modèle
Supply chain maîtrisée
├── images pinnées
├── scans sécurité
├── lockfiles
├── runner isolé
├── artifacts contrôlés
├── SBOM
├── signatures
└── digest promu en prodChecklist Supply chain CI/CD
Checklist projet
| Contrôle | Validation attendue |
|---|---|
| Branches protégées | Production uniquement depuis branches autorisées. |
| Templates CI versionnés | Include sur tag stable, pas main. |
| Images pinnées | Versions explicites et idéalement digest. |
| Lockfiles présents | Build reproductible. |
| Dependency scan | CVE critiques détectées. |
| Image scan | Image bloquée si risque critique non accepté. |
| Secret scan | Pas de token dans Git, logs, artifacts. |
| Artifacts limités | Paths explicites, expiration courte. |
| Runner protégé | Production sur runner isolé. |
| Provenance | Commit, pipeline, digest, release liés. |
Checklist avant production
| Image testée en staging | Même digest promu vers prod. |
| Scans verts ou exceptions validées | Risque connu et accepté. |
| Secrets scoped production | Disponibles seulement au job prod. |
| Deploy manuel protégé | Environment + approval. |
| Rollback image connu | Digest précédent disponible. |
Checklist audit / incident
| Question | Réponse attendue |
|---|---|
| Quelle image tourne en production ? | Tag et digest exacts. |
| Quel pipeline l’a construite ? | Pipeline ID et logs disponibles. |
| Quel commit est déployé ? | SHA relié à l’image. |
| Quels secrets étaient accessibles ? | Variables scoped et protected vérifiées. |
| Quels runners ont exécuté ? | Runner id, tags, protection. |
| Quels artifacts ont été produits ? | Liste, contenu sensible, expiration. |
| Faut-il révoquer des credentials ? | Oui si exposition possible. |
Mini-cheat-sheet
# Docker
docker image inspect IMAGE
docker history IMAGE
docker scan IMAGE
trivy image IMAGE
# GitLab runner
gitlab-runner verify
gitlab-runner list
systemctl status gitlab-runner --no-pager
# Registry / image
docker pull registry/app:tag
docker inspect --format='index .RepoDigests 0' registry/app:tag
# CI safety
- no latest
- no secrets in logs
- no secrets in artifacts
- pin templates by tag
- protected runner for prod
- deploy digest, not mutable tag
- same image from staging to prod
- revoke secrets if exposedKubernetes : ce qu’un DevOps doit comprendre même sans être expert K8s
Kubernetes orchestre des conteneurs : il lance des applications, les redémarre si elles tombent, expose des services, gère des configurations, distribue le trafic et permet des déploiements progressifs. Même si le poste est orienté Terraform/GitLab, un DevOps doit comprendre les bases Kubernetes pour lire un pipeline, diagnostiquer un incident et dialoguer avec les équipes SRE.
Terraform sert souvent à créer l’infrastructure autour de Kubernetes : cluster managé, réseau, subnets, node pools, IAM, load balancer, registry, DNS et stockage. Kubernetes, Helm ou Kustomize servent ensuite à déployer les workloads applicatifs dans le cluster.
Pourquoi Kubernetes est important pour DevOps
| Sujet | Ce que le DevOps doit savoir | Exemple production |
|---|---|---|
| Déploiement | Comprendre rollout, replicas, images et rollback. | Version API déployée progressivement. |
| Réseau | Comprendre Service, Ingress, DNS interne et ports. | 502 sur Ingress vers mauvais service. |
| Configuration | Différencier ConfigMap, Secret, variables et volumes. | Erreur prod due à une config staging. |
| Sécurité | RBAC, namespaces, service accounts, image policies. | Pipeline trop privilégié dans le cluster. |
| Observabilité | Lire logs pods, events, probes et métriques. | CrashLoopBackOff après release. |
| CI/CD | Déployer via Helm/Kustomize depuis GitLab. | Manual deploy production avec approval. |
Vue d’ensemble architecture
User / Browser / API client
│
▼
DNS
│
▼
Load Balancer / Ingress Controller
│
▼
Ingress
│
▼
Service
│
▼
Pods
├── container app
├── env vars
├── configmaps
├── secrets
└── volumes
│
▼
Dependencies
├── database
├── cache
├── queue
├── object storage
└── external APIsLes objets à connaître
| Objet | Rôle |
|---|---|
| Pod | Unité d’exécution contenant un ou plusieurs containers. |
| Deployment | Gère replicas, rollout et rollback de pods. |
| Service | Expose des pods via une adresse stable interne. |
| Ingress | Expose HTTP/HTTPS vers l’extérieur. |
| ConfigMap | Stocke configuration non sensible. |
| Secret | Stocke données sensibles, à protéger fortement. |
| Namespace | Sépare logiquement les environnements ou équipes. |
| Helm chart | Package de manifests Kubernetes paramétrable. |
Concepts Kubernetes essentiels
Pour un nouveau DevOps, le plus important est de comprendre le vocabulaire opérationnel : namespace, pod, deployment, service, ingress, probes, resources, RBAC et events.
Glossaire opérationnel
| Concept | Définition simple | Commande utile |
|---|---|---|
| Cluster | Ensemble de nœuds qui exécutent les workloads. | kubectl cluster-info |
| Node | Machine qui héberge des pods. | kubectl get nodes |
| Namespace | Séparation logique dans le cluster. | kubectl get ns |
| Pod | Plus petite unité déployée. | kubectl get pods -n app |
| Deployment | Contrôle les replicas et les rollouts. | kubectl get deploy -n app |
| Service | Adresse stable devant des pods. | kubectl get svc -n app |
| Ingress | Routage HTTP/HTTPS externe. | kubectl get ingress -n app |
| Event | Trace des actions et erreurs Kubernetes. | kubectl get events -n app |
Commandes de lecture
kubectl config current-context
kubectl get namespaces
kubectl get all -n my-namespace
kubectl get pods -n my-namespace -o wide
kubectl describe pod POD_NAME -n my-namespace
kubectl logs POD_NAME -n my-namespace
kubectl get events -n my-namespace --sort-by=.lastTimestampRelations entre objets
Deployment
│
▼
ReplicaSet
│
▼
Pods
│
├── labels: app=api
└── containers
│
▼
Service
│
├── selector: app=api
└── stable DNS name
│
▼
Ingress
│
├── host: api.example.com
└── path: /Labels et selectors
| Élément | Rôle | Erreur fréquente |
|---|---|---|
| Label | Marque un objet. | Label pod différent du selector service. |
| Selector | Sélectionne des pods. | Service sans endpoint. |
| Annotation | Métadonnée pour contrôleurs. | Ingress annotation incorrecte. |
Exemple labels
metadata:
labels:
app: api
environment: production
spec:
selector:
matchLabels:
app: apiPods, Deployments, ReplicaSets et rollout
Un pod exécute un container. Un deployment contrôle le nombre de pods, les mises à jour, la stratégie rolling update et le rollback. En production, on ne manipule presque jamais les pods directement : on agit plutôt sur le deployment ou via Helm.
Deployment minimal
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: api
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: registry.example.com/api:1.8.2
ports:
- containerPort: 8000
readinessProbe:
httpGet:
path: /health/
port: 8000
livenessProbe:
httpGet:
path: /health/
port: 8000Commandes rollout
kubectl get deploy -n production
kubectl rollout status deployment/api -n production
kubectl rollout history deployment/api -n production
kubectl describe deployment/api -n production
# Rollback
kubectl rollout undo deployment/api -n production
# Voir les pods associés
kubectl get pods -n production -l app=api -o wideÉtats fréquents des pods
| État | Signification probable | Action |
|---|---|---|
| Pending | Pas assez de ressources ou scheduling impossible. | describe pod, vérifier nodes/resources. |
| CrashLoopBackOff | Container démarre puis crash. | Lire logs et previous logs. |
| ImagePullBackOff | Image introuvable ou auth registry KO. | Vérifier image, tag, pull secret. |
| Running mais not ready | Readiness probe échoue. | Vérifier endpoint health et dépendances. |
| OOMKilled | Container a dépassé la limite mémoire. | Analyser mémoire, limits, fuite possible. |
Services, Ingress, DNS interne et chemin réseau
Kubernetes sépare l’exécution des pods et leur exposition réseau. Les pods sont éphémères, les services donnent une adresse stable, et l’Ingress expose les routes HTTP/HTTPS.
Service ClusterIP
apiVersion: v1
kind: Service
metadata:
name: api
namespace: production
spec:
type: ClusterIP
selector:
app: api
ports:
- name: http
port: 80
targetPort: 8000Ingress HTTP
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api
namespace: production
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api
port:
number: 80Commandes réseau
kubectl get svc -n production
kubectl get endpoints -n production
kubectl get ingress -n production
kubectl describe svc api -n production
kubectl describe ingress api -n productionChemin réseau Kubernetes
Client externe
│
▼
DNS public
│
▼
Load Balancer cloud
│
▼
Ingress Controller
│
▼
Ingress rule
│
▼
Service
│
▼
Endpoints
│
▼
Pods readyPannes réseau fréquentes
| Symptôme | Cause probable | Diagnostic |
|---|---|---|
| Ingress 404 | Host/path mal configuré. | Décrire Ingress et controller logs. |
| 502 / 503 | Service sans endpoints ou pods not ready. | kubectl get endpoints |
| Service ne route pas | Selector ne matche aucun pod. | Comparer labels pods et selector. |
| TLS KO | Secret TLS absent ou mauvais. | Vérifier secret et Ingress. |
| DNS interne KO | Service name ou namespace incorrect. | Tester depuis un pod debug. |
Debug depuis un pod temporaire
kubectl run debug-shell -n production --rm -it \
--image=curlimages/curl -- sh
# Dans le pod
curl -v http://api.production.svc.cluster.local/health/
nslookup api.production.svc.cluster.localConfigMaps, Secrets, variables et volumes
Kubernetes sépare la configuration du code. Les ConfigMaps stockent la configuration non sensible. Les Secrets stockent les données sensibles, mais ils doivent être protégés par RBAC, chiffrement, rotation et éventuellement un gestionnaire externe de secrets.
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: api-config
namespace: production
data:
DJANGO_SETTINGS_MODULE: "config.settings.production"
LOG_LEVEL: "INFO"
FEATURE_X_ENABLED: "false"Secret
apiVersion: v1
kind: Secret
metadata:
name: api-secret
namespace: production
type: Opaque
stringData:
DATABASE_URL: "postgres://user:password@db:5432/app"
SECRET_KEY: "change-me"Injection dans un Deployment
envFrom:
- configMapRef:
name: api-config
- secretRef:
name: api-secretDifférences ConfigMap / Secret
| Objet | Usage | Exemple |
|---|---|---|
| ConfigMap | Configuration non sensible. | Log level, feature flag, URL publique. |
| Secret | Données sensibles. | Password, token, private key. |
| External Secret | Synchroniser depuis secret manager. | AWS Secrets Manager, Vault. |
Commandes de vérification
kubectl get configmap -n production
kubectl get secret -n production
kubectl describe pod POD_NAME -n production
# Ne pas afficher les secrets en clair pendant un debug partagé
kubectl get secret api-secret -n production -o yamlHelm et Kustomize : gérer les manifests applicatifs
Helm et Kustomize permettent de gérer des manifests Kubernetes sans tout dupliquer. Helm fonctionne avec des charts et des values. Kustomize applique des overlays par environnement.
Helm : structure typique
chart-api/
├── Chart.yaml
├── values.yaml
├── values-staging.yaml
├── values-production.yaml
└── templates/
├── deployment.yaml
├── service.yaml
├── ingress.yaml
├── configmap.yaml
└── hpa.yamlCommandes Helm
helm lint ./chart-api
helm template api ./chart-api \
-f values-production.yaml
helm upgrade --install api ./chart-api \
-n production \
-f values-production.yaml \
--atomic \
--timeout 5m
helm list -n production
helm history api -n production
helm rollback api 3 -n productionKustomize : overlays
k8s/
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
│
└── overlays/
├── staging/
│ └── kustomization.yaml
└── production/
└── kustomization.yamlHelm vs Kustomize
| Outil | Avantage | Attention |
|---|---|---|
| Helm | Package, release, rollback, values. | Templates complexes si mal conçus. |
| Kustomize | Simple, natif kubectl, overlays. | Moins orienté package applicatif. |
| Raw YAML | Très lisible au début. | Duplication rapide entre environnements. |
Bonnes pratiques values
| Values par environnement | staging et production clairement séparés. |
| Pas de secret en clair | Secrets via outil dédié. |
| Image tag/digest explicite | Déploiement reproductible. |
| Diff avant apply | Review des changements générés. |
helm template ou kubectl kustomize.GitLab CI/CD avec Kubernetes
Un pipeline Kubernetes propre construit une image, la scanne, la pousse dans un registry, déploie en staging, lance des smoke tests, puis déploie en production via job manuel protégé.
Pipeline type
Commit / MR
│
├── tests
├── build image
├── image scan
└── helm lint/template
│
▼
Merge main
│
├── build release image
├── push registry
└── deploy staging
│
▼
Smoke tests
│
▼
Production approval
│
▼
helm upgrade --install
│
▼
rollout status + post-checksExemple GitLab CI simplifié
stages:
- test
- build
- scan
- deploy_staging
- deploy_prod
build_image:
stage: build
script:
- docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" .
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
helm_lint:
stage: test
script:
- helm lint ./chart
deploy_staging:
stage: deploy_staging
environment:
name: staging
script:
- helm upgrade --install api ./chart -n staging
--set image.tag="$CI_COMMIT_SHA"
deploy_prod:
stage: deploy_prod
environment:
name: production
when: manual
script:
- helm upgrade --install api ./chart -n production
--set image.tag="$CI_COMMIT_SHA"
- kubectl rollout status deployment/api -n productionGarde-fous CI/CD
| Garde-fou | But |
|---|---|
| Image taggée au commit SHA | Traçabilité. |
| Scan image | Bloquer CVE critiques. |
| Helm lint/template | Détecter erreurs YAML/chart. |
| Namespace explicite | Éviter déploiement mauvais environnement. |
| Protected environment | Production déployable uniquement par autorisés. |
| Rollout status | Vérifier que la release est vraiment active. |
Variables utiles
KUBE_NAMESPACE=production
HELM_RELEASE=api
HELM_CHART_PATH=./chart
IMAGE_TAG=$CI_COMMIT_SHA
KUBE_CONTEXT=production-clusterDebug production Kubernetes : méthode terrain
Le debug Kubernetes commence par le contexte, le namespace et l’objet concerné. On lit les events, les logs, les probes, le rollout et les endpoints avant d’agir.
Runbook debug rapide
# 1. Vérifier contexte
kubectl config current-context
# 2. Voir les objets
kubectl get all -n production
# 3. Voir les pods
kubectl get pods -n production -o wide
# 4. Décrire le pod
kubectl describe pod POD_NAME -n production
# 5. Lire les logs
kubectl logs POD_NAME -n production
kubectl logs POD_NAME -n production --previous
# 6. Lire les events
kubectl get events -n production --sort-by=.lastTimestamp
# 7. Vérifier rollout
kubectl rollout status deployment/api -n production
# 8. Vérifier service/endpoints
kubectl get svc,endpoints -n productionDebug logs
# Logs d'un container spécifique
kubectl logs POD_NAME -c CONTAINER_NAME -n production
# Follow logs
kubectl logs -f deployment/api -n production
# Logs précédents si crash
kubectl logs POD_NAME -n production --previousDiagnostic par symptôme
| Symptôme | Cause probable | Commande |
|---|---|---|
| CrashLoopBackOff | Erreur app au démarrage. | kubectl logs --previous |
| ImagePullBackOff | Image/tag/registry secret KO. | kubectl describe pod |
| Pending | Ressources insuffisantes ou node selector. | kubectl describe pod |
| Service 503 | Pods not ready, endpoints absents. | kubectl get endpoints |
| Rollout bloqué | New pods non ready. | kubectl rollout status |
| OOMKilled | Limite mémoire trop basse ou fuite. | kubectl describe pod |
Arbre de décision
Application KO
│
▼
Pods running ?
├── Non
│ ├── Pending
│ ├── ImagePullBackOff
│ └── CrashLoopBackOff
│
└── Oui
▼
Pods ready ?
├── Non → probes / dependencies
└── Oui
▼
Service endpoints ?
├── Non → labels/selectors
└── Oui
▼
Ingress / LB / DNSTerraform, Kubernetes, Helm : qui fait quoi ?
Beaucoup d’équipes mélangent tout dans Terraform, ou au contraire tout dans Helm. Un design propre sépare le socle cloud, le cluster, les composants plateforme et les applications.
Responsabilités recommandées
| Couche | Outil recommandé | Exemples |
|---|---|---|
| Cloud foundation | Terraform | VPC, subnets, IAM, DNS, registry. |
| Cluster | Terraform | EKS/GKE/AKS, node pools, add-ons. |
| Platform add-ons | Terraform ou Helm contrôlé | Ingress controller, cert-manager, monitoring. |
| Application manifests | Helm / Kustomize / GitOps | Deployments, Services, Ingress, HPA. |
| Runtime deploy | GitLab CI ou GitOps | Promote image, helm upgrade. |
Architecture propre
Terraform
├── cloud network
├── IAM / service accounts
├── Kubernetes cluster
├── node groups
├── DNS / registry
└── platform add-ons optional
Helm / Kustomize
├── application deployment
├── service
├── ingress
├── configmap
├── hpa
└── environment values
GitLab CI
├── build image
├── scan image
├── deploy staging
├── smoke tests
└── deploy productionPièges Terraform + Kubernetes
| Piège | Risque | Correction |
|---|---|---|
| Tout gérer en Terraform | State énorme, releases applicatives lourdes. | Séparer infra et app deploy. |
| Tout gérer en Helm | Cloud/IAM non tracés correctement. | Terraform pour socle cloud. |
| Deux outils gèrent le même objet | Drift et conflits. | Owner unique par ressource. |
| Secrets en values Helm | Fuite Git/artifacts. | External Secrets/Vault/SOPS. |
| Cluster prod modifiable depuis feature branch | Risque majeur. | Protected env, RBAC, CI rules. |
Règle de propriété
Resource ownership:
- VPC: Terraform
- EKS/GKE/AKS cluster: Terraform
- Node pools: Terraform
- Ingress controller: Platform chart
- Application Deployment: Helm/Kustomize
- Application image tag: CI/CD release
- Runtime secrets: Secret manager integrationAnti-patterns Kubernetes pour DevOps
| Anti-pattern | Pourquoi c’est dangereux | Correction professionnelle |
|---|---|---|
| Déployer en prod sans namespace explicite | Risque de mauvaise cible. | Toujours préciser -n production. |
Utiliser kubectl apply manuel en prod | Pas de trace CI ni review. | Déploiement via GitLab/Helm/GitOps. |
| Pas de readiness probe | Trafic envoyé vers pod non prêt. | Définir readiness adaptée. |
| Secrets en clair dans Git | Fuite durable. | External Secrets, SOPS, Vault, Sealed Secrets. |
| Pas de requests/limits | Scheduling instable, OOM, noisy neighbor. | Définir requests/limits réalistes. |
| Tout gérer dans Terraform | State difficile et releases lentes. | Séparer infra et workloads applicatifs. |
| Service sans endpoints non vérifié | Debug réseau perdu. | Contrôler labels/selectors/endpoints. |
| RBAC trop large | Pipeline ou user trop privilégié. | ServiceAccount dédié et least privilege. |
Mauvais modèle
Kubernetes fragile
├── kubectl manuel en prod
├── pas de namespace clair
├── pas de probes
├── secrets en Git
├── pas de limits
├── RBAC admin
└── aucun rollout checkBon modèle
Kubernetes maîtrisé
├── CI/CD tracée
├── Helm/Kustomize
├── namespaces explicites
├── readiness/liveness probes
├── resources requests/limits
├── secrets externes
├── RBAC minimal
└── rollout + post-checksChecklist Kubernetes pour DevOps
Checklist avant déploiement
| Point | Validation attendue |
|---|---|
| Contexte Kubernetes | kubectl config current-context vérifié. |
| Namespace explicite | Dev, staging, prod séparés. |
| Image identifiée | Tag ou digest clair, idéalement commit SHA. |
| Helm/Kustomize validé | Lint/template/diff relu. |
| Secrets protégés | Pas de secret en clair dans Git ou artifacts. |
| Probes définies | Readiness et liveness adaptées. |
| Resources définies | Requests/limits réalistes. |
| Rollback connu | Helm rollback ou rollout undo documenté. |
Checklist debug
| Pods | kubectl get pods -o wide |
| Logs | kubectl logs et --previous |
| Events | kubectl get events --sort-by=.lastTimestamp |
| Rollout | kubectl rollout status |
| Service | kubectl get svc,endpoints |
| Ingress | kubectl describe ingress |
Checklist production
| Question | Réponse attendue |
|---|---|
| Qui peut déployer en prod ? | GitLab protected environment + RBAC limité. |
| Quel cluster est ciblé ? | Contexte affiché dans le job. |
| Quel namespace est ciblé ? | Namespace explicite dans les commandes. |
| Quelle image est déployée ? | Tag/digest exact dans logs de release. |
| Le rollout est-il terminé ? | Status OK et pods ready. |
| Les post-checks sont-ils OK ? | Health, logs, metrics, endpoints. |
Mini-cheat-sheet
# Context
kubectl config current-context
kubectl get ns
# Workloads
kubectl get all -n production
kubectl get pods -n production -o wide
kubectl describe pod POD -n production
kubectl logs POD -n production
kubectl logs POD -n production --previous
# Rollout
kubectl rollout status deployment/api -n production
kubectl rollout history deployment/api -n production
kubectl rollout undo deployment/api -n production
# Network
kubectl get svc,endpoints -n production
kubectl get ingress -n production
kubectl describe ingress api -n production
# Helm
helm list -n production
helm history api -n production
helm rollback api REVISION -n productionLinux hardening : securiser la base de production
Les serveurs Linux restent au coeur de nombreuses architectures DevOps : reverse proxy Nginx, runners GitLab, workers, bases de donnees, serveurs applicatifs, bastions SSH, monitoring, backups, scripts cron et services systemd.
Le hardening Linux ne consiste pas a empiler des outils complexes. Il commence par une discipline simple : utilisateurs separes, pas de root direct, SSH durci, firewall minimal, systemd propre, logs conserves, permissions strictes, mises a jour suivies et procedures de rollback documentees.
Axes principaux de hardening
| Axe | Objectif | Exemple concret |
|---|---|---|
| Utilisateurs | Eviter root direct et comptes partages. | Compte deploy, sudo limite, audit login. |
| SSH | Reduire risque brute force et acces non maitrise. | Keys only, no root login, port controle. |
| Firewall | Ouvrir uniquement les ports necessaires. | 80/443 publics, SSH limite, DB privee. |
| Systemd | Superviser proprement les services. | Restart policy, EnvironmentFile, logs journald. |
| Logs | Diagnostiquer et reconstruire les incidents. | journalctl, logrotate, audit auth. |
| Permissions | Limiter l'impact d'une compromission. | Owner correct, chmod strict, secrets non lisibles. |
| Updates | Corriger CVE sans casser production. | Patch window, reboot plan, rollback. |
Modele mental serveur durci
Internet
│
▼
Firewall / Security Group
├── 80 / 443 publics
├── SSH limite
└── DB non exposee
│
▼
SSH hardening
├── no root login
├── keys only
├── users nominatifs
└── logs auth
│
▼
Systemd services
├── app.service
├── nginx.service
├── celery.service
└── gitlab-runner.service
│
▼
Filesystem
├── permissions strictes
├── secrets proteges
├── logs rotates
└── backups verifies
│
▼
Monitoring / Audit
├── metrics
├── journald
├── auth logs
└── alertesCommandes de base
# Systeme
uname -a
lsb_release -a
uptime
df -h
free -h
ss -tulpn
# Services
systemctl status nginx --no-pager
systemctl list-units --type=service --state=running
journalctl -u nginx -n 100 --no-pager
# Securite acces
who
last
sudo -l
grep "Failed password" /var/log/auth.log | tailUtilisateurs, groupes, sudo et separation des droits
La premiere defense d'un serveur Linux est la separation des comptes : pas de compte partage, pas de root direct, pas de sudo global sans raison, et des utilisateurs techniques dedies aux services.
Modele de comptes recommande
| Compte | Usage | Droits |
|---|---|---|
root | Administration systeme exceptionnelle. | Login SSH direct interdit. |
guillaume / user nominatif | Acces humain auditable. | Sudo selon besoin. |
deploy | Deploiement applicatif automatise. | Acces limite aux dossiers applicatifs. |
app | Execution de l'application. | Pas de shell ou shell limite. |
backup | Jobs de sauvegarde. | Lecture ciblee, ecriture backup. |
gitlab-runner | Execution CI/CD. | Droits strictement necessaires. |
Commandes utilisateurs
# Creer un utilisateur nominatif
sudo adduser alice
sudo usermod -aG sudo alice
# Voir groupes
id alice
groups alice
# Voir sudo autorise
sudo -l
# Verifier comptes avec shell
awk -F: '$7 !~ /(nologin|false)/ {print $1, $7}' /etc/passwd
# Verifier derniers logins
last
lastlogSudoers propre
# Toujours utiliser visudo
sudo visudo
# Exemple fichier dedie
sudo visudo -f /etc/sudoers.d/deploy
# Exemple limite
deploy ALL=(root) NOPASSWD: /bin/systemctl restart myapp.service, /bin/systemctl status myapp.servicePrincipes sudo
| Principe | Pourquoi |
|---|---|
Utiliser visudo | Evite de casser sudo avec une syntaxe invalide. |
Preferer fichiers dans /etc/sudoers.d | Plus lisible et versionnable. |
| Limiter commandes NOPASSWD | Evite escalation trop large. |
| Eviter comptes partages | Audit impossible sinon. |
| Retirer comptes obsoletes | Reduit la surface d'attaque. |
Audit rapide des comptes
Audit users
│
├── comptes humains actifs
├── comptes techniques
├── membres sudo
├── shells ouverts
├── cles SSH autorisees
└── comptes inactifs a supprimerSSH hardening : acces distant sans exposition inutile
SSH est souvent la porte d'entree principale du serveur. Il doit etre protege par des cles, une configuration stricte, une limitation des utilisateurs, des logs surveilles et idealement une restriction reseau.
Configuration SSH recommandee
# /etc/ssh/sshd_config.d/hardening.conf
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
X11Forwarding no
AllowTcpForwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
# Exemple : limiter aux users autorises
AllowUsers guillaume deployValidation SSH
# Tester syntaxe
sudo sshd -t
# Recharger sans couper les sessions existantes
sudo systemctl reload ssh
sudo systemctl status ssh --no-pager
# Garder une session ouverte avant test nouvelle connexion
ssh -v user@serverAudit SSH
# Logs auth Debian/Ubuntu
sudo tail -n 100 /var/log/auth.log
sudo grep "Failed password" /var/log/auth.log | tail
sudo grep "Accepted publickey" /var/log/auth.log | tail
# Voir cles autorisees
sudo find /home -name authorized_keys -type f -print
# Permissions importantes
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keysPermissions SSH
| Fichier / dossier | Permission | Pourquoi |
|---|---|---|
~/.ssh | 700 | Repertoire prive. |
authorized_keys | 600 | Cles non modifiables par autres users. |
| Private key locale | 600 | SSH refuse les cles trop ouvertes. |
Firewall SSH
# UFW : exemple restrictif
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
sudo ufw deny 22/tcp
sudo ufw status verboseFirewall, ports ouverts et exposition reseau
Le firewall doit suivre une logique simple : tout fermer par defaut, ouvrir uniquement ce qui est utile, limiter les sources sensibles et verifier regulierement les ports vraiment ecoutes.
Commandes ports
# Ports en ecoute
sudo ss -tulpn
sudo ss -ltnp
# Process associe a un port
sudo lsof -iTCP -sTCP:LISTEN -P -n
# Test externe depuis une autre machine
nc -vz example.com 443
nc -vz example.com 22UFW exemple
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Web public
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# SSH limite a une IP admin
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
sudo ufw enable
sudo ufw status verbosenftables / iptables
# nftables
sudo nft list ruleset
# iptables
sudo iptables -L -n -v
sudo iptables -SMatrice d'exposition
| Port | Exposition recommandee | Commentaire |
|---|---|---|
| 22 SSH | IP admin uniquement. | Eviter public global. |
| 80 HTTP | Public si redirection HTTPS. | Peut etre ferme si HTTPS only strict. |
| 443 HTTPS | Public. | Port principal web. |
| 3306 MySQL | Prive uniquement. | Jamais internet direct. |
| 5432 PostgreSQL | Prive uniquement. | Security group interne. |
| 6379 Redis | Local ou prive uniquement. | Jamais expose public. |
| 8000 app | Local derriere Nginx. | Pas public si reverse proxy. |
Diagnostic firewall
Service inaccessible
│
▼
Service ecoute ?
├── Non → app/service down
└── Oui
▼
Port ouvert OS firewall ?
├── Non → UFW/nft/iptables
└── Oui
▼
Security Group / cloud firewall ?
├── Non → ouvrir source minimale
└── Oui → verifier route / LB / DNS0.0.0.0/0 sur SSH, DB, Redis, admin panels ou ports applicatifs internes pour tester rapidement.Systemd : services propres, restart policy et logs
Systemd est le superviseur standard de nombreux serveurs Linux. Un service systemd bien ecrit rend l'application redemarrable, observable, parametrable et plus stable en production.
Exemple service systemd
# /etc/systemd/system/myapp.service
[Unit]
Description=My Django Application
After=network.target
Wants=network-online.target
[Service]
User=app
Group=app
WorkingDirectory=/opt/myapp/current
EnvironmentFile=/etc/myapp/myapp.env
ExecStart=/opt/myapp/current/venv/bin/gunicorn config.wsgi:application --bind 127.0.0.1:8000
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
KillSignal=SIGTERM
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.targetCommandes systemd
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo systemctl status myapp --no-pager
sudo systemctl restart myapp
sudo journalctl -u myapp -n 100 --no-pager
sudo journalctl -u myapp -fOptions importantes
| Option | But |
|---|---|
User / Group | Eviter execution en root. |
WorkingDirectory | Contexte clair du service. |
EnvironmentFile | Separer config du service. |
Restart=on-failure | Redemarrage automatique en cas de crash. |
PrivateTmp=true | Isolation du repertoire temporaire. |
NoNewPrivileges=true | Limiter escalation de privileges. |
Diagnostic systemd
Service KO
│
▼
systemctl status
│
├── inactive
├── failed
├── restart loop
└── active but unhealthy
│
▼
journalctl -u service
│
├── erreur config
├── permission denied
├── port already in use
├── env missing
└── dependency failedService hardening check
systemd-analyze security myapp.service
Logs, journald, auth logs et audit operationnel
Les logs sont essentiels pour le debug, la securite et les post-mortems. Il faut conserver assez d'historique, eviter les logs contenant des secrets, et savoir rapidement retrouver une erreur par service.
Commandes journald
# Logs d'un service
journalctl -u nginx -n 100 --no-pager
journalctl -u myapp -f
# Logs depuis une date
journalctl -u myapp --since "2026-04-30 10:00:00"
# Erreurs systeme recentes
journalctl -p err -n 100 --no-pager
# Kernel logs
journalctl -k -n 100 --no-pager
# Taille journald
journalctl --disk-usageRotation journald
# Nettoyage ponctuel
sudo journalctl --vacuum-time=14d
sudo journalctl --vacuum-size=1G
# /etc/systemd/journald.conf
SystemMaxUse=1G
MaxRetentionSec=14dayLogs classiques
| Fichier | Usage |
|---|---|
/var/log/auth.log | SSH, sudo, authentification. |
/var/log/syslog | Evenements systeme Debian/Ubuntu. |
/var/log/nginx/access.log | Requetes HTTP. |
/var/log/nginx/error.log | Erreurs Nginx / proxy. |
journalctl -u service | Logs systemd d'un service. |
Audit acces
# Connexions SSH reussies
grep "Accepted" /var/log/auth.log | tail
# Echecs SSH
grep "Failed password" /var/log/auth.log | tail
# Sudo
grep "sudo:" /var/log/auth.log | tail
# Derniers logins
last
whoCe qu'il ne faut pas logger
| Tokens API | Rotation obligatoire si exposes. |
| Passwords / DB URL | Secrets persistants dans logs. |
| Private keys | Compromission critique. |
| Dumps complets de headers | Peuvent contenir cookies ou auth. |
Permissions, ownership, secrets et dossiers applicatifs
Les permissions Linux limitent ce qu'un utilisateur ou service peut lire, modifier ou executer. Un mauvais owner, un chmod 777 ou un secret lisible par tous peuvent transformer un bug applicatif en compromission serveur.
Commandes permissions
# Voir permissions
ls -la /opt/myapp
namei -l /opt/myapp/current/.env
# Changer owner
sudo chown -R app:app /opt/myapp/current
# Permissions dossiers/fichiers
sudo find /opt/myapp/current -type d -exec chmod 750 {} \;
sudo find /opt/myapp/current -type f -exec chmod 640 {} \;
# Executable script
sudo chmod 750 /opt/myapp/current/scripts/deploy.shSecrets applicatifs
# Exemple
sudo mkdir -p /etc/myapp
sudo chown root:app /etc/myapp
sudo chmod 750 /etc/myapp
sudo chown root:app /etc/myapp/myapp.env
sudo chmod 640 /etc/myapp/myapp.envPermissions recommandees
| Chemin | Owner | Mode |
|---|---|---|
/opt/myapp/current | app:app | 750 dossiers |
| Code applicatif | app:app | 640 fichiers |
| Scripts deploy | deploy:deploy | 750 |
/etc/myapp/myapp.env | root:app | 640 |
~/.ssh | User | 700 |
authorized_keys | User | 600 |
Recherche permissions dangereuses
# World writable
sudo find / -xdev -type d -perm -0002 -print 2>/dev/null
# Fichiers avec permission 777
sudo find / -xdev -perm -0777 -print 2>/dev/null
# SUID files
sudo find / -xdev -perm -4000 -type f -print 2>/dev/nullchmod 777 est presque toujours un signal d'alerte. Corriger owner/groupe plutot que tout ouvrir.Mises a jour, CVE, reboot et patch window
Les mises a jour corrigent des vulnerabilites et bugs, mais peuvent aussi casser un service si elles sont appliquees sans verification. En production, il faut un rythme, une fenetre, une verification et un plan de rollback.
Commandes Debian / Ubuntu
sudo apt update
apt list --upgradable
# Simuler upgrade
sudo apt -s upgrade
# Appliquer
sudo apt upgrade
# Security updates si unattended-upgrades configure
sudo unattended-upgrade --dry-run --debug
# Reboot requis ?
test -f /var/run/reboot-required && cat /var/run/reboot-requiredVerifier versions
uname -a
cat /etc/os-release
nginx -v
python3 --version
openssl version
systemctl --versionProcess patch production
Avant patch
├── verifier backups / snapshot
├── lire packages upgradable
├── identifier services critiques
├── prevoir fenetre
└── preparer rollback
Pendant
├── appliquer updates
├── surveiller logs
├── redemarrer services si besoin
└── reboot si necessaire
Apres
├── health checks
├── logs propres
├── ports OK
├── metrics stables
└── note de changementPolitique recommandee
| Type update | Frequence | Controle |
|---|---|---|
| Security critical | Rapide. | Fenetre courte + validation. |
| Security standard | Hebdo / bihebdo. | Patch window. |
| Kernel | Planifie. | Reboot requis. |
| Major version | Projet dedie. | Staging, backup, rollback. |
Runbook Linux hardening et diagnostic production
Procedure audit rapide serveur
1. Identifier serveur, role et environnement.
2. Verifier uptime, disque, RAM, CPU.
3. Lister ports ecoutes.
4. Verifier firewall OS et cloud.
5. Verifier SSH : root login, password auth, users.
6. Verifier services systemd critiques.
7. Lire logs auth et logs services.
8. Verifier permissions des secrets.
9. Verifier updates disponibles et reboot requis.
10. Documenter risques et actions.Commandes audit rapide
hostnamectl
uptime
df -h
free -h
ss -tulpn
systemctl --failed
systemctl list-units --type=service --state=running
journalctl -p err -n 100 --no-pager
sudo ufw status verbose
sudo grep -E "PermitRootLogin|PasswordAuthentication" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*Mitigations courantes
| Probleme | Mitigation | Prudence |
|---|---|---|
| SSH attaque brute force | Limiter IP, Fail2ban, keys only. | Ne pas se lock out. |
| Service crash loop | Lire journald, rollback release, restart cible. | Ne pas masquer cause. |
| Disque plein | Nettoyer logs, journald, /tmp, backups obsoletes. | Ne jamais supprimer fichiers DB au hasard. |
| Port expose | Fermer firewall ou limiter source. | Verifier dependances. |
| Permission trop ouverte | Corriger owner/groupe/mode. | Tester service apres changement. |
| Update critique | Patch window + reboot controle. | Snapshot / backup avant. |
Timeline action sensible
Avant action
├── contexte confirme
├── rollback connu
├── session SSH de secours
└── commande relue
Action
├── modification minimale
├── test syntaxe
├── reload plutot que restart si possible
└── logs surveilles
Apres action
├── service OK
├── ports OK
├── healthcheck OK
└── note de changementAnti-patterns Linux hardening
| Anti-pattern | Pourquoi c'est dangereux | Correction professionnelle |
|---|---|---|
| SSH root direct | Compte cible evident pour attaques. | PermitRootLogin no et sudo nominatif. |
| PasswordAuthentication active | Risque brute force. | SSH keys only. |
chmod 777 | Tout le monde peut modifier. | Corriger owner/groupe. |
| Ports DB exposes public | Risque compromission directe. | Reseau prive ou source limitee. |
| Service systemd en root | Impact maximal si app compromise. | User applicatif dedie. |
| Logs non rotates | Disque plein. | journald limits + logrotate. |
| Updates jamais appliquees | CVE accumulees. | Patch process regulier. |
| Firewall ouvert pour debug | Exposition oubliee apres incident. | Regles temporaires documentees et expirees. |
Mauvais modele
Serveur fragile
├── root SSH autorise
├── passwords SSH
├── ports internes publics
├── services en root
├── chmod 777
├── logs non limites
└── updates oublieesBon modele
Serveur durci
├── SSH keys only
├── no root login
├── firewall minimal
├── users separes
├── systemd non-root
├── logs surveilles
├── permissions strictes
└── patch processChecklist Linux hardening
Checklist securite serveur
| Controle | Validation attendue |
|---|---|
| Root SSH interdit | PermitRootLogin no. |
| Password SSH interdit | PasswordAuthentication no. |
| Users nominatifs | Pas de compte humain partage. |
| Sudo limite | Pas de sudo global inutile. |
| Firewall actif | Ports publics limites. |
| Ports verifies | ss -tulpn connu et documente. |
| Services non-root | Applications sous user dedie. |
| Secrets proteges | Fichiers env non world-readable. |
| Logs conserves | journald/logrotate configures. |
| Updates suivies | Patch process et reboot planifies. |
Checklist avant changement sensible
| Session SSH de secours ouverte | Evite lock-out. |
| Commande relue | Pas d'action destructive improvisee. |
| Rollback connu | Ancienne config sauvegardee. |
| Test syntaxe | sshd -t, nginx -t, etc. |
| Reload plutot que restart | Quand possible. |
| Post-check | Service, port, logs, health. |
Checklist diagnostic production
| Question | Commande utile |
|---|---|
| Le serveur est-il sous pression ? | uptime, top, free -h. |
| Le disque est-il plein ? | df -h, df -i. |
| Quels ports ecoutent ? | ss -tulpn. |
| Quels services sont failed ? | systemctl --failed. |
| Pourquoi un service tombe ? | journalctl -u service. |
| SSH subit-il des attaques ? | grep "Failed password" /var/log/auth.log. |
| Un reboot est-il requis ? | test -f /var/run/reboot-required. |
Mini-cheat-sheet
# System
hostnamectl
uptime
df -h
df -i
free -h
ss -tulpn
# SSH
sudo sshd -t
sudo systemctl reload ssh
grep "Failed password" /var/log/auth.log | tail
grep "Accepted publickey" /var/log/auth.log | tail
# Firewall
sudo ufw status verbose
sudo nft list ruleset
sudo iptables -L -n -v
# Systemd
systemctl --failed
systemctl status myapp --no-pager
journalctl -u myapp -n 100 --no-pager
systemd-analyze security myapp.service
# Updates
sudo apt update
apt list --upgradable
test -f /var/run/reboot-required && cat /var/run/reboot-requiredFormer un DevOps : transformer la documentation en competence terrain
Former un nouveau DevOps ne consiste pas seulement a lui donner une liste de commandes. Il faut lui apprendre a raisonner en production : contexte, risque, environnement, rollback, logs, permissions, pipeline, state, secrets, monitoring et communication.
Un bon parcours alterne theorie courte, lecture de vrais exemples, exercices en sandbox, erreurs volontaires, revues de Merge Request, simulation d'incident et observation de vrais rituels d'equipe. L'objectif est que le junior sache expliquer ce qu'il fait, pourquoi il le fait, quel est le risque et comment revenir en arriere.
Les piliers de la formation DevOps
| Pilier | Objectif | Exemple concret |
|---|---|---|
| Comprendre | Lire architecture, pipelines et runbooks. | Expliquer un pipeline Terraform de bout en bout. |
| Pratiquer | Executer en sandbox sans risque production. | Faire un plan Terraform sans apply. |
| Diagnostiquer | Observer avant d'agir. | Lire logs Nginx, systemd, GitLab runner. |
| Revoir | Apprendre via feedback structure. | MR commentee avec risques et rollback. |
| Simuler | Creer des incidents controles. | Pipeline casse, secret manquant, lock Terraform. |
| Documenter | Transformer l'experience en savoir collectif. | Mini RCA, runbook, note de changement. |
Parcours mental d'apprentissage
Nouveau DevOps
│
▼
Lire
├── architecture
├── guide CI/CD
├── runbooks
└── incidents passes
│
▼
Observer
├── pipelines reels
├── revues MR
├── dashboards
└── post-mortems
│
▼
Pratiquer en sandbox
├── terraform plan
├── debug pipeline
├── restart service
└── lecture logs
│
▼
Agir en staging
├── MR simple
├── deploy controle
├── rollback test
└── smoke tests
│
▼
Contribuer en production
├── sous supervision
├── avec runbook
├── avec rollback
└── avec traceCe qu'un junior doit apprendre tot
| Reflexe | Pourquoi |
|---|---|
| Afficher l'environnement cible | Eviter confusion dev/staging/prod. |
| Lire avant d'ecrire | Reduire les actions dangereuses. |
| Preparer rollback | Ne pas improviser sous pression. |
| Ne jamais exposer les secrets | Les logs et artifacts persistent. |
| Documenter le pourquoi | La commande seule ne suffit pas. |
Progression : de lecteur prudent a operateur autonome
Une progression saine donne de l'autonomie par paliers. Chaque palier ajoute un peu plus de responsabilite, mais aussi plus de discipline : revue, validation, trace et communication.
Niveaux de progression
| Niveau | Ce que le junior fait | Garde-fou |
|---|---|---|
| 0. Observation | Lit les pipelines, runbooks, logs et MR. | Aucune action de modification. |
| 1. Lecture active | Explique un incident ou un pipeline. | Validation senior. |
| 2. Sandbox | Execute commandes sans impact production. | Environnement isole. |
| 3. Staging | Propose une MR simple, lance plan/deploy staging. | MR review obligatoire. |
| 4. Production accompagnee | Suit un runbook production avec senior. | Supervision directe. |
| 5. Autonomie controlee | Gere changements standards et incidents simples. | Post-review et escalation claire. |
Competences par palier
| Palier | Competence attendue |
|---|---|
| Semaine 1 | Comprendre architecture, repos, environnements, outils. |
| Semaine 2 | Lire logs, pipelines, Terraform plan, dashboards. |
| Mois 1 | Faire MR infra simple et deploy staging. |
| Mois 2 | Diagnostiquer pipeline ou incident staging. |
| Mois 3 | Participer a production avec runbook et supervision. |
Escalier d'autonomie
Niveau 0
Observer
│
▼
Niveau 1
Expliquer
│
▼
Niveau 2
Executer en sandbox
│
▼
Niveau 3
Changer staging
│
▼
Niveau 4
Production accompagnee
│
▼
Niveau 5
Production standard autonome
│
▼
Niveau 6
Incident lead junior superviseCritere pour passer au niveau suivant
| Critere | Preuve attendue |
|---|---|
| Comprend le risque | Peut expliquer impact et rollback. |
| Utilise bons outils | Pipeline, logs, dashboards, runbooks. |
| Ne cache pas l'incertitude | Escalade quand il ne sait pas. |
| Documente | MR claire, note de changement, RCA courte. |
| Respecte securite | Pas de secrets exposes, pas de droits inutiles. |
Exercices pratiques : apprendre avec de vrais gestes DevOps
Les exercices doivent reproduire les situations reelles sans risque : pipeline qui echoue, plan Terraform a relire, service systemd a diagnostiquer, incident Nginx, secret manquant, saturation disque, healthcheck casse ou rollback staging.
Catalogue d'exercices
| Exercice | Objectif | Niveau |
|---|---|---|
| Lire un Terraform plan | Identifier create/update/delete et risque. | Debutant |
| Debug pipeline GitLab | Trouver variable manquante ou artifact absent. | Debutant/intermediaire |
| Service systemd KO | Lire status, journald, env file, permissions. | Intermediaire |
| Nginx 502 | Tester upstream, logs, ports, service app. | Intermediaire |
| State lock Terraform | Comprendre lock, apply concurrent, force-unlock. | Intermediaire |
| Rollback staging | Revenir a version precedente proprement. | Intermediaire |
| Mini incident DB | Connexions, locks, slow query en lecture seule. | Avance |
| Post-mortem court | Transformer incident en apprentissage. | Tous niveaux |
Exercice : lire un plan Terraform
Mission:
- Ouvrir plan.txt
- Compter create / update / delete
- Identifier ressources critiques
- Expliquer pourquoi le changement est attendu
- Identifier rollback ou mitigation
Questions:
- Y a-t-il un destroy ?
- Le state semble-t-il correspondre au bon environnement ?
- Les tags/naming sont-ils corrects ?
- Le changement touche-t-il production ?
- Qui doit approuver ?Exercice : pipeline GitLab casse
Scenario:
- terraform_plan echoue
- Message: TF_ROOT directory not found
- Objectif: diagnostiquer sans modifier production
Steps:
1. Lire le log depuis le debut.
2. Afficher CI_COMMIT_BRANCH, CI_PIPELINE_SOURCE, TF_ROOT.
3. Verifier pwd et ls.
4. Corriger la variable dans la MR.
5. Relancer uniquement le job utile.
6. Documenter la cause.Exercice : service systemd
Scenario:
- myapp.service est failed
- Le endpoint /health ne repond plus
Commands:
systemctl status myapp --no-pager
journalctl -u myapp -n 100 --no-pager
ss -tulpn | grep 8000
cat /etc/myapp/myapp.env
ls -la /opt/myapp/current
Expected:
- Identifier cause
- Proposer mitigation
- Relancer proprement si justifie
- Verifier health endpointErreurs volontaires : apprendre sans casser la production
Les erreurs volontaires sont tres efficaces pour former les reflexes. Elles doivent etre creees dans un environnement controle, documentees, reproductibles et corrigees ensuite en groupe.
Bibliotheque d'erreurs pedagogiques
| Erreur volontaire | Symptome | Competence apprise |
|---|---|---|
| Variable GitLab manquante | Job auth failed ou variable empty. | Variables masked/protected/scoped. |
Mauvais TF_ROOT | cd: no such file. | Debug chemins CI. |
| Artifact Terraform absent | Apply ne trouve pas tfplan. | dependencies / needs / paths. |
| Nginx upstream faux | 502 Bad Gateway. | Tester upstream et logs Nginx. |
| Permission env file incorrecte | Service systemd ne demarre pas. | Permissions et users services. |
| Port firewall ferme | Timeout externe. | ss, nc, UFW, security groups. |
| Secret expose en log sandbox | Token visible. | Rotation et hygiene logs. |
Format d'un exercice d'erreur
Exercise:
- Title: Broken GitLab artifact
- Environment: sandbox only
- Injected error: wrong artifact path
- Expected symptom: apply job cannot find tfplan
- Allowed actions: read logs, inspect job config, MR fix
- Forbidden actions: bypass apply, recreate state
- Success: trainee explains cause and fixCycle d'apprentissage par erreur
Erreur volontaire
│
▼
Junior observe
├── logs
├── metrics
├── pipeline
└── config
│
▼
Hypothese
├── cause probable
├── risque
└── test de validation
│
▼
Correction
├── MR
├── commande sandbox
└── verification
│
▼
Debrief
├── ce qui a marche
├── ce qui a manque
├── runbook update
└── point de vigilanceRegles de securite
| Regle | Pourquoi |
|---|---|
| Jamais en production | Une erreur pedagogique ne doit pas impacter les utilisateurs. |
| Donnees fictives | Eviter fuite ou destruction de donnees sensibles. |
| Rollback simple | Remettre l'environnement propre rapidement. |
| Objectif annonce | Eviter piege humiliant ou flou. |
| Debrief obligatoire | Transformer l'erreur en connaissance. |
Revues : apprendre a travers les MR, plans et incidents
La revue est le meilleur outil de transmission senior → junior. Elle apprend la rigueur : pourquoi ce changement, quel risque, quel environnement, quel plan, quel rollback, quelle observation apres execution.
Checklist de revue MR DevOps
| Point | Question de revue |
|---|---|
| Contexte | Pourquoi ce changement est-il necessaire ? |
| Environnement | Dev, staging ou production ? |
| Terraform plan | Y a-t-il un destroy ou remplacement inattendu ? |
| Secrets | Un secret est-il ajoute dans Git ou logs ? |
| IAM | Le droit ajoute est-il minimal ? |
| CI/CD | Le pipeline est-il reproductible et protege ? |
| Rollback | Comment revenir en arriere ? |
| Post-check | Comment prouver que c'est OK ? |
Exemple commentaire MR
Review comment:
- The change is clear and limited to staging.
- Terraform plan shows 2 creates and 0 destroy.
- Please add the rollback note:
"Revert this MR and re-apply previous module version."
- Please include post-check:
curl -fsS https://staging.example.com/health/
- Approved after rollback note is added.Revue de plan Terraform
Terraform plan review
│
├── resources added
├── resources changed
├── resources destroyed
├── IAM changes
├── network exposure
├── database impact
├── cost impact
└── rollback pathFeedback senior utile
| Feedback faible | Feedback utile |
|---|---|
| “Pas bon.” | “Le plan detruit une ressource prod non mentionnee.” |
| “Corrige.” | “Ajoute une variable scoped staging pour eviter prod.” |
| “Pourquoi ?” | “Explique le rollback et le post-check dans la MR.” |
| “Trop dangereux.” | “Separe IAM et reseau en deux MR pour reduire le risque.” |
Rituels d'equipe : rendre l'apprentissage continu
La formation ne doit pas etre un evenement ponctuel. Les meilleurs apprentissages viennent des rituels courts et reguliers : revue d'incident, revue de plan, demo de pipeline, lecture de logs et partage d'un runbook.
Rituels recommandés
| Rituel | Frequence | But |
|---|---|---|
| Revue de plan Terraform | Hebdomadaire | Apprendre a lire les risques infra. |
| Debug pipeline live | Hebdomadaire ou bihebdo | Former aux logs GitLab et runners. |
| Incident review | Apres incident | Comprendre cause et prevention. |
| Runbook reading | Mensuelle | Verifier que la doc est utilisable. |
| Game day staging | Mensuelle/trimestrielle | Simuler panne sans risque utilisateur. |
| Office hour DevOps | Hebdomadaire | Questions juniors, dette, bonnes pratiques. |
Agenda type : revue de plan
Duration: 30 minutes
1. Context of the change
2. Read Terraform plan summary
3. Identify risky resources
4. Discuss IAM/network/database impact
5. Define rollback
6. Define post-checks
7. Capture learning pointsCycle de rituel d'equipe
Chaque semaine
│
├── 1 plan Terraform commente
├── 1 pipeline explique
├── 1 log incident lu
└── 1 runbook ameliore
│
▼
Chaque mois
├── game day staging
├── access review simple
├── backup/restore drill
└── documentation cleanup
│
▼
Chaque incident
├── timeline
├── RCA
├── action preventive
└── formation associeeBonnes pratiques de rituel
| Court | 30 a 45 minutes maximum pour garder l'attention. |
| Concret | Un vrai plan, un vrai log, une vraie MR. |
| Sans blame | On analyse le systeme, pas la personne. |
| Actionnable | Chaque rituel produit une amelioration. |
| Documente | Les apprentissages vont dans le guide ou runbook. |
Culture production : apprendre la prudence sans bloquer l'autonomie
Un DevOps doit apprendre que la production n'est pas seulement un environnement technique : c'est un systeme vivant avec utilisateurs, donnees, couts, securite, astreinte, support, SLA et reputation.
Reflexes production
| Reflexe | Question a se poser |
|---|---|
| Impact | Qui sera touche si cela casse ? |
| Fenetre | Est-ce le bon moment pour ce changement ? |
| Rollback | Comment revenir en arriere rapidement ? |
| Observation | Quels dashboards/logs regarder pendant et apres ? |
| Communication | Qui doit etre informe ? |
| Donnees | Peut-on perdre, corrompre ou exposer des donnees ? |
| Securite | Ce changement ouvre-t-il des droits ou ports ? |
Phrase que le junior doit savoir formuler
I am changing:
- what: the exact component
- where: the exact environment
- why: the business or technical reason
- risk: what can go wrong
- rollback: how to revert
- validation: how to prove it works
- owner: who is accountableDecision production
Changement demande
│
▼
Risque faible ?
├── Oui
│ ├── MR
│ ├── plan/review
│ └── apply standard
│
└── Non
▼
Risque moyen/fort
├── fenetre de changement
├── senior approver
├── rollback teste
├── dashboards ouverts
├── communication
└── post-checksCe qu'il faut enseigner explicitement
| Sujet | Pourquoi |
|---|---|
| Ne pas paniquer | Observer avant d'agir. |
| Dire “je ne sais pas” | L'incertitude cachee est dangereuse. |
| Escalader tot | Mieux vaut appeler trop tot que trop tard. |
| Ne pas masquer une erreur | La transparence reduit l'impact. |
| Tracer les actions | Indispensable en RCA. |
Evaluation : verifier l'autonomie sans pieger
Evaluer un DevOps ne consiste pas a voir s'il connait toutes les commandes par coeur. Il faut verifier sa methode : diagnostic, prudence, clarte, securite, documentation, communication et capacite a demander de l'aide.
Grille d'evaluation
| Competence | Debutant | Autonome |
|---|---|---|
| Contexte | Suit les instructions. | Identifie environnement, impact et risque. |
| Terraform | Lance fmt/validate/plan. | Interprete plan et detecte destroy inattendu. |
| GitLab CI | Lit un job echoue. | Diagnostique runner, variables, artifacts. |
| Linux | Lit systemctl et journalctl. | Trouve cause permission/env/port/service. |
| Securite | Sait qu'il ne faut pas exposer secrets. | Detecte fuite potentielle et propose rotation. |
| Production | Demande confirmation. | Prepare rollback, post-check et communication. |
Exercice d'evaluation
Scenario:
- A staging deployment failed.
- The app is returning 502.
- GitLab pipeline was green.
- Nginx is running.
- The app service is failed.
Expected trainee actions:
1. Confirm environment.
2. Read Nginx error logs.
3. Check systemd service status.
4. Read journalctl.
5. Identify missing EnvironmentFile.
6. Propose fix.
7. Validate health endpoint.
8. Write short RCA.Notation qualitative
| Niveau | Description |
|---|---|
| 1. Suit | Execute une procedure connue avec supervision. |
| 2. Explique | Peut expliquer ce que fait la procedure. |
| 3. Diagnostique | Formule hypotheses et les verifie. |
| 4. Corrige | Propose une correction minimale et reversible. |
| 5. Transmet | Ameliore le runbook et partage l'apprentissage. |
Signaux positifs
- Le junior lit les logs avant de relancer.
- Il annonce l'environnement cible avant une commande.
- Il detecte les secrets ou outputs sensibles.
- Il propose un rollback avant un changement.
- Il documente clairement ce qu'il a appris.
- Il escalade quand l'incertitude devient dangereuse.
Plan 30 / 60 / 90 jours pour nouveaux DevOps
Un plan 30/60/90 rend l'onboarding visible. Il aide le junior, le mentor et l'equipe a savoir ce qui est attendu, ce qui est acquis et ce qui reste a pratiquer.
Plan 30 jours
| Objectif | Livrable |
|---|---|
| Comprendre l'architecture | Schema simple du flux applicatif. |
| Lire les pipelines | Explication d'un pipeline GitLab existant. |
| Lire Terraform | Resume d'un module et d'un plan. |
| Connaitre les runbooks | Lecture guidee de 3 runbooks. |
| Premiers exercices | Sandbox : plan, logs, systemd, curl health. |
Plan 60 jours
| MR infra simple | Modification non critique avec plan et rollback. |
| Debug pipeline | Correction d'un job staging casse. |
| Incident simule | Mini RCA apres game day. |
| Documentation | Amelioration d'un runbook existant. |
Plan 90 jours
| Objectif | Livrable |
|---|---|
| Staging autonome | Deploiement staging complet avec post-check. |
| Production accompagnee | Participation a un changement prod standard. |
| Diagnostic autonome | Pipeline ou service systemd resolu. |
| Runbook owner junior | Responsable d'un runbook simple. |
| Presentation equipe | Retour d'apprentissage de 15 minutes. |
Roadmap visuelle
Jours 1-30
Lire, comprendre, observer
│
▼
Jours 31-60
Pratiquer, corriger staging, documenter
│
▼
Jours 61-90
Contribuer production accompagnee
│
▼
Apres 90 jours
Autonomie standard + apprentissage continuAnti-patterns de formation DevOps
| Anti-pattern | Pourquoi c'est dangereux | Correction professionnelle |
|---|---|---|
| Donner seulement des commandes | Le junior execute sans comprendre le risque. | Expliquer contexte, impact et rollback. |
| Former directement en production | Erreur d'apprentissage = incident utilisateur. | Sandbox, staging, supervision. |
| Pas de progression | Autonomie floue et anxiete. | Paliers 30/60/90 et niveaux d'autonomie. |
| Feedback brutal ou vague | Bloque l'apprentissage. | Feedback factuel, precis et actionnable. |
| Runbooks jamais testes | La doc echoue pendant l'incident. | Game days et lecture runbook. |
| Culture du blame | Les erreurs sont cachees. | Post-mortem sans blame. |
| Pas d'exercices d'incident | Premiere vraie crise = premiere pratique. | Incidents simules en staging. |
| Senior garde tout en tete | Dependance individuelle. | Documentation et transmission systematique. |
Mauvais modele
Formation fragile
├── commandes copiees
├── pas de contexte
├── pas de sandbox
├── feedback flou
├── production trop tot
├── erreurs cachees
└── documentation passiveBon modele
Formation professionnelle
├── progression par paliers
├── exercices controles
├── erreurs volontaires
├── revues MR
├── game days
├── documentation active
└── culture sans blameChecklist Former les nouveaux DevOps
Checklist onboarding
| Controle | Validation attendue |
|---|---|
| Mentor assigne | Un senior referent est disponible. |
| Acces limites | Droits progressifs, pas admin global. |
| Environnements expliques | Dev, staging, prod et risques connus. |
| Runbooks lus | Incident, rollback, pipeline, Linux, DB. |
| Sandbox disponible | Exercices sans impact utilisateur. |
| Premiere MR simple | Avec review, plan et rollback. |
| Game day planifie | Incident simule en staging. |
| Feedback recurrent | Hebdo au debut, puis regulier. |
Checklist exercice
| Objectif clair | Competence visee explicite. |
| Environnement controle | Sandbox ou staging. |
| Risque limite | Pas de donnees sensibles ni prod. |
| Correction attendue | Solution et criteres de reussite. |
| Debrief | Ce qui a ete appris et doc a modifier. |
Checklist autonomie production
| Question | Reponse attendue |
|---|---|
| Sait-il identifier le bon environnement ? | Oui, toujours avant action. |
| Sait-il lire un plan Terraform ? | Create/update/delete, risque, rollback. |
| Sait-il debugger un pipeline ? | Runner, variables, paths, artifacts, logs. |
| Sait-il lire Linux/systemd ? | status, journalctl, ports, permissions. |
| Sait-il proteger les secrets ? | Pas d'env/printenv, rotation si fuite. |
| Sait-il preparer un rollback ? | Procedure claire avant changement. |
| Sait-il escalader ? | Oui, avant action irreversible. |
| Sait-il documenter ? | MR, runbook, RCA, note de changement. |
Mini-cheat-sheet formation
Training essentials:
- Start with reading and observation
- Use sandbox before staging
- Use staging before production
- Teach rollback before apply
- Teach logs before restart
- Teach plan review before merge
- Teach secret hygiene before CI debug
- Use game days for incident reflexes
- Use MR reviews for real feedback
- Document every repeated lessonGlossaire DevOps : parler le meme langage en production
Le vocabulaire DevOps peut etre intimidant pour un nouveau membre d'equipe : SLA, SLO, RTO, RPO, rollback, drift, state, runner, artifact, blast radius, healthcheck, canary, IAM, OIDC, RBAC, observabilite, post-mortem.
Un glossaire utile ne doit pas etre une liste academique. Il doit relier chaque terme a une situation concrete : revue de MR, incident production, pipeline GitLab, Terraform plan, audit securite, changement reseau ou deploiement applicatif.
Les familles de vocabulaire
| Famille | Exemples | Pourquoi c'est important |
|---|---|---|
| Production | SLA, SLO, SLI, RTO, RPO, rollback. | Relie technique, risque et utilisateur. |
| CI/CD | Pipeline, runner, artifact, stage, job, approval. | Comprendre comment le changement arrive en prod. |
| Terraform | State, plan, apply, drift, module, provider. | Eviter les erreurs d'infrastructure. |
| Cloud | VPC, subnet, security group, IAM, load balancer. | Comprendre le chemin reseau et les droits. |
| Securite | Least privilege, OIDC, RBAC, secrets, break-glass. | Reduire le blast radius et proteger les acces. |
| Observabilite | Logs, metrics, traces, alerting, dashboard. | Diagnostiquer avec des faits. |
Carte mentale DevOps
DevOps vocabulary
│
├── Change
│ ├── MR
│ ├── pipeline
│ ├── plan
│ ├── deploy
│ └── rollback
│
├── Production
│ ├── SLA / SLO / SLI
│ ├── incident
│ ├── mitigation
│ ├── RCA
│ └── post-mortem
│
├── Infrastructure
│ ├── Terraform
│ ├── cloud
│ ├── network
│ ├── IAM
│ └── Kubernetes
│
└── Observability
├── logs
├── metrics
├── traces
├── alerts
└── dashboardsMots a maitriser en premier
| Terme | Definition courte |
|---|---|
| Rollback | Retour a un etat stable precedent. |
| Blast radius | Perimetre maximal impacte par une erreur. |
| State | Memoire Terraform de l'infrastructure geree. |
| Artifact | Fichier produit par un pipeline : plan, build, rapport. |
| Healthcheck | Test rapide indiquant si un service est utilisable. |
| RCA | Analyse de cause racine apres incident. |
Production : SLA, SLO, SLI, RTO, RPO, rollback
Termes production essentiels
| Terme | Definition simple | Exemple |
|---|---|---|
| SLA | Engagement contractuel de service. | Disponibilite 99.9% par mois. |
| SLO | Objectif interne mesurable. | 95% des requetes repondent sous 300 ms. |
| SLI | Indicateur qui mesure le service. | Latence p95, taux de 5xx, uptime. |
| RTO | Temps maximal acceptable pour restaurer le service. | Remettre l'API en ligne en 30 minutes. |
| RPO | Perte de donnees maximale acceptable. | Perdre au maximum 5 minutes de donnees. |
| Rollback | Retour a une version ou config precedente. | Revenir a l'image Docker N-1. |
| Mitigation | Action qui reduit l'impact sans forcement corriger la cause. | Desactiver une feature flag en incident. |
Difference SLA / SLO / SLI
SLI = ce que l'on mesure
└── ex: taux de 5xx
SLO = objectif interne
└── ex: 5xx < 1% sur 30 jours
SLA = engagement externe
└── ex: credit client si disponibilite non respecteeTermes lies au changement
| Terme | Usage operationnel |
|---|---|
| Change window | Fenetre autorisee pour modifier production. |
| Freeze | Periode ou les changements sont limites. |
| Go / No-go | Decision de continuer ou bloquer un changement. |
| Post-check | Verification apres action : health, logs, metrics. |
| Backout plan | Plan de retour arriere si le changement echoue. |
| Degradation mode | Mode reduit mais encore utilisable du service. |
Phrase type
Before production change:
- SLI to watch: HTTP 5xx and p95 latency
- SLO risk: latency may exceed target during rollout
- Rollback: deploy previous image digest
- RTO target: service restored within 15 minutes
- RPO impact: no expected data lossCI/CD : pipeline, job, runner, artifact, environment, approval
Glossaire GitLab CI/CD
| Terme | Definition | Exemple |
|---|---|---|
| Pipeline | Ensemble de jobs executes pour tester, construire, deployer. | test -> build -> plan -> deploy. |
| Stage | Etape logique du pipeline. | validate, plan, apply. |
| Job | Unite d'execution dans un stage. | terraform_plan_prod. |
| Runner | Machine ou container qui execute les jobs. | Runner protege production. |
| Artifact | Fichier produit et conserve par un job. | tfplan, plan.txt, rapport scan. |
| Cache | Fichiers reutilises pour accelerer les jobs. | Cache dependencies npm/pip. |
| Environment | Cible logique de deploiement. | staging, production. |
| Approval | Validation humaine avant action sensible. | Manual job apply production. |
Flux CI/CD
Commit
│
▼
Pipeline
├── lint
├── test
├── build
├── security scan
├── terraform plan
└── deploy
│
▼
Artifacts
├── image
├── plan
├── reports
└── release notesTermes souvent confondus
| Terme | A ne pas confondre avec | Difference |
|---|---|---|
| Artifact | Cache | Artifact sert a transmettre ou auditer ; cache accelere. |
| Runner | Pipeline | Runner execute ; pipeline orchestre les jobs. |
| Variable masked | Variable protected | Masked cache l'affichage ; protected limite le contexte. |
| Manual job | Approval complet | Manual seul ne suffit pas si droits trop larges. |
| Include | Extends | Include importe un fichier ; extends herite d'un job. |
Phrase de debug
The pipeline failed in the plan stage.
The job ran on the protected runner.
The artifact tfplan was not produced.
The apply job cannot continue because it depends on that artifact.Terraform : state, plan, apply, drift, provider, module
Glossaire Terraform
| Terme | Definition | Risque associe |
|---|---|---|
| Provider | Plugin qui parle a une API. | Mauvaise version = comportement different. |
| Resource | Objet gere par Terraform. | Destroy inattendu si mal configure. |
| Module | Bloc reutilisable de ressources. | Changement module impacte plusieurs envs. |
| State | Memoire des objets connus par Terraform. | State perdu ou corrompu = risque majeur. |
| Backend | Lieu ou le state est stocke. | Backend local en equipe = dangereux. |
| Lock | Verrou empechant deux apply concurrents. | Force-unlock abusif = corruption possible. |
| Plan | Simulation du changement. | Non lu = destroy cache possible. |
| Apply | Execution du changement. | Impact reel sur cloud/production. |
| Drift | Ecart entre state et realite. | Plan surprenant ou correction involontaire. |
Cycle Terraform
Code Terraform
│
▼
terraform fmt
│
▼
terraform validate
│
▼
terraform plan
│
├── create
├── update
├── replace
└── destroy
│
▼
Review humaine
│
▼
terraform apply
│
▼
State mis a jourCommandes associees
terraform fmt -recursive
terraform validate
terraform init
terraform plan -out=tfplan
terraform show -no-color tfplan
terraform show -json tfplan
terraform apply tfplan
terraform state list
terraform state show RESOURCE
terraform import RESOURCE IDPhrase de revue
The plan creates 2 resources, updates 1 security group,
and destroys 0 resources. The backend points to staging,
not production. No unexpected replacement is visible.terraform apply sans lecture du plan est une prise de risque, surtout en production.Cloud / Infrastructure : VPC, subnet, security group, LB, DNS
Glossaire cloud
| Terme | Definition simple | Exemple incident |
|---|---|---|
| VPC / VNet | Reseau prive cloud. | Peering absent entre deux VPC. |
| Subnet | Sous-reseau dans une zone. | Instance en subnet prive sans NAT. |
| Route table | Regles de routage reseau. | Pas de route vers internet gateway. |
| Security group | Firewall attache aux ressources. | Port 443 ferme par erreur. |
| NACL | Firewall stateless au niveau subnet. | Ports ephemeres bloques. |
| Load balancer | Distribue le trafic vers backends. | Targets unhealthy. |
| DNS record | Associe un nom a une cible. | CNAME pointe vers ancien LB. |
| Managed service | Service gere par le cloud provider. | DB managée avec maintenance window. |
Chemin reseau type
User
│
▼
DNS
│
▼
Load Balancer
│
▼
Security Group
│
▼
Subnet / Route Table
│
▼
Instance / Pod / Service
│
▼
Database / Cache / QueueConfusions frequentes
| Confusion | Clarification |
|---|---|
| Security group vs firewall OS | SG est cloud ; UFW/nftables est dans la VM. |
| Public subnet vs public IP | Un subnet public a une route ; l'instance peut ou non avoir une IP publique. |
| DNS OK vs service OK | DNS peut resoudre vers une cible qui ne repond pas. |
| LB healthy vs app totalement saine | Healthcheck peut etre trop superficiel. |
| Route aller vs route retour | Le retour peut etre bloque par NACL, route ou firewall. |
Commandes terrain
dig example.com
curl -vk https://example.com/health/
nc -vz example.com 443
ip route
ss -tulpn
traceroute example.com
tracepath example.comSecurite : IAM, RBAC, OIDC, secrets, least privilege
Glossaire securite DevOps
| Terme | Definition | Exemple |
|---|---|---|
| IAM | Gestion des identites et permissions. | Role Terraform apply production. |
| RBAC | Droits bases sur les roles. | Role Kubernetes lecture namespace. |
| OIDC | Federation d'identite via token court. | GitLab assume un role cloud sans secret long terme. |
| Least privilege | Donner uniquement les droits necessaires. | Plan role different de apply role. |
| Secret | Information sensible. | Password DB, token API, private key. |
| Break-glass | Acces d'urgence exceptionnel. | Role admin temporaire en incident critique. |
| Supply chain | Chaine qui produit et livre le logiciel. | Images Docker, dependencies, runners. |
| Blast radius | Perimetre d'impact d'une erreur ou attaque. | Un token prod peut modifier tous les buckets. |
Exemples de phrases securite
This role violates least privilege because it allows Action="*".
The GitLab job should use OIDC instead of long-lived cloud keys.
The secret was printed in logs, so it must be rotated.
This break-glass access must be linked to an incident ticket.
The blast radius is limited to staging because the role cannot assume prod.Termes a associer
| Terme | Va souvent avec |
|---|---|
| Secret | Masked, protected, rotation, vault. |
| IAM | Role, policy, trust policy, assume-role. |
| OIDC | Temporary credentials, audience, subject. |
| RBAC | Namespace, service account, permissions. |
| Break-glass | MFA, ticket, audit, expiration. |
Observabilite : logs, metrics, traces, alerts, dashboards
Glossaire observabilite
| Terme | Definition | Exemple |
|---|---|---|
| Log | Evenement textuel produit par un systeme. | Erreur Nginx 502, exception Django. |
| Metric | Valeur numerique mesuree dans le temps. | CPU, RAM, 5xx rate, latency p95. |
| Trace | Suivi d'une requete entre services. | API -> DB -> Redis -> external API. |
| Alert | Notification quand une condition est anormale. | Disk > 90% for 10 minutes. |
| Dashboard | Vue graphique des signaux importants. | Production API overview. |
| Baseline | Comportement normal attendu. | Latence p95 normale autour de 180 ms. |
| Cardinality | Nombre de combinaisons de labels. | Trop de labels user_id explose les metrics. |
| Noise | Alerte inutile ou trop frequente. | CPU spike de 5 secondes. |
Golden signals
Golden signals
│
├── Latency
│ └── how long requests take
│
├── Traffic
│ └── how much demand exists
│
├── Errors
│ └── how often requests fail
│
└── Saturation
└── how full the system isQuestions d'observabilite
| Quel signal prouve l'impact utilisateur ? | Latence, erreurs, parcours metier. |
| Quel signal montre la cause probable ? | DB locks, CPU, queue backlog, logs. |
| Quelle alerte a declenche ? | Nom, seuil, duree, severite. |
| Le dashboard montre-t-il le dernier deploy ? | Annotation de changement. |
Phrase incident
The alert fired because the p95 latency exceeded the SLO threshold.
Traffic is normal, but saturation increased on the database.
The logs show lock waits starting after the last deployment.Incidents : triage, mitigation, RCA, post-mortem
Glossaire incident
| Terme | Definition | Question associee |
|---|---|---|
| Triage | Evaluation rapide de l'impact et de la priorite. | Qui est touche ? Depuis quand ? |
| Severity | Niveau de gravite de l'incident. | Incident mineur ou critique ? |
| Incident commander | Personne qui coordonne la reponse. | Qui decide go/no-go ? |
| Mitigation | Action pour reduire l'impact rapidement. | Peut-on desactiver, scaler, rollback ? |
| RCA | Root Cause Analysis. | Pourquoi l'incident est arrive ? |
| Post-mortem | Analyse documentee apres incident. | Que change-t-on pour eviter la recidive ? |
| Action item | Action preventive issue du post-mortem. | Qui fait quoi et pour quand ? |
| Blameless | Culture sans accusation individuelle. | Quel systeme a permis l'erreur ? |
Cycle incident
Detection
│
▼
Triage
├── impact
├── severity
├── owner
└── timeline
│
▼
Mitigation
├── rollback
├── scale
├── disable feature
└── traffic control
│
▼
Recovery
├── service stable
├── metrics normal
└── users OK
│
▼
Post-mortem
├── RCA
├── action items
├── runbook update
└── preventionPhrases utiles en crise
We are still in triage.
The current mitigation is rollback to the previous image.
The customer impact is limited to login latency.
The service has recovered, but RCA is not complete.
The action item is to add an alert on DB lock waits.Phrases utiles pour revues, incidents et entretiens
En revue Terraform
The Terraform plan is clean: no unexpected destroy.
This change increases the blast radius because it opens the security group.
The state backend points to production, so the apply must be protected.
The drift should be investigated before applying more changes.
The module version should be pinned to avoid uncontrolled updates.En debug CI/CD
The job failed before producing the artifact.
The runner does not have access to the protected variable.
The pipeline is running from a merge request, so production secrets are not available.
The apply job should depend on the exact plan artifact.
The include should be pinned to a versioned template tag.En incident production
The impact is confirmed on production traffic.
The first mitigation is to rollback the last deployment.
The current hypothesis is database connection saturation.
We need to check logs before restarting the service.
The service is stable again, but the RCA is still pending.En securite
The role is too broad and violates least privilege.
The secret was exposed in logs and must be rotated.
The production runner should be protected and isolated.
Break-glass access must be temporary, audited and linked to a ticket.
OIDC is preferable to long-lived cloud credentials in CI.Confusions et anti-patterns de vocabulaire
| Confusion | Pourquoi c'est dangereux | Correction |
|---|---|---|
| Confondre rollback et fix forward | Rollback revient en arriere ; fix forward corrige en avant. | Nommer clairement la strategie choisie. |
| Dire “le serveur est down” sans preuve | Le probleme peut etre DNS, TLS, LB, app, DB. | Dire quel check echoue. |
| Confondre artifact et cache | On peut perdre le fichier necessaire a l'apply. | Artifact = output a conserver ; cache = acceleration. |
| Confondre state et code Terraform | Modifier le code ne change pas le state directement. | Expliquer code, plan, apply, state. |
| Confondre masked et protected | Un secret peut etre cache mais accessible dans mauvais contexte. | Utiliser masked + protected + scoped. |
| Dire “SLA” pour tout | SLA, SLO, SLI ont des sens differents. | Utiliser le bon niveau : mesure, objectif, contrat. |
| Confondre healthcheck et test metier | Un endpoint peut etre OK alors que le parcours client est KO. | Ajouter smoke tests metier. |
| Confondre incident et post-mortem | L'incident est l'evenement ; post-mortem est l'analyse. | Maintenir timeline puis RCA. |
Mauvais modele
Vocabulaire flou
├── "ca marche pas"
├── "le cloud est down"
├── "on rollback en corrigeant"
├── "le SLA est mauvais"
├── "le cache a le plan"
└── "le secret est masked donc safe"Bon modele
Vocabulaire precis
├── symptome mesure
├── environnement identifie
├── impact utilisateur
├── hypothese separee du fait
├── mitigation nommee
└── validation expliciteChecklist Glossaire avance
Checklist vocabulaire pour junior
| Question | Reponse attendue |
|---|---|
| Sait-il expliquer SLA/SLO/SLI ? | Mesure, objectif, engagement. |
| Sait-il expliquer RTO/RPO ? | Temps de restauration et perte de donnees acceptable. |
| Sait-il lire un pipeline ? | Stages, jobs, runner, variables, artifacts. |
| Sait-il expliquer Terraform state ? | Memoire des ressources gerees. |
| Sait-il definir rollback ? | Retour a un etat stable precedent. |
| Sait-il definir blast radius ? | Perimetre d'impact maximal. |
| Sait-il distinguer fait et hypothese ? | Oui, surtout en incident. |
| Sait-il expliquer least privilege ? | Droits minimaux necessaires. |
Checklist communication incident
| Impact clair | Qui est touche et comment. |
| Environnement clair | Dev, staging, production. |
| Symptome mesurable | 5xx, latence, timeout, backlog. |
| Hypothese separee | Ce que l'on pense, pas encore prouve. |
| Mitigation nommee | Rollback, scale, disable feature, rate limit. |
| Validation explicite | Health, logs, metrics, smoke test. |
Mini-glossaire prioritaire
| Terme | Definition en 1 ligne |
|---|---|
| Blast radius | Perimetre touche si le changement echoue. |
| Rollback | Retour a la version ou configuration precedente. |
| Drift | Difference entre configuration attendue et realite. |
| Artifact | Fichier produit par un job CI. |
| Runner | Machine qui execute les jobs CI. |
| OIDC | Federation d'identite pour credentials temporaires. |
| RCA | Analyse de cause racine. |
| Post-check | Verification apres changement. |
Mini-cheat-sheet vocabulaire
Use precise words:
- impact, not "it is broken"
- rollback, not "we will fix somehow"
- hypothesis, not "root cause" too early
- artifact, not cache
- SLI/SLO/SLA with correct meaning
- state, not Terraform code
- mitigation, not permanent fix
- post-check, not "looks fine"Annexes pratiques : transformer le guide en outil operationnel
Cette annexe regroupe les modeles reutilisables pour une equipe DevOps : matrices de risques, decision Go/No-Go, plan de formation, grille de maturite, modele de changement, runbook, incident review, checklist de revue et modeles de communication.
L'objectif n'est pas d'ajouter de la bureaucratie. L'objectif est de rendre les changements plus lisibles, plus auditables, plus securises et plus faciles a transmettre aux nouveaux DevOps. Un bon modele permet de gagner du temps pendant les incidents et d'eviter les oublis critiques.
Contenu de l'annexe
| Annexe | Usage | Moment d'utilisation |
|---|---|---|
| Matrice de risques | Evaluer impact, probabilite, blast radius et rollback. | Avant une MR ou un apply production. |
| Go / No-Go | Decider si un changement peut partir. | Avant une fenetre de production. |
| Plan de formation | Former les nouveaux DevOps par ateliers. | Onboarding et montee en competence. |
| Maturite DevOps | Mesurer le niveau d'industrialisation. | Audit interne ou roadmap plateforme. |
| Change model | Documenter une modification infra/app. | Dans une MR, un ticket ou une release note. |
| Incident model | Structurer timeline, mitigation, RCA. | Pendant et apres incident. |
Cycle operationnel complet
Besoin de changement
│
▼
Analyse de risque
├── environnement
├── impact
├── blast radius
├── rollback
└── owner
│
▼
MR / Review
├── plan Terraform
├── pipeline
├── secrets
├── IAM
└── observabilite
│
▼
Go / No-Go
├── pre-checks
├── approver
├── monitoring
└── communication
│
▼
Execution
├── pipeline trace
├── post-checks
└── rollback si besoin
│
▼
Capitalisation
├── runbook update
├── RCA si incident
└── formation equipeRegles d'utilisation
| Regle | Pourquoi |
|---|---|
| Modeles courts | Ils seront utilises en conditions reelles. |
| Champs obligatoires | Evite les oublis critiques. |
| Rollback toujours visible | Reduit la panique pendant un incident. |
| Owner explicite | Evite les responsabilites floues. |
| Trace conservee | Audit, formation et post-mortem. |
Matrice de risques operationnels DevOps
Cette matrice aide a qualifier un changement avant execution. Elle permet d'identifier les risques production, securite, donnees, couts, IAM, reseau, CI/CD, rollback et monitoring.
Notation simple du risque
| Niveau | Impact | Exemple | Decision |
|---|---|---|---|
| 1 - Faible | Aucun impact utilisateur. | Tag, commentaire, variable dev. | Review standard. |
| 2 - Modere | Impact limite ou staging. | Ajout ressource non critique. | Review + plan. |
| 3 - Significatif | Production touchee mais rollback simple. | Changement Nginx ou autoscaling. | Go/No-Go recommande. |
| 4 - Eleve | Production critique, risque client. | DB, IAM prod, security group public. | Approval senior obligatoire. |
| 5 - Critique | Risque perte donnees, outage ou faille majeure. | Migration DB massive, restore, network core. | Fenetre dediee + rollback teste. |
Formule pratique
Risk score =
impact
× probability
× blast radius
× rollback difficulty
Example:
impact = 4
probability = 2
blast radius = 3
rollback difficulty = 3
score = 72
=> senior review + Go/No-Go requiredMatrice de controles
| Zone | Controle attendu | Owner |
|---|---|---|
| Terraform | Plan relu, aucun destroy inattendu, backend confirme. | DevOps + reviewer. |
| CI/CD | Pipeline vert, artifact present, runner protege si prod. | DevOps. |
| IAM | Droits minimaux, pas de wildcard critique non justifiee. | Security / Platform. |
| Network | Ports, sources, DNS, TLS et LB verifies. | Platform / SRE. |
| Database | Backup recent, migration testee, rollback documente. | DBA / App owner. |
| Secrets | Aucun secret en Git, logs, artifacts ou plan public. | DevOps + Security. |
| Observabilite | Dashboards et alertes ouverts avant action. | SRE. |
| Rollback | Procedure testee ou au minimum clairement executable. | Owner changement. |
Matrice de risque detaillee
| Critere | Faible | Moyen | Fort |
|---|---|---|---|
| Environnement | Dev ou sandbox. | Staging partage. | Production. |
| Donnees | Aucune donnee persistante. | Donnees non critiques. | Donnees client, paiement, commande, auth. |
| Rollback | Revert simple. | Revert + redeploy. | Restore DB, migration inverse ou action manuelle. |
| Blast radius | Un service interne. | Un domaine applicatif. | Plateforme, reseau, IAM ou production globale. |
| Securite | Aucun droit ajoute. | Droit limite. | IAM, secrets, public exposure, break-glass. |
Modele Go / No-Go : decision courte, claire et tracable
Une decision Go/No-Go doit etre comprehensible par une personne qui n'a pas ecrit le changement. Elle verifie que les conditions minimales sont reunies avant de toucher un environnement sensible.
Template Go / No-Go
GO / NO-GO TEMPLATE Change: - Service: - Environment: - Owner: - Reviewer: - Ticket / MR: - Expected impact: - Customer visible: yes/no - Planned window: - Risk level: 1/2/3/4/5 Pre-check: - Pipeline green: - Terraform plan reviewed: - No unexpected destroy: - State/backend confirmed: - Secrets protected: - Backup verified: - Monitoring ready: - Rollback ready: - Communication ready: - Support/on-call informed: Decision: - GO: - NO-GO reason: - Approver: - Time:
Decision tree
Before production change
│
▼
Pipeline green?
├── No → NO-GO
└── Yes
▼
Plan reviewed?
├── No → NO-GO
└── Yes
▼
Rollback ready?
├── No → NO-GO
└── Yes
▼
Monitoring ready?
├── No → NO-GO
└── Yes
▼
Owner / approver available?
├── No → NO-GO
└── Yes → GOExemples de No-Go legitimes
| Raison | Pourquoi |
|---|---|
| Plan Terraform contient un destroy inattendu. | Risque de perte de ressource. |
| Backup DB non verifie. | Pas de filet de securite. |
| Owner applicatif absent. | Decision metier impossible. |
| Monitoring indisponible. | Impossible de valider l'impact. |
| Rollback non documente. | Risque prolonge en incident. |
Plan de formation DevOps en ateliers progressifs
Ce plan donne une progression concrete pour nouveaux DevOps : lecture, pratique, sandbox, staging, incidents simules, revue de MR et production accompagnee.
Plan de formation en 12 ateliers
| Atelier | Objectif | Livrable |
|---|---|---|
| 1. Architecture | Lire le schema global et le chemin requete. | Schema resume par l'apprenant. |
| 2. GitLab CI | Comprendre stages, jobs, variables, artifacts. | Explication d'un pipeline reel. |
| 3. Terraform plan | Lire create/update/destroy et risques. | Resume humain du plan. |
| 4. Modules Terraform | Comprendre variables, outputs, versioning. | Mini module documente. |
| 5. State distant | Comprendre backend, lock, drift. | Exercice state en sandbox. |
| 6. Secrets CI | Masked, protected, scoped, OIDC. | Checklist secrets. |
| 7. Linux ops | systemctl, journalctl, ports, disque. | Diagnostic service casse. |
| 8. Network ops | DNS, TLS, Nginx, firewall, LB. | Runbook 502 / TLS. |
| 9. Observabilite | Logs, metrics, alerts, dashboards. | Dashboard reading notes. |
| 10. Incident simulation | Triage, mitigation, communication. | Timeline + mini RCA. |
| 11. Production change | Go/No-Go, rollback, post-check. | Change note complete. |
| 12. Review senior | Autonomie controlee. | Evaluation 30/60/90. |
Progression 30 / 60 / 90 jours
Jours 1-30
├── lire architecture
├── observer pipelines
├── comprendre Terraform plan
├── pratiquer sandbox
└── lire runbooks
Jours 31-60
├── MR infra simple
├── debug pipeline staging
├── exercice Linux/Nginx
├── mini incident simule
└── runbook update
Jours 61-90
├── deploy staging autonome
├── production accompagnee
├── Go/No-Go simple
├── RCA courte
└── presentation equipeCritere de reussite
| Competence | Preuve attendue |
|---|---|
| Contexte | Identifie environnement, service, impact. |
| Risque | Explique blast radius et rollback. |
| CI/CD | Debug jobs, variables, artifacts. |
| Terraform | Lit plan et detecte destroy inattendu. |
| Production | Execute avec supervision et post-checks. |
Echelle de maturite DevOps infra
Cette grille permet de situer une equipe ou une plateforme, puis de definir le prochain cap. Elle peut etre utilisee en audit interne, roadmap plateforme ou plan d'amelioration continue.
| Niveau | Description | Signaux visibles | Prochain cap |
|---|---|---|---|
| 0. Manuel | ClickOps, changements manuels, peu de traces. | Console cloud, docs incompletes, changements non reproductibles. | Mettre Git au centre. |
| 1. Scripted | Scripts et Terraform local, state local. | Automatisation partielle mais fragile. | Backend distant, separation environnements. |
| 2. CI visible | fmt, validate, plan en pipeline. | Apply encore manuel depuis laptop. | Apply via GitLab avec approvals. |
| 3. Production controlee | MR, approvals, protected env, runbooks. | Changements prod mieux traces. | Observabilite et exercices incidents. |
| 4. Platform engineering | Modules versionnes, OIDC, policy-as-code, templates CI. | Standards reutilisables multi-equipes. | Self-service securise. |
| 5. Excellence continue | Mesure fiabilite/cout/securite, game days, RCA suivies. | Amelioration continue pilotee par donnees. | Optimisation produit et plateforme. |
Diagnostic rapide maturite
Questions: - Les changements infra passent-ils par MR ? - Le state Terraform est-il distant et locke ? - Les plans sont-ils publies en artifacts ? - L'apply production est-il manuel et protege ? - Les secrets CI sont-ils protected/masked/scoped ? - Les modules sont-ils versionnes ? - Existe-t-il des runbooks testes ? - Les incidents produisent-ils des RCA suivies ? - Les couts et risques sont-ils visibles avant apply ?
Roadmap de maturite
Manual operations
│
▼
Git + Terraform baseline
│
▼
Remote state + locking
│
▼
GitLab validate / plan
│
▼
Protected apply
│
▼
Security scans + OIDC
│
▼
Runbooks + observability
│
▼
Self-service platformModele de note de changement operationnelle
Une note de changement doit etre courte, concrete et orientee decision. Elle doit permettre a un reviewer de comprendre le changement sans deviner le contexte.
Template change note
CHANGE NOTE Title: Service: Environment: Owner: Reviewer: Ticket / MR: Planned date: Context: - Why is this change needed? - What problem does it solve? Scope: - Included: - Excluded: Risk: - Risk level: 1/2/3/4/5 - Blast radius: - Customer visible: yes/no - Data impact: - Security impact: - Cost impact: Validation before: - Pipeline: - Terraform plan: - Tests: - Backup: - Monitoring: Execution: - Command or pipeline: - Expected duration: - Owner present: Rollback: - Rollback trigger: - Rollback steps: - Expected rollback duration: Post-check: - Health: - Logs: - Metrics: - Business check: Decision: - Approved by: - Time:
Exemple rempli
Title: Increase API autoscaling max replicas Service: public-api Environment: production Owner: platform-team Risk level: 3 Customer visible: no expected downtime Context: - Traffic increased during business hours. - Current max replicas reached twice this week. Risk: - More replicas may increase DB connections. - Blast radius limited to API service. Validation before: - Terraform plan reviewed: 1 update, 0 destroy - DB max connections checked - Dashboard API + DB open Rollback: - Revert max replicas to previous value - Apply previous Terraform plan Post-check: - API p95 latency - HTTP 5xx - DB connections - pod count / instance count
Qualite d'une bonne note
| Claire | Pas besoin d'appeler l'auteur pour comprendre. |
| Courte | Lisible pendant une fenetre de changement. |
| Verifiable | Contient commandes, dashboards ou criteres. |
| Reversible | Rollback explicite avant execution. |
| Tracable | Liee a MR, ticket, pipeline, owner. |
Modele de runbook operationnel
Un runbook doit aider quelqu'un sous pression. Il doit etre actionnable, ordonne, et contenir des commandes de lecture avant les commandes de modification.
Template runbook
RUNBOOK TEMPLATE Title: Service: Environment: Owner: Last reviewed: Severity: Symptoms: - What alert fires? - What user impact? - What logs or metrics confirm? First checks: 1. Check environment/context. 2. Check recent deployments. 3. Check service health. 4. Check logs. 5. Check dependencies. 6. Check dashboards. Read-only commands: - command 1 - command 2 - command 3 Mitigation options: - Option A: - Option B: - Option C: Rollback: - Trigger: - Steps: - Validation: Escalation: - App owner: - Platform owner: - Security: - DBA: Post-incident: - RCA required: yes/no - Runbook update: - Action items:
Exemple runbook court : Nginx 502
RUNBOOK: Nginx 502 Symptoms: - Users receive 502 Bad Gateway. - Nginx error.log shows upstream connection refused. First checks: nginx -t systemctl status nginx --no-pager tail -n 100 /var/log/nginx/error.log systemctl status myapp --no-pager journalctl -u myapp -n 100 --no-pager ss -tulpn | grep 8000 curl -I http://127.0.0.1:8000/health/ Mitigation: - If app is down, restart myapp only after reading logs. - If config broken, rollback Nginx config and reload. - If deploy caused failure, rollback app release. Post-check: curl -I https://example.com/health/ tail -n 50 /var/log/nginx/error.log check 5xx dashboard
Runbook quality check
| Critere | Question |
|---|---|
| Lisible | Un junior peut-il le suivre ? |
| Prudent | Les actions read-only viennent-elles d'abord ? |
| Verifiable | Y a-t-il des post-checks ? |
| Escalable | Qui appeler si cela ne suffit pas ? |
| Maintenu | Date de derniere revue presente ? |
Modele incident : timeline, mitigation, RCA, actions
Le modele incident sert a garder une trace propre pendant la crise et a produire une RCA exploitable. Il separe les faits, les hypotheses, les actions et les decisions.
Template incident
INCIDENT TEMPLATE Incident title: Severity: Start time: Detection time: End time: Incident commander: Services affected: Customer impact: Current status: - Investigating / Mitigating / Monitoring / Resolved Timeline: - HH:MM alert fired - HH:MM first triage - HH:MM mitigation started - HH:MM service recovered Facts: - What is confirmed? Hypotheses: - What is suspected? Mitigation: - What was done to reduce impact? Root cause: - Technical cause: - Process cause: - Detection gap: Impact: - Users affected: - Duration: - Data loss: yes/no - SLA/SLO impact: Action items: - Owner: - Due date: - Priority: Follow-up: - Runbook update: - Alert update: - Training update:
Timeline visuelle
Alert fires
│
▼
Triage
├── impact
├── service
├── severity
└── owner
│
▼
Mitigation
├── rollback
├── scale
├── disable feature
└── traffic control
│
▼
Recovery
├── health OK
├── metrics normal
└── user impact resolved
│
▼
RCA
├── root cause
├── contributing factors
├── detection gap
└── action itemsBlameless RCA questions
| What happened? | Facts and timeline. |
| Why did it happen? | Technical and process causes. |
| Why was it not caught earlier? | Testing, alerting, review gaps. |
| What reduced the impact? | Good practices to keep. |
| What will prevent recurrence? | Action items with owners. |
Templates de revue : MR, Terraform plan, CI/CD et securite
Checklist MR DevOps
MR REVIEW TEMPLATE Context: - Is the reason clear? - Is the target environment clear? - Is the owner identified? Terraform: - Plan attached: - Create/update/delete summary: - Unexpected destroy: - State/backend confirmed: - Module version pinned: CI/CD: - Pipeline green: - Artifacts generated: - Protected environment: - Runner appropriate: Security: - Secrets exposed: - IAM changes: - Network exposure: - Least privilege respected: Operations: - Rollback documented: - Post-checks defined: - Monitoring ready: - Communication needed:
Commentaire MR type
Review: - The change is clear and limited to staging. - Plan shows 2 creates, 1 update, 0 destroy. - Please add the rollback section before approval. - Please confirm the backend points to staging. - Please add a post-check using the health endpoint. Approved after those points are addressed.
Review scorecard
| Score | Signification | Decision |
|---|---|---|
| A | Contexte clair, risque faible, rollback et post-checks OK. | Approve. |
| B | Changement correct mais details manquants. | Approve apres corrections mineures. |
| C | Risque mal explique ou rollback incomplet. | Changes requested. |
| D | Destroy, IAM large ou impact prod non maitrise. | Block review. |
| E | Secret expose ou action dangereuse. | Stop + security review. |
Phrases de review utiles
Please separate IAM changes from network changes. The blast radius is not clear yet. The rollback should be executable without guessing. The plan artifact should be attached to the MR. This job should only run on protected branches. This variable must be protected and scoped to production.
Anti-patterns operationnels dans les annexes
| Anti-pattern | Pourquoi c'est dangereux | Correction professionnelle |
|---|---|---|
| Modeles trop longs | Personne ne les utilise en incident. | Templates courts, champs essentiels. |
| Go/No-Go purement administratif | Il ne protege pas vraiment la production. | Verifier plan, rollback, monitoring, owner. |
| Matrice risque jamais appliquee | Les changements critiques passent comme des changements simples. | Lier niveau risque a approvals et fenetre. |
| Runbooks non testes | Ils echouent pendant la crise. | Game days et exercices reguliers. |
| RCA sans action owner | L'incident se reproduit. | Action item, owner, due date, suivi. |
| Formation sans livrables | Progression invisible. | MR, schema, runbook, RCA, presentation. |
| Approval sans lecture du plan | Validation de surface. | Reviewer doit lire le plan et les diffs. |
| Rollback ecrit apres incident | Trop tard pour aider. | Rollback obligatoire avant changement. |
Mauvais modele
Annexes inutiles
├── trop longues
├── pas utilisees
├── pas de owner
├── pas de rollback
├── pas de post-check
├── RCA sans actions
└── formation theoriqueBon modele
Annexes operationnelles
├── templates courts
├── decisions Go/No-Go
├── risques visibles
├── runbooks testes
├── RCA actionnables
├── formation par ateliers
└── amelioration continueChecklist finale des annexes pratiques
Checklist avant changement production
| Controle | Validation attendue |
|---|---|
| MR claire | Contexte, impact, owner, environnement. |
| Plan relu | Create/update/delete expliques. |
| Destroy controle | Aucun destroy inattendu. |
| Secrets proteges | Aucun secret dans Git, logs, artifacts. |
| IAM limite | Least privilege respecte. |
| Monitoring ouvert | Dashboards et alertes prets. |
| Rollback pret | Procedure claire et executable. |
| Go/No-Go fait | Decision tracee avec approver. |
Checklist apres changement
| Healthcheck OK | Endpoint, service, LB ou pod ready. |
| Logs propres | Pas d'erreurs nouvelles. |
| Metrics stables | Latence, 5xx, saturation, DB. |
| Owner informe | Resultat partage. |
| Documentation mise a jour | Runbook, MR, ticket ou note. |
Mini-cheat-sheet annexes
Before change: - What changes? - Where? - Why? - Who owns it? - What is the risk? - What is the blast radius? - Is the plan reviewed? - Is rollback ready? - Is monitoring ready? - Who approves? During incident: - What is confirmed? - What is hypothesis? - What is impact? - What mitigation is active? - Who is incident commander? - What is the next update time? After: - What was root cause? - What prevented faster detection? - What action items exist? - Who owns them? - Which runbook changes?
Definition d'une annexe utile
Modele de decision rapide
If unclear environment → STOP If no rollback → STOP If unexpected destroy → STOP If secret exposed → STOP + ROTATE If monitoring unavailable → DELAY If owner absent → DELAY If all checks pass → GO with post-checks
