Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

⚙️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.

2.8

Debug pipeline

Diagnostiquer un pipeline GitLab qui bloque, echoue ou se comporte mal.

debugrunnerlogs
3.5

Stratégies de déploiement

Rolling, blue/green, canary, maintenance page et rollback applicatif.

rollingcanaryblue-green
3.6

Capacité & performance

CPU, RAM, disque, connexions, queues, saturation et seuils d'alerte.

capacityperfsaturation
3.7

Incidents base de données

Connexions, locks, lenteurs, disque plein, backups et restauration.

DBlocksbackup
3.8

Incidents réseau

DNS, TLS, Nginx, firewall, load balancer, routes et ports.

DNSTLSNginx
4.4

IAM approfondi

Roles, policies, assume-role, separation des privileges et break-glass.

IAMrolesleast-privilege
4.5

Supply chain CI/CD

Images Docker, dépendances, runners, artifacts et provenance.

supply-chainimagesartifacts
4.6

Kubernetes pour DevOps

Concepts utiles même si le poste est surtout Terraform/GitLab.

K8spodshelm
4.7

Linux hardening

Systemd, utilisateurs, SSH, firewall, logs, permissions et mises à jour.

LinuxSSHsystemd
5.5

Former les nouveaux DevOps

Progression, exercices, erreurs volontaires, revues et rituels d'equipe.

trainingjuniorteam
5.6

Glossaire avancé

Les termes que les nouveaux DevOps rencontrent tous les jours.

glossaryvocabops
6.1

Annexes pratiques

Plans de formation, matrices de risques, procédures go/no-go et modèles opérationnels.

AnnexesRiskOps
2.8 Debug pipeline : diagnostiquer un pipeline GitLab qui bloque, échoue ou se comporte mal
Dé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.

Objectif professionnel : diagnostiquer méthodiquement sans exposer de secrets, sans relancer aveuglément, sans forcer un lock Terraform, et sans transformer un échec CI en incident production.
Les grandes familles de pannes
FamilleSymptômeCause probable
RunnerJob bloqué en pending.Runner indisponible, tags incorrects, runner non protégé.
VariablesCredentials absents ou vides.Variable protected/scoped inaccessible.
Cheminscd: no such file, artifact absent.Mauvais TF_ROOT, paths relatifs incorrects.
Terraform initBackend inaccessible.Credentials, bucket, state key, réseau, IAM.
Terraform planErreur provider, variable manquante.Provider lock, tfvars, droits cloud, version.
Terraform applyLock, 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 utile
Règles de sécurité pendant debug
RèglePourquoi
Ne jamais afficher les secretsLes logs CI sont persistants et partagés.
Ne pas relancer apply à l’aveugleRisque d’appliquer un plan obsolète.
Ne pas faire force-unlock sans preuvePeut casser un apply encore actif.
Isoler le job défaillantÉvite de modifier trop de choses en même temps.
Documenter la causeTransforme le bug CI en amélioration durable.
Règle : un debug pipeline doit produire une cause claire, pas simplement “j’ai relancé et cette fois c’est passé”.
Méthode terrain : diagnostic en 9 étapes
Procédure standard
ÉtapeActionRésultat attendu
1Identifier le pipeline, le job, le commit et la branche.Contexte exact connu.
2Lire le log depuis le début, pas seulement la dernière ligne.Erreur replacée dans son contexte.
3Identifier image, runner, tags et environnement.Exécution CI comprise.
4Vérifier dossier courant et chemins utilisés.Moins d’erreurs de path/artifacts.
5Vérifier présence des variables sans afficher leur valeur.Secrets protégés.
6Comparer local vs CI : versions, tfvars, backend, provider.Différences identifiées.
7Classer la panne : runner, variable, state, provider, cloud.Hypothèse principale claire.
8Corriger minimalement.Pas de refactor inutile pendant incident CI.
9Relancer le job nécessaire et documenter.Résolution traçable.
Bonne pratique : une correction de pipeline doit être petite, relisible et reliée à la cause observée dans les logs.
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/IAM
Commandes 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"
                            fi
À éviter : env, 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ômeCause probableCorrection
Job pendingAucun runner avec les tags demandés.Corriger tags job ou runner.
Runner offlineService runner arrêté ou serveur KO.Vérifier service et logs runner.
Job bloqué sur protected branchRunner non protégé.Utiliser runner protégé.
Image pull failedRegistry inaccessible ou credentials absents.Vérifier registry auth.
TimeoutJob 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
                            top
Tags runner : exemple
terraform_plan_prod:
                            stage: plan
                            tags:
                            - protected
                            - terraform
                            - prod
                            script:
                            - terraform plan -out=tfplan
Matrice runner
RunnerUsageProtection
sharedTests simples, lint, docs.Pas de secrets prod.
terraform-devPlan/apply dev.Variables dev uniquement.
terraform-stagingPlan/apply staging.Runner contrôlé.
terraform-prodPlan/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 suffisantes
Attention : un runner partagé ne doit pas exécuter un job avec secrets production sauf design de sécurité parfaitement maîtrisé.
Variables 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ômeCause probableDiagnostic sûr
Variable videVariable protected sur branche non protégée.Afficher présence, pas valeur.
Auth cloud failedCredential absent ou scope incorrect.Vérifier branch/env scope.
Backend inaccessibleSecret state backend manquant.Contrôler variables backend.
Job local OK, CI KODifférence de tfvars ou variables CI.Comparer variables non sensibles.
Secret visible dans logsVariable 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"
Règle : ne jamais afficher la valeur d’un secret pour vérifier qu’il existe. Afficher uniquement “present” ou “missing”.
Scoping recommandé
VariableProtectedScopeUsage
DEV credentialsSelon politiquedevelopmentPlan/apply dev.
STAGING credentialsOui si release protégéestagingPlan/apply staging.
PROD credentialsOuiproductionPlan/apply prod uniquement.
INFRACOST_API_KEYOuiMR ou projetEstimation 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"
Attention : les variables peuvent venir du projet, du groupe, de l’instance, du pipeline, d’un trigger ou d’un include. Toujours vérifier la source réelle.
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
ErreurCause probableCorrection
cd: no such fileTF_ROOT incorrect.Afficher pwd, ls, corriger chemin.
Artifact absentPath artifact relatif au mauvais dossier.Aligner paths et working directory.
tfplan introuvableApply 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 KOApply 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 -la
Artifacts 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: manual
Plan 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 tfplan
Bonne pratique : utiliser le même TF_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
CommandeCe qu’elle valide
terraform --versionVersion Terraform réellement utilisée par CI.
terraform initBackend, providers, modules, credentials.
terraform validateSyntaxe et cohérence configuration.
terraform providersProviders utilisés et provenance.
terraform planDroits cloud, variables, drift, diff réel.
terraform state listAccè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.txt
Erreurs Terraform fréquentes
Message / symptômeCause probableAction
Provider not foundProvider mal déclaré ou lock obsolète.Corriger required_providers, relancer init.
Backend init failedBucket/state inaccessible.Vérifier credentials, région, key, IAM.
Variable not settfvars absent ou variable CI manquante.Corriger tfvars ou TF_VAR_*.
Access deniedIAM 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 unexpectedlyMauvais 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"
Règle : si un plan CI propose un destroy inattendu, on arrête le debug et on vérifie state, backend, workspace, tfvars et branche.
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ômeCause probableRéflexe
State lock actifApply en cours ou job mort.Identifier détenteur du lock.
Plan expiréState changé entre plan et apply.Relancer plan.
Apply concurrentDeux jobs sur même state.Bloquer concurrence CI.
Diff incohérentMauvais backend ou workspace.Vérifier state key/env.
Resource already existsRessource 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_ID
Règle : ne jamais faire force-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 plan
Prévention en CI
MesureEffet
Resource group GitLabSérialiser les jobs par environnement.
Apply manuelÉviter applies automatiques concurrents.
State séparé par envRé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: manual
Logs 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 --version
Debug 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
Bonne pratique : afficher les métadonnées d’exécution, jamais les valeurs sensibles.
À ne pas logger
À éviterPourquoiAlternative
envAffiche potentiellement tous les secrets.Afficher variables non sensibles une par une.
printenvRisque de fuite massive.Fonction check_var.
set -xTrace commandes avec valeurs substituées.Logs explicites contrôlés.
cat *.tfvarsPeut contenir secrets ou configs sensibles.Valider présence du fichier seulement.
terraform output brutPeut 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 validate
Attention : un log CI peut rester accessible longtemps. Un secret exposé dans un log doit être considéré compromis.
Debug 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
ÉtapeActionBut
1Stopper les relances automatiques.Éviter effet boule de neige.
2Identifier si l’échec est plan ou apply.Évaluer impact réel.
3Vérifier state lock et jobs concurrents.Éviter corruption state.
4Relire le plan artifact.Vérifier destroy/replace inattendus.
5Vérifier credentials et environnement.Éviter mauvais compte/région/state.
6Corriger minimalement.Limiter le changement pendant incident CI.
7Relancer plan avant apply.Éviter plan obsolète.
Règle : après un échec d’apply production, relancer directement le même job peut être dangereux. Il faut comprendre l’état partiel éventuel.
Cas production typiques
CasRisqueRéaction
Apply échoue à mi-parcoursInfrastructure partiellement modifiée.Relancer plan avant action.
State lock persistantApply encore actif ou lock orphelin.Identifier détenteur du lock.
Access denied en prodRôle CI trop faible ou mauvais rôle.Corriger IAM minimalement.
Plan destroy inattenduMauvais state/env ou drift critique.Stop, investigation senior.
Runner prod offlineImpossible 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/mitigation
Bonne pratique : ouvrir dashboards et alertes pendant tout debug d’un pipeline qui a déjà commencé à modifier la production.
Anti-patterns du debug pipeline
Anti-patternPourquoi c’est dangereuxCorrection professionnelle
Relancer sans lire les logsPeut masquer une cause réelle ou aggraver.Lire le log depuis le début.
Afficher toutes les variablesFuite de secrets dans les logs.Vérifier présence sans afficher valeur.
Modifier plusieurs choses à la foisImpossible d’identifier la vraie correction.Correction minimale et ciblée.
force-unlock réflexePeut casser un apply actif.Identifier le détenteur du lock.
Ignorer les différences local/CILe 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 prodSurface d’attaque plus large.Runner protégé dédié ou risque documenté.
Ne pas documenter la causeLe 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 documentation
Résultat : fuite de secrets, risque state, panne répétée ou incident production.
Bon 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ée
Résultat : pipeline corrigé proprement, sécurité préservée, et connaissance réutilisable.
Checklist Debug pipeline GitLab
Checklist diagnostic rapide
PointValidation attendue
Job exact identifiéPipeline, stage, job, commit, branche.
Logs lus depuis le débutImage, runner, before_script, erreur exacte.
Runner vérifiéOnline, tags, protected, capacité.
Variables vérifiéesPrésentes sans afficher leur valeur.
Chemins vérifiéspwd, ls, TF_ROOT.
Artifacts vérifiéstfplan, 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 artifactsPlan, logs, outputs contrôlés.
Pas de force-unlock sans preuveProtège le state.
Runner prod protégéÉvite exécution non maîtrisée.
Checklist correction
QuestionRé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.
Définition d’un bon debug pipeline : l’erreur est comprise, la correction est minimale, les secrets restent protégés, le state n’est pas mis en danger, et l’équipe apprend quelque chose de réutilisable.
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_ID
3.5 Stratégies de déploiement : rolling, blue/green, canary, maintenance page et rollback
Dé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.

Objectif professionnel : choisir une stratégie adaptée au risque : rolling pour limiter l’interruption, blue/green pour basculer proprement, canary pour exposer progressivement, maintenance page pour changement non compatible, rollback pour restaurer vite.
Les questions à poser avant de déployer
QuestionPourquoiRé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 éventuels
Principes SRE
PrincipeApplication
Réduire le blast radiusCanary, rolling progressif, feature flags.
Rendre le rollback rapideImage précédente, config précédente, DB compatible.
Mesurer avant décisionMetrics et logs pendant la montée en charge.
Automatiser sans aveuglementGarde-fous et approvals pour production.
DocumenterTimeline, décision, version, post-checks.
Règle : une stratégie de déploiement n’est fiable que si le rollback et les post-checks sont aussi préparés que le déploiement lui-même.
Comparatif des stratégies de déploiement
StratégiePrincipeAvantagesRisquesCas adapté
RecreateStop ancienne version, start nouvelle.Simple.Downtime.Petites apps internes.
RollingRemplacer les instances progressivement.Peu ou pas d’interruption.Deux versions coexistent.Services stateless.
Blue/GreenDeux environnements, bascule trafic.Rollback rapide par rebascule.Coût double temporaire.Applications critiques.
CanaryExposer un petit % du trafic.Risque limité.Observabilité obligatoire.Fort trafic, SRE mature.
Feature flagsActiver fonction sans redéployer.Rollback fonctionnel rapide.Dette de flags.Nouvelles fonctionnalités.
Maintenance pageCouper 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 éventuel
Critères de décision
CritèreImpact sur choix
Nombre d’instancesRolling nécessite plusieurs instances pour zéro downtime.
Compatibilité DBCanary/rolling exigent souvent compatibilité ascendante.
ObservabilitéCanary sans métriques est dangereux.
CoûtBlue/green peut doubler temporairement l’infrastructure.
CriticitéPlus c’est critique, plus le déploiement doit être progressif.
Bonne pratique : formaliser la stratégie dans la MR ou le ticket de changement, surtout si la production est concernée.
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 partout
Conditions nécessaires
ConditionPourquoi
Healthcheck fiableNe pas envoyer du trafic vers une instance cassée.
Sessions externaliséesÉviter perte de session si instance remplacée.
Deux versions compatiblesAncienne et nouvelle version coexistent temporairement.
Capacité suffisanteSupporter le trafic pendant remplacement partiel.
Rollback rapideRevenir à 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: 8000
Commandes 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 wide
Risques rolling
Incompatibilité DBNouvelle version attend un schéma non compatible.
Healthcheck trop faibleInstance marquée healthy alors qu’elle est cassée.
Capacité insuffisanteLatence ou erreurs pendant remplacement.
Rollback incompletImage rollback OK mais migration non réversible.
Attention : rolling ne convient pas si deux versions ne peuvent pas fonctionner simultanément avec la même base de données.
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 rollback
Avantages
Rollback rapideRebasculer vers l’environnement précédent.
Validation avant traficTester green avant exposition utilisateur.
Downtime réduitLa bascule peut être quasi instantanée.
IsolationNouvelle 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% → BLUE
Risques blue/green
RisquePrévention
Coût double temporaireDurée green limitée, cleanup blue après stabilisation.
DB partagée incompatibleMigrations backward compatible.
Sessions/caches incohérentsExternaliser sessions, compatibilité cache.
DNS TTL trop longPréférer LB routing ou TTL maîtrisé.
Green non représentatifSmoke tests et données réalistes.
Bonne pratique : conserver blue pendant une période courte après bascule, le temps de valider les signaux production.
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ée
Critères de promotion
SignalCritère GoCritère rollback
HTTP 5xxStable ou inférieur baseline.Hausse anormale.
Latence p95/p99Pas de dérive significative.Latence supérieure seuil.
Erreurs applicativesPas de nouvelle exception critique.Nouvelle erreur fréquente.
Métriques métierParcours clé OK.Échec paiement, login, commande, job.
SaturationCPU/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% canary
Exemple 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: 1
Quand éviter canary ?
Trafic trop faibleImpossible d’obtenir un signal statistique fiable.
Observabilité insuffisanteOn ne voit pas si le canary est mauvais.
DB incompatibleAncienne et nouvelle version ne peuvent pas coexister.
Session localeUtilisateur peut changer de version incohérente.
Règle : un canary sans métriques et sans seuils de rollback n’est pas une stratégie de sécurité, c’est une prise de risque progressive.
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 ?
CasPourquoi maintenance
Migration DB non compatibleAncien et nouveau code ne peuvent pas coexister.
Changement stockageRisque d’écriture concurrente.
Bascule DNS/infra critiqueÉtat transitoire non stable.
Import massif ou correction dataPréserver cohérence des données.
Application mono-instanceImpossible 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 utilisateur
Exemple 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
PointRisque
Jobs backgroundPeuvent continuer à écrire pendant maintenance.
API externesWebhooks entrants peuvent échouer.
Cache/CDNMaintenance page peut rester cachée trop longtemps.
MonitoringAlertes attendues à inhiber ou annoter.
CommunicationUtilisateurs ou support doivent être informés.
Bonne pratique : une maintenance planifiée courte et claire vaut mieux qu’un faux zéro downtime qui finit en incident long.
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
TypeActionRisque
Image précédenteRedéployer l’image N-1.DB incompatible possible.
Config précédenteRestaurer variables/config.Secrets ou cache à recharger.
Blue/GreenRebasculer vers blue.DB ou sessions modifiées.
CanaryRamener trafic canary à 0%.Utilisateurs déjà exposés.
Feature flagDésactiver fonctionnalité.Dette de flag à nettoyer.
DB restoreRestaurer 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 OK
Commandes 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-pager
Diagramme 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 test
Attention : un rollback applicatif ne rollback pas forcément la base de données. Les migrations doivent être pensées pour cela.
Dé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 stabilisation
Règles DB pour rolling/canary
RèglePourquoi
Migration backward compatibleAncien et nouveau code coexistent.
Pas de suppression immédiateAncienne version peut encore lire l’ancien champ.
Backfill contrôléÉviter locks longs et saturation.
Index en ligne si possibleLimiter blocage DB.
Backup avant migration risquéeMitigation en cas de problème data.
Checklist migration DB
ContrôleValidation
Durée estiméeTest sur volume réaliste.
LocksPas de lock long sur table critique.
RollbackPlan clair ou mitigation assumée.
Compatibilité versionsAncien et nouveau code OK.
BackfillBatché, surveillé, stoppable.
MonitoringConnexions, 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 traffic
Règle : la stratégie de déploiement applicatif doit être choisie après analyse des migrations, pas avant.
CI/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 rollback
Exemple 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 production
Variables utiles
VariableUsage
APP_VERSIONVersion image ou release à déployer.
DEPLOY_STRATEGYrolling, canary, blue_green.
CANARY_PERCENTPourcentage initial de trafic.
ROLLBACK_VERSIONVersion précédente connue.
MAINTENANCE_MODEActiver/désactiver maintenance.
SMOKE_TEST_URLEndpoint de vérification.
Garde-fous CI
Deploy prod manuelDécision humaine explicite.
Environnement protégéSeuls autorisés peuvent déployer.
Smoke tests bloquantsDétecter rapidement une version cassée.
Rollback job visibleAction rapide en cas de KO.
Artifacts de releaseTrace version, commit, image, changelog.
Bonne pratique : prévoir un job rollback dans le pipeline ou un runbook très court, accessible pendant le déploiement.
Anti-patterns des stratégies de déploiement
Anti-patternPourquoi c’est dangereuxCorrection professionnelle
Déployer sans rollback testéImprovisation en incident.Tester rollback en staging.
Canary sans métriquesImpossible de savoir si la version est mauvaise.Définir seuils 5xx, latence, erreurs métier.
Rolling avec migration incompatibleAncienne et nouvelle version cassent ensemble.Expand/migrate/contract ou maintenance.
Blue/green sans cleanupCoût doublé et confusion opérationnelle.Durée de conservation limitée.
Maintenance non communiquéeSupport et utilisateurs subissent sans contexte.Annonce, statut, fenêtre, message clair.
Healthcheck trop superficielVersion 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 versionDifficile 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 release
Résultat : incident plus long, diagnostic confus, rollback difficile.
Bon modèle
Déploiement maîtrisé
                            ├── stratégie choisie
                            ├── pipeline tracé
                            ├── version immuable
                            ├── migrations compatibles
                            ├── post-checks
                            ├── seuils rollback
                            └── runbook disponible
Résultat : impact réduit, décision rapide, récupération maîtrisée.
Checklist Stratégies de déploiement
Checklist avant déploiement
PointValidation attendue
Stratégie choisieRolling, blue/green, canary, maintenance.
Version identifiéeImage, tag, commit, changelog.
Pipeline vertTests, build, scan, staging OK.
Rollback connuCommande, version précédente, conditions.
Migrations validéesCompatibilité, durée, locks, rollback.
Dashboards ouverts5xx, latence, logs, DB, saturation.
Fenêtre validéeSi risque élevé ou maintenance.
Owner présentDevOps/SRE/dev métier disponibles.
Checklist pendant déploiement
Suivre rolloutStatut instances/pods/targets.
Surveiller signaux5xx, latence, erreurs, logs.
Décision par seuilContinuer, pause ou rollback.
Pas de changement concurrentÉviter confusion de cause.
CommunicationCanal release ou incident à jour.
Checklist après déploiement
ZoneValidation
HealthEndpoints OK.
HTTP5xx et latence revenus au nominal.
LogsPas de nouvelle erreur critique.
DBConnexions, locks, slow queries OK.
MétierParcours critique testé.
Rollback conservéAncienne version disponible assez longtemps.
TraceVersion, heure, owner, résultat documentés.
Définition d’un bon déploiement : stratégie adaptée, impact limité, signaux surveillés, rollback prêt, décision claire et résultat documenté.
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 needed
3.6 Capacité & performance : CPU, RAM, disque, connexions, queues, saturation et seuils
Capacité & 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.

Objectif professionnel : construire une vision production qui permet de savoir quand le système est sain, quand il se dégrade, quand il faut scaler, et quand il faut corriger l’architecture plutôt que simplement ajouter des machines.
Les grandes dimensions de capacité
ZoneCe qu’on observeRisque si ignoré
CPUUtilisation, load average, steal time, throttling.Latence, timeouts, jobs lents.
RAMMémoire disponible, swap, OOM killer.Crash process, redémarrages, lenteur.
DisqueEspace, inodes, I/O wait, latence disque.Écriture impossible, DB lente, logs bloqués.
RéseauDébit, erreurs, connexions, saturation LB.Timeouts, pertes, erreurs intermittentes.
DatabaseConnexions, locks, slow queries, cache hit ratio.Application lente ou bloquée.
QueuesBacklog, â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 / OOM
Capacité vs performance
ConceptQuestionExemple
CapacitéCombien peut-on absorber ?500 req/s avant saturation.
PerformanceÀ quelle vitesse répond-on ?p95 à 180 ms.
SaturationQuelle ressource bloque ?DB connections à 95%.
ScalabilitéPeut-on augmenter la capacité ?Ajouter workers ou replicas.
RésilienceQue se passe-t-il en surcharge ?Dégradation contrôlée plutôt que crash.
Règle : une alerte capacité doit prévenir avant la panne, pas confirmer que le service est déjà tombé.
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
SignalExemplePourquoi
Latencep50, p95, p99.Montre l’expérience utilisateur réelle.
TraficRequests/sec, jobs/min, messages/sec.Comprendre la charge entrante.
ErreursHTTP 5xx, exceptions, failed jobs.Détecter régression ou saturation.
SaturationCPU, 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 marker
Corrélation utile
ObservationHypothèse
Latence monte + DB connections hautesPool DB saturé ou requêtes lentes.
CPU bas + I/O wait hautBlocage disque ou stockage lent.
Queue backlog monte + CPU workers basWorkers bloqués sur I/O ou dépendance externe.
5xx monte après releaseRégression applicative probable.
Disque monte + logs explosentBug générant trop d’erreurs ou debug activé.
Bonne pratique : annoter les dashboards avec les déploiements. Cela accélère énormément le diagnostic.
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 5
CPU : ce qu’il faut comprendre
MétriqueLecture
CPU userTemps passé dans le code applicatif.
CPU systemTemps noyau, réseau, I/O, syscalls.
I/O waitCPU attend le disque ou stockage.
Steal timeVM pénalisée par l’hyperviseur.
Load averageNombre de tâches en attente CPU/I/O.
RAM : signaux dangereux
SignalRisqueAction
Mémoire disponible très basseOOM imminent.Identifier process, réduire charge, scaler.
Swap utilisée fortementLatence importante.Comprendre fuite mémoire ou sizing insuffisant.
OOM killerProcess tué par le kernel.Analyser mémoire, limites, leak, workers.
RSS process augmente sans redescendrePossible 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 externe
Seuils indicatifs
CPU > 80% durableWarning capacité.
CPU > 90% durableCritique si latence augmente.
Swap active en prod webÀ investiguer rapidement.
OOM killer détectéIncident ou quasi-incident.
Attention : ajouter de la RAM peut masquer une fuite mémoire. Il faut corriger la cause si la croissance est continue.
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
                            iotop
Règle : ne jamais supprimer manuellement des fichiers de base de données pour libérer de l’espace.
Diagnostic disque
SymptômeCause probableAction
df -h hautLogs, 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 explosentErreur en boucle ou debug activé.Corriger cause, réduire niveau log.
Seuils disque recommandés
SeuilNiveauAction
70%InformationSurveiller tendance.
80%WarningIdentifier croissance.
90%CritiqueCleanup contrôlé ou extension urgente.
95%Incident imminentAction immédiate.
Bonne pratique : alerter aussi sur la vitesse de croissance, pas seulement sur le pourcentage d’espace utilisé.
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
SignalPourquoi
Connexions activesRisque d’atteindre la limite max connections.
Requêtes lentesAugmentent latence et consommation CPU/I/O.
LocksPeuvent bloquer toute une chaîne applicative.
Transactions longuesMaintiennent locks et empêchent vacuum/cleanup.
Cache hit ratioIndique si DB lit trop sur disque.
Replication lagRisque 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\G
Diagnostic 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 prudent
Pool de connexions
Trop petitRequêtes en attente côté app.
Trop grandDB saturée par trop de connexions.
Sans timeoutThreads bloqués longtemps.
Sans limite par workerExplosion lors du scaling horizontal.
Règle : augmenter le nombre de connexions DB peut aggraver le problème si la base est déjà saturée.
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étriqueCe qu’elle ditRisque
BacklogNombre de messages en attente.Retard de traitement.
Oldest message ageÂge du plus vieux message.SLA métier dépassé.
ThroughputMessages traités par minute.Capacité workers insuffisante.
Failed jobsJobs en erreur.Bug applicatif ou dépendance KO.
RetriesRetentatives.Peut amplifier la charge.
Worker utilizationWorkers 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.service
Diagnostic 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 à surveiller
Actions possibles
ActionQuandRisque
Ajouter workersCPU/RAM disponibles, jobs parallélisables.Saturer DB ou API externe.
Réduire concurrenceDB ou API externe saturée.Backlog plus lent à résorber.
Prioriser queuesJobs critiques vs non critiques.Complexité opérationnelle.
Rate limitDépendance externe fragile.Retard accepté.
Dead-letter queueMessages toxiques ou retry infini.Besoin traitement manuel.
Attention : scaler les workers sans regarder la DB peut déplacer la saturation vers la base de données.
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étriqueWarningCritique
CPU> 80% pendant 10 min> 90% pendant 10 min + latence
RAM< 15% disponibleSwap 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 backlogBacklog croissantÂge message > SLA métier
Important : ces seuils sont des points de départ. Les vrais seuils doivent être calibrés avec l’historique du service.
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 backlog
Alerte utile vs bruit
BruitAlerte 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.
Bonne pratique : alerter sur la tendance et l’impact utilisateur, pas seulement sur une valeur technique isolée.
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
TypePrincipeQuand
VerticalAugmenter taille machine.DB, instance unique, besoin rapide.
HorizontalAjouter replicas/instances.Application stateless, workers, API.
AutoscalingScaler selon métriques.Charge variable et métriques fiables.
PartitionnementDécouper données/charge.Très gros volumes ou limites DB.
CacheRéduire charge DB/app.Lectures répétitives, données cacheables.
Optimisation code/SQLRé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-change
Autoscaling : métriques possibles
MétriqueAdapté pourLimite
CPUApps CPU-bound.Mauvais pour I/O-bound.
RPSAPIs web.Ne reflète pas coût par requête.
LatenceImpact utilisateur.Peut venir de DB ou API externe.
Queue backlogWorkers asynchrones.Besoin limite pour protéger DB.
Custom business metricCas 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.
Attention : l’autoscaling peut amplifier un incident si chaque nouvelle instance ajoute des connexions DB ou des retries vers un service déjà saturé.
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 | tail
Mitigations rapides
CauseMitigationAttention
CPU app saturéScale horizontal ou rollback release.Vérifier DB avant scale massif.
RAM / OOMRestart contrôlé, scale, réduire workers.Analyser fuite mémoire ensuite.
Disque pleinCleanup logs/tmp, extension volume.Ne pas supprimer fichiers DB.
DB saturéeRéduire concurrence, tuer requête fautive, rollback.Action DBA si prod critique.
Queue backlogAjouter workers ou prioriser queues.Protéger DB/API externes.
API externe lenteTimeout, 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éventive
Bonne pratique : après mitigation, traiter la cause racine. Sinon la saturation reviendra au prochain pic.
Anti-patterns capacité & performance
Anti-patternPourquoi c’est dangereuxCorrection professionnelle
Alerter seulement à 100%Trop tard pour réagir.Warning, critique et tendance.
Scaler sans identifier le goulotDéplace ou aggrave la saturation.Diagnostic CPU/RAM/DB/queue d’abord.
Ignorer la latence p95/p99La moyenne cache les utilisateurs impactés.Suivre percentiles et erreurs.
Trop de connexions DBLa DB sature plus vite.Pool sizing et limites par service.
Logs debug permanentsCoût, disque et I/O explosent.Niveaux log contrôlés et retention.
Retries agressifsAmplifient les incidents.Backoff, jitter, circuit breaker.
Queues sans SLABacklog invisible côté utilisateur au début.Alerter sur âge du plus vieux message.
Pas de test de chargeLimites 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 hasard
Résultat : les incidents sont détectés trop tard et corrigés par improvisation.
Bon modèle
Capacité pilotée
                            ├── baseline historique
                            ├── seuils warning/critique
                            ├── p95/p99
                            ├── DB metrics
                            ├── queue backlog + age
                            ├── runbooks
                            └── capacity planning
Résultat : les saturations sont anticipées, expliquées et traitées durablement.
Checklist Capacité & performance
Checklist dashboard production
ZoneMétriques attendues
HTTPRPS, 4xx, 5xx, latence p50/p95/p99.
ApplicationExceptions, threads/workers, restarts, version active.
CPUUtilisation, load, steal, throttling.
RAMDisponible, swap, OOM, RSS process.
DisqueEspace, inodes, I/O wait, latence disque.
DBConnexions, locks, slow queries, CPU, I/O.
QueuesBacklog, oldest message age, failed jobs, retries.
DéploiementsAnnotations releases et changements infra.
Checklist alertes
Warning avant critiqueTemps pour agir avant panne.
Durée minimumÉviter bruit sur pics courts.
Runbook liéAction claire pour l’astreinte.
Owner définiResponsabilité de correction.
Seuils revusAdaptés à la vraie baseline.
Checklist incident capacité
QuestionRé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.
Définition d’une bonne gestion capacité : connaître la baseline, détecter les dérives, alerter avant saturation, mitiger vite et corriger durablement.
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 age
3.7 Incidents base de données : connexions, locks, lenteurs, disque, backups et restauration
Incidents 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.

Objectif professionnel : stabiliser la production sans aggraver l’état des données : diagnostiquer vite, mitiger prudemment, préserver les preuves, communiquer clairement et préparer une restauration seulement si elle est vraiment nécessaire.
Familles d’incidents DB
FamilleSymptômesRisque
ConnexionsMax connections atteint, pool saturé, timeouts.Application incapable de parler à la DB.
LocksTransactions bloquées, requêtes en attente.Écritures ou lectures critiques figées.
Lenteurs SQLSlow 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 / restoreBackup absent, restore non testé, RPO/RTO flous.Perte de données ou indisponibilité prolongée.
RéplicationReplica 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éventives
Règles de prudence
RèglePourquoi
Commencer en lecture seuleÉviter d’aggraver l’incident.
Identifier le dernier changementDéploiement, migration, batch, index, trafic.
Ne pas supprimer des fichiers DB à la mainRisque de corruption ou perte irréversible.
Vérifier backup avant action destructriceLa restauration est le dernier filet de sécurité.
Documenter la timelineIndispensable pour RCA et décision de restore.
Règle : pendant un incident DB, une action “rapide” mais mal comprise peut transformer une lenteur en perte de données.
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
QuestionPourquoiExemple 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 -tulpn
Arbre 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ômeHypothèse prioritaire
“Too many connections”Pool trop large, fuite connexions, trafic élevé.
Timeouts SQLLocks, requêtes lentes, I/O saturé.
Écritures échouentDisque plein, locks, transaction log, quota.
Lectures obsolètesReplica lag ou cache incohérent.
CPU DB à 100%Requête lourde, manque index, batch, plan SQL.
DB service restart en boucleDisque, corruption, config, mémoire.
Bonne pratique : afficher rapidement une timeline : dernier deploy, dernier batch, dernière migration, début alertes, première mitigation.
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
CauseSymptômeCorrection
Pool applicatif trop grandTrop 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éesBeaucoup de sessions idle.Timeouts, pooling, correction app.
Transactions longuesConnexions actives longtemps.Réduire transaction, optimiser requête.
Workers batch trop nombreuxDB 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.
Règle : augmenter 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\G
Décision sur un lock
SituationAction possiblePrudence
Requête SELECT longueCancel si impact élevé.Vérifier origine et utilité.
Migration bloquanteStopper migration, rollback si possible.Vérifier état partiel.
Transaction métier longueContacter owner, terminer si nécessaire.Risque rollback transaction.
Batch bloque prodStopper 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 / mitigation
Attention : tuer une session DB peut rollback une transaction importante. Toujours identifier ce qu’elle fait avant action.
Lenteurs 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
CauseSignalCorrection
Index manquantTable scan, CPU/I/O élevés.Ajouter index adapté, tester coût écriture.
N+1 queriesExplosion nombre requêtes par page.Optimiser ORM, prefetch/select related.
Requête trop largeBeaucoup de lignes lues/retournées.Pagination, filtres, colonnes ciblées.
Stats obsolètesMauvais plan d’exécution.Analyze/vacuum selon moteur.
Lock masquéRequête “lente” mais en attente.Identifier wait event / bloqueur.
Cache froidLenteur 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 appels
Règle : ajouter un index peut accélérer les lectures mais ralentir les écritures. Il faut valider l’impact global.
Disque 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 procedure
Règle absolue : ne jamais supprimer à la main des fichiers internes DB pour “gagner de la place”.
Causes fréquentes
CauseSymptômeAction prudente
Logs applicatifs/var/log énorme.Rotation, vacuum journald, corriger bruit.
Backups locauxRépertoire backup plein.Archiver/supprimer selon rétention validée.
WAL/binlogsJournaux transactionnels énormes.Vérifier réplication/backup avant purge.
Table énormeCroissance data non prévue.Archivage, partitionnement, purge applicative.
Index trop nombreuxDB grossit vite.Audit index inutilisés, suppression contrôlée.
Temp filesRequê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éventif
Bonne pratique : le meilleur correctif disque DB est souvent d’étendre le volume puis d’analyser calmement la cause.
Backups : 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
ConceptDéfinitionQuestion opérationnelle
RPOPerte de données maximale acceptable.Peut-on perdre 5 min, 1 h, 24 h ?
RTOTemps maximal pour restaurer le service.Doit-on restaurer en 15 min ou 4 h ?
Full backupSauvegarde complète.Combien de temps pour restaurer ?
Incremental / WAL / binlogPermet point-in-time recovery.Les journaux sont-ils complets ?
RetentionDurée de conservation.Conforme métier/légal/coût ?
Restore testPreuve 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.sql
Checklist backup sérieux
PointValidation 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 sourceRésiste à perte serveur.
Rétention clairePolitique 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 RTO
Attention : un backup jamais restauré est une hypothèse, pas une garantie.
Restauration : 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
TypeUsageRisque
Restore completDB remplacée par backup.Perte depuis backup.
Point-in-time recoveryRevenir juste avant erreur.Complexité et validation.
Restore parallèleRestaurer ailleurs pour extraire données.Plus sûr, plus lent.
Table-level restoreRécupérer une table spécifique.Cohérence référentielle.
Failover replicaBasculer 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 restore
Questions 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.
Règle : ne jamais lancer une restauration complète en production sans validation explicite du point de restauration et de la perte de données acceptable.
Monitoring DB : alertes, dashboards et signaux faibles
Dashboard DB minimal
ZoneMétriques
DisponibilitéDB up, connexions acceptées, erreurs.
ConnexionsActive, idle, max connections, pool usage.
PerformanceQPS/TPS, latence requêtes, slow queries.
LocksLock waits, transactions longues, deadlocks.
StockageDisque, croissance, WAL/binlogs, temp files.
RessourcesCPU, RAM, cache hit ratio, I/O wait.
RéplicationReplica lag, statut réplication, failover readiness.
BackupsDernier backup réussi, durée, taille, restore test.
Seuils d’alerte indicatifs
MétriqueWarningCritique
Connexions> 75%> 90%
Disque> 80%> 90% ou croissance rapide
LocksLock wait durableÉcritures bloquées
Slow queriesHausse vs baselineImpact latence app
BackupBackup plus vieux que prévuAucun backup valide récent
Replication lagLag croissantLag 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 validated
Signaux 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.
Bonne pratique : surveiller les tendances DB, pas seulement les seuils fixes. Les bases de données préviennent souvent avant de tomber.
Anti-patterns incidents DB
Anti-patternPourquoi c’est dangereuxCorrection professionnelle
Agir avant d’observerOn peut tuer la mauvaise session ou supprimer la mauvaise donnée.Premières actions read-only.
Supprimer fichiers DB à la mainRisque corruption ou perte irréversible.Procédures officielles DB uniquement.
Augmenter max_connections réflexePeut saturer CPU/RAM/locks.Analyser pools et requêtes.
Tuer des sessions sans contexteRollback transaction métier possible.Identifier owner, requête, durée, impact.
Restore complet trop rapidePerte 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 migrationsLocks, table scan, downtime caché.Plan de migration, tests volume, fenêtre.
Pas de timelineRCA 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 timeline
Résultat : risque de perte de données, downtime prolongé et RCA impossible.
Bon 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évention
Résultat : la production est stabilisée sans compromettre l’intégrité des données.
Checklist Incidents base de données
Checklist triage immédiat
PointValidation attendue
Impact utilisateurLecture, écriture, service complet ou partiel.
EnvironnementProduction, staging, replica, primary clairement identifiés.
Dernier changementDéploiement, migration, batch, config, trafic.
ConnexionsActive, idle, max, application source.
LocksBloqueur, bloqué, durée, type de requête.
Slow queriesTop requêtes par durée ou coût.
DisqueEspace, inodes, WAL/binlogs, backups, logs.
BackupsDernier backup valide et stratégie restore connue.
Checklist action prudente
Action read-only d’abordObservation sans modification.
Owner consulté si action destructiveDBA/SRE/app owner selon contexte.
Backup vérifié avant restore ou purgePas de décision à l’aveugle.
Mitigation préférée au grand gesteRéduire trafic, batch, pool, workers.
Timeline maintenueDécisions et heures notées.
Checklist post-incident
QuestionRé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.
Définition d’une bonne gestion d’incident DB : impact compris, diagnostic read-only, mitigation prudente, données protégées, décision documentée et restauration testée si nécessaire.
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.sql
3.8 Incidents réseau : DNS, TLS, Nginx, firewall, load balancer, routes et ports
Incidents 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.

Objectif professionnel : isoler rapidement la couche fautive, confirmer l’impact utilisateur, appliquer une mitigation réversible, puis documenter la cause pour éviter la récidive.
Familles d’incidents réseau
FamilleSymptômesRisque
DNSDomaine ne résout pas, mauvaise IP, propagation incohérente.Service inaccessible pour tout ou partie des utilisateurs.
TLSCertificat expiré, chaîne invalide, SNI incorrect.Erreur navigateur, API clients bloquées.
Nginx / proxy502, 503, 504, mauvais upstream, config cassée.Application saine mais inaccessible.
Firewall / portsConnexion refusée, timeout, port fermé.Flux bloqué entre client, proxy, app ou DB.
Load balancerTargets unhealthy, health check KO, mauvais listener.Trafic non routé ou routé vers mauvais backend.
Routes / cloud networkSubnet 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.log
Règle : un incident réseau se diagnostique de l’extérieur vers l’intérieur, puis de l’intérieur vers la dépendance fautive.
Chemin 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 APIs
Questions à poser
QuestionPourquoi
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ômeHypothèse prioritaire
NXDOMAINDomaine ou zone DNS incorrecte.
Connection refusedPort fermé ou service non écoutant.
Connection timed outFirewall, route, security group ou host inaccessible.
SSL certificate problemCertificat expiré, mauvais domaine, chaîne incomplète.
502 Bad GatewayNginx/LB ne joint pas l’upstream.
504 Gateway TimeoutUpstream 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/
Bonne pratique : tester depuis plusieurs points de vue : poste utilisateur, serveur, réseau interne, externe et éventuellement autre région.
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 +answer
Points à vérifier
PointContrôle
Record A / CNAMEPointe vers la bonne IP ou le bon load balancer.
AAAAIPv6 ne pointe pas vers une cible cassée.
TTLPas trop long avant changement sensible.
Zone autoritativeLa bonne zone DNS est modifiée.
PropagationRésultats cohérents entre resolvers.
Scénarios DNS fréquents
SymptômeCause probableAction
Certains clients OK, d’autres KOPropagation ou cache DNS.Comparer resolvers, attendre TTL si besoin.
Domaine pointe vers ancienne IPRecord non modifié ou mauvaise zone.Corriger zone autoritative.
IPv4 OK, IPv6 KORecord AAAA cassé.Corriger ou retirer AAAA.
WWW OK, apex KORecords différents entre domaines.Comparer A/CNAME apex et www.
Validation certificat échoueDNS 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
                            └── documenter
Attention : le rollback DNS peut être ralenti par le TTL déjà propagé. Préparer les TTL avant les bascules sensibles.
TLS / 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
PointContrôle
ExpirationDate notAfter dans le futur.
Subject / SANLe domaine appelé est inclus.
ChaîneCertificat intermédiaire fourni.
SNIBon certificat selon hostname.
RedirectionHTTP vers HTTPS sans boucle.
Symptômes TLS
ErreurCause probableCorrection
Certificate expiredRenouvellement échoué.Renouveler certificat, recharger Nginx.
Hostname mismatchCertificat ne couvre pas le domaine.Émettre certificat avec SAN correct.
Unable to get issuerChaîne intermédiaire incomplète.Utiliser fullchain.
Wrong certificate servedSNI/vhost incorrect.Vérifier server_name et listen 443.
Too many redirectsBoucle 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;
                            }
                            }
Règle : après tout renouvellement ou changement TLS, faire 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 | less
Tester 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
CodeSignification probableDiagnostic
400Host/header/proxy protocol incorrect.Vérifier headers et vhost.
404Mauvais vhost ou route app absente.Vérifier server_name et location.
502Upstream down/refuse/mauvais socket.Tester app backend et logs.
503Maintenance, overload ou upstream unavailable.Vérifier mode maintenance / LB.
504Timeout 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;
                            }
Attention : augmenter les timeouts Nginx peut masquer une vraie lenteur applicative ou DB. Il faut comprendre pourquoi l’upstream ne répond pas.
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-all
Interprétation
RésultatSignification probable
Connection refusedHost joignable, port fermé ou service down.
TimeoutFirewall, route, security group ou paquet perdu.
Port écoute sur 127.0.0.1Accessible localement seulement.
Port écoute sur 0.0.0.0Accessible sur toutes interfaces si firewall OK.
Checklist firewall cloud
CoucheContrôle
Security group inboundSource, port, protocole corrects.
Security group outboundSortie autorisée vers dépendances.
NACL / ACL réseauRègles stateless dans les deux sens.
OS firewallUFW/iptables/nftables cohérents.
Service listen addressApplication écoute sur la bonne interface.
Port mapping containerContainer 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 internes
Règle : ne jamais ouvrir largement 0.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
ZoneContrôle
ListenerPort 80/443 actif, certificat correct.
RulesHost/path routing vers bon target group.
Target healthInstances/pods healthy.
Healthcheck pathChemin répond vite et sans dépendance fragile.
Security groupsLB peut joindre les backends.
TimeoutsAdapté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 ready
Bonne pratique : un healthcheck doit tester que l’instance peut servir du trafic, mais ne doit pas dépendre d’un service externe lent pour chaque vérification.
Diagnostic 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/HTTPS
Erreurs fréquentes LB
ErreurEffet
Healthcheck sur endpoint authentifiéTargets toujours unhealthy.
Healthcheck trop strictInstances retirées malgré app utilisable.
Backend écoute HTTP mais LB parle HTTPSErreurs de connexion.
Mauvais target group après deployTrafic vers ancienne ou mauvaise version.
Timeout LB trop court504 sur traitements longs.
Attention : si toutes les targets deviennent unhealthy après un deploy, penser immédiatement à la route healthcheck, au port, au security group et à la version app.
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
ComposantCe qu’il faut vérifier
Route tableRoute vers internet, NAT, peering ou VPN.
Subnet publicRoute vers internet gateway.
Subnet privéRoute vers NAT pour sorties internet si besoin.
NACLInbound/outbound stateless, ports éphémères.
Peering/VPNRoutes des deux côtés, CIDR non conflictuel.
DNS interneRé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/timeouts
Pièges cloud fréquents
PiègeSymptôme
NAT absente en subnet privéInstances ne sortent pas vers internet.
NACL bloque ports éphémèresTimeouts intermittents ou unidirectionnels.
Routes peering dans un seul sensFlux aller OK, retour impossible.
CIDR chevauchantsRoutage ambigu ou impossible.
DNS privé non associé au VPCNom interne ne résout pas.
Bonne pratique : documenter les flux attendus sous forme : source, destination, port, protocole, chemin réseau, owner.
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 -h
Mitigations fréquentes
CauseMitigationPrudence
DNS mauvais recordRollback record précédent.TTL peut ralentir correction.
Certificat expiréRenouveler, vérifier fullchain, reload Nginx.Tester SNI et tous domaines.
Nginx config casséeRevert config, nginx -t, reload.Ne pas restart brutal si reload suffit.
Firewall trop restrictifRestaurer règle précédente minimale.Ne pas ouvrir largement.
Targets LB unhealthyRollback app ou healthcheck, corriger port.Vérifier logs app.
Route cloud manquanteRestaurer 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éseau
Bonne pratique : pendant l’incident, noter les résultats de commandes clés. Cela évite de refaire trois fois le même test et accélère la RCA.
Anti-patterns incidents réseau
Anti-patternPourquoi c’est dangereuxCorrection professionnelle
Redémarrer avant diagnosticMasque la cause et peut aggraver l’incident.Observer DNS/TLS/proxy/ports/logs d’abord.
Confondre 502 et panne applicativeLe problème peut être upstream, socket ou proxy.Tester backend depuis Nginx.
Ouvrir 0.0.0.0/0 pour testerExpose SSH, DB ou services internes.Autoriser source minimale temporaire.
Modifier DNS sans noter l’ancien recordRollback difficile.Capturer valeur avant changement.
Reload Nginx sans nginx -tConfig invalide peut casser production.Toujours tester avant reload.
Ignorer IPv6 / AAAACertains clients peuvent être KO seulement en IPv6.Tester A et AAAA.
Healthcheck trop complexeLB retire des instances pour une dépendance externe lente.Healthcheck rapide et stable.
Pas de timelineRCA 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 timeline
Résultat : panne plus longue, risque sécurité et cause racine perdue.
Bon 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é
Résultat : diagnostic rapide, mitigation sûre et prévention possible.
Checklist Incidents réseau
Checklist diagnostic immédiat
ZoneValidation attendue
ImpactUtilisateurs touchés, région, navigateur/API, depuis quand.
DNSA/CNAME/AAAA, TTL, resolvers publics, zone autoritative.
TLSExpiration, SAN, chaîne, SNI, redirections.
HTTPCode retour, headers, redirections, health endpoint.
Nginxnginx -t, logs, upstream, reload récent.
Portsss, nc, service listening, firewall OS.
Load balancerListeners, rules, target health, healthcheck path.
Cloud networkSecurity groups, NACL, routes, NAT, peering, VPN.
Checklist avant correction
Ancienne configuration capturéeDNS, Nginx, firewall ou LB rollbackable.
Blast radius comprisQuel service ou environnement sera touché.
Commande reluePas de modification destructive improvisée.
Fenêtre ou communicationSi production fortement impactée.
Post-check prêtcurl, logs, dashboard, healthcheck.
Checklist post-incident
QuestionRé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.
Définition d’une bonne gestion d’incident réseau : chemin de requête compris, couche fautive isolée, mitigation minimale, sécurité préservée, retour nominal vérifié et prévention documentée.
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.com
4.4 IAM approfondi : roles, policies, assume-role, least privilege et break-glass
IAM : 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.

Objectif professionnel : construire un modele IAM lisible : roles par environnement, policies minimales, assume-role controle, separation plan/apply, break-glass rare et journalise, revue reguliere des acces.
Les dimensions IAM a maitriser
DimensionQuestionRisque si mal gere
IdentiteQui ou quoi agit ?Utilisateur ou service non identifie.
PermissionQuelles actions sont autorisees ?Droits trop larges ou pipeline bloque.
RessourceSur quoi l’action s’applique ?Impact hors perimetre attendu.
ContexteDepuis quelle branche, compte, IP, OIDC, MFA ?Utilisation depuis un contexte non fiable.
DureeAcces permanent ou temporaire ?Credentials oublies ou compromis.
AuditPeut-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 logs
IAM en une phrase
Mauvais modeleBon 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.
Règle : chaque permission IAM doit pouvoir etre justifiee par un usage, un owner, un environnement et un risque accepte.
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
ConceptDefinitionExemple
UserIdentite humaine ou technique permanente.Compte admin, service account historique.
RoleIdentite assumable avec permissions.prod-terraform-apply-role.
PolicyDocument qui autorise ou refuse des actions.s3:GetObject sur un bucket.
Trust policyDefinit qui peut assumer un role.GitLab OIDC peut assumer role CI.
Assume-roleObtention de credentials temporaires.Pipeline prend role Terraform staging.
ConditionRestriction contextuelle.Branche main, MFA, IP, tag, audience OIDC.
Permission boundaryLimite 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 autorisee
Questions a poser sur chaque droit
QuestionBut
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/*"
                            ]
                            }
Règle : 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
RoleUsageRisque
dev-readonly-roleLire ressources dev, debug simple.Faible.
staging-terraform-plan-roleLire state et ressources pour plan.Moyen.
staging-terraform-apply-roleModifier infra staging.Moyen a eleve.
prod-terraform-plan-roleLire production et produire un plan.Eleve en lecture sensible.
prod-terraform-apply-roleModifier infrastructure production.Critique.
prod-breakglass-admin-roleUrgence 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-role
Separation 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 mandatory
Role design
Bonne pratiquePourquoi
Un role par environnementEvite qu’un job dev touche production.
Un role par usageReduit le blast radius.
Sessions temporairesEvite les credentials long terme.
Trust policy stricteLimite qui peut assumer le role.
Tags et ownerFacilite audit et revue.
Bonne pratique : un role IAM doit avoir un owner, un usage, un environnement, une policy associee et une procedure de 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
MauvaisMeilleur
Resource: "*"ARN exact ou prefixe limite.
Action: "s3:*"Actions necessaires seulement.
Policy unique massivePolicies par usage.
Pas de conditionConditions sur env, tags, OIDC, MFA.
Permissions dangereuses a surveiller
PermissionRisque
iam:PassRolePeut permettre d’utiliser un role plus privilegie.
iam:CreatePolicyVersionPeut modifier une policy pour s’ajouter des droits.
sts:AssumeRole largePeut prendre des roles non prevus.
kms:DecryptAcces a secrets ou donnees chiffrees.
secretsmanager:GetSecretValueExposition de secrets applicatifs.
ec2:AuthorizeSecurityGroupIngressOuverture 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"
                            }
                            }
                            }
Attention : une policy peut sembler limitee mais permettre une escalation via 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 policy
Commande AWS CLI
aws sts assume-role \
                            --role-arn arn:aws:iam::123456789012:role/prod-readonly-role \
                            --role-session-name incident-readonly-check
Verifier 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
RisqueCorrection
Trust trop largeLimiter principal et conditions.
Session trop longueReduire duree selon usage.
Role chain complexeDocumenter chemins d’assumption.
Pas de session name expliciteForcer noms utiles pour audit.
Assume-role cross-account non controleLimiter comptes et roles cibles.
Bonne pratique : imposer des session names explicites : ticket, pipeline id, utilisateur ou contexte operationnel.
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
JobRole IAMContexte
fmt / validateAucun role cloud.Toutes branches.
plan devdev-terraform-plan-roleBranches dev.
plan prodprod-terraform-plan-roleMR/main protegee.
apply stagingstaging-terraform-apply-roleEnvironment staging protege.
apply prodprod-terraform-apply-roleManual 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/apply
Controles obligatoires
ControleBut
Variables protectedPas de secrets prod en feature branch.
Environment scopeCredential prod uniquement pour prod.
Protected runnerExecution sur runner maitrise.
Manual applyDecision humaine production.
Identity checkaws sts get-caller-identity dans logs.
Règle : un job de feature branch ne doit jamais pouvoir assumer un role d’apply production.
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
ActeurDroits normauxDroits interdits
DeveloperMR, lecture dev, logs non sensibles.Apply prod, secrets prod.
DevOpsPlan, staging apply, review infra.Admin global permanent.
SREProduction operations, incident response.Contourner audit ou approvals.
SecurityReview IAM, audit, policies.Deploy applicatif sans procedure.
GitLab CIRoles 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 trail
Regles de separation
ReglePourquoi
Pas d’admin permanent par defautReduit impact compromission.
Pas de compte partageAudit impossible sinon.
Production via role dedieSeparation env et audit.
Apply prod manuelDecision explicite.
Break-glass hors routineUrgence uniquement.
Revue periodique des accesSupprime 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 resultat
Bonne pratique : la separation des droits doit etre lisible dans GitLab, dans le cloud IAM et dans les runbooks.
Break-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
CaracteristiqueExigence
RareUtilise seulement en incident ou urgence validee.
FortPeut corriger une situation bloquante.
TemporaireSession courte, expiration, retrait apres usage.
MFA obligatoireProtection contre compromission simple.
JournaliseChaque action doit etre reconstruisible.
Revu apres usagePost-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 / RCA
Ce qui doit declencher une revue
Break-glass utilise hors incidentSignal de contournement process.
Session longueRisque de derive operationnelle.
Actions non documenteesAudit insuffisant.
Usage recurrentLe chemin normal est mal concu.
Acces non revoqueDette securite critique.
Règle : un break-glass utilise regulierement n’est plus un break-glass : c’est un trou dans le modele de securite.
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
ElementPreuve attendue
Assume-roleRole source, role cible, session name, heure.
GitLab pipelineJob, commit, branche, environment, trigger user.
Terraform applyPlan artifact, approver, job manuel, logs.
Policy changesDiff Git, approver security, audit cloud.
Secret accessQui a lu quel secret et pourquoi.
Break-glassTicket 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
FrequenceAction
MensuelleRevoir break-glass usage et comptes inactifs.
TrimestrielleRevoir roles production et Maintainers GitLab.
Apres incidentVerifier actions IAM et chemins de privilege.
Avant audit externeExporter 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?
Bonne pratique : chaque role critique doit avoir un owner, une date de derniere revue et une justification.
Anti-patterns IAM
Anti-patternPourquoi c’est dangereuxCorrection professionnelle
Compte admin partageAudit impossible, responsabilite floue.SSO, roles nominatifs, MFA.
Access keys permanentes dans CIFuite durable si logs ou variables compromises.OIDC ou credentials temporaires.
Action: "*" partoutBlast radius enorme.Actions minimales par usage.
Resource: "*" sans justificationImpact hors perimetre.ARNs cibles et conditions.
Pas de separation dev/prodErreur dev peut toucher prod.Roles et comptes separes.
Terraform admin globalPipeline compromis = compte compromis.Plan/apply roles limites.
Break-glass quotidienProcess normal contourne.Corriger permissions standard.
Pas de revue des accesDroits 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 banalise
Resultat : risque de compromission, actions non tracables, blast radius massif et audit impossible.
Bon modele
IAM maitrise
                            ├── federation / SSO
                            ├── roles par env
                            ├── OIDC CI/CD
                            ├── least privilege
                            ├── approvals IAM
                            ├── audit trail
                            └── break-glass controle
Resultat : permissions lisibles, risque reduit, production protegee et incidents reconstruisibles.
Checklist IAM approfondi
Checklist design IAM
PointValidation attendue
Roles par environnementDev, staging et prod separes.
Roles par usageRead, plan, apply, deploy, audit, break-glass.
Least privilegeActions et ressources limitees.
Trust policy strictePrincipal et conditions controles.
Credentials temporairesOIDC ou assume-role plutot que keys longues.
Conditions contextuellesMFA, branch, env, tags, audience si pertinent.
Owners identifiesChaque role critique a un responsable.
Audit activeCloud audit logs exploitables.
Checklist CI/CD IAM
Feature branch sans prod applyImpossible d’assumer role prod.
Plan role different de apply roleSeparation lecture/modification.
Protected environmentApply prod limite aux autorises.
Identity printed safelyaws sts get-caller-identity sans secrets.
Manual approvalProduction non modifiee automatiquement.
Checklist audit & break-glass
QuestionReponse 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.
Definition d’un IAM professionnel : droits minimaux, roles lisibles, credentials courts, production separee, break-glass controle, audit complet et revue reguliere.
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?
4.5 Supply chain CI/CD : images Docker, dépendances, runners, artifacts et provenance
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.

Objectif professionnel : rendre la chaîne de build et de déploiement vérifiable : versions pinnées, images scannées, runners isolés, secrets protégés, artifacts contrôlés, provenance traçable et droits minimaux.
Les maillons de la chaîne
MaillonRisque principalContrôle attendu
Source GitCommit malveillant, branche non protégée.MR, approvals, branches protégées.
Templates CIJob modifié pour exfiltrer secrets.Templates versionnés, review sécurité.
Images DockerBase image compromise ou vulnérable.Pin par digest, scan, registry contrôlé.
DépendancesPackage compromis, typosquatting, CVE.Lockfiles, SCA, registry interne si besoin.
RunnerRunner partagé, non isolé, persistance de secrets.Runner protégé, éphémère, tags stricts.
ArtifactsArtifact manipulé ou contenant secrets.Expiration, contrôle contenu, accès limité.
RegistryImage remplacée ou tag mutable.Immutabilité, signature, droits push limités.
DéploiementApply/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 notes
Principes de défense
PrincipeApplication
ImmutabilitéDéployer un digest, pas seulement un tag.
TraçabilitéRelier release à commit, pipeline et image.
IsolationRunner prod séparé des jobs non fiables.
Least privilegeLe job build ne doit pas pouvoir apply prod.
VérificationScan, signature, SBOM, policy gates.
Règle : un pipeline CI/CD est un chemin privilégié vers la production. Il doit être traité comme une surface d’attaque critique.
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énarioExempleImpact
Package compromisDépendance npm/pip modifiée.Code malveillant dans build ou runtime.
TyposquattingPackage au nom proche d’un package connu.Installation involontaire d’un malware.
Image Docker non maîtriséelatest change sans contrôle.Build non reproductible, vulnérabilité.
Template CI modifiéAjout d’un curl exfiltrant secrets.Compromission multi-projets.
Runner compromisSecrets 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 compromiseTag production repointé vers autre image.Déploiement d’une image non autorisée.
Risque majeur : une compromission dans un template CI ou un runner partagé peut toucher plusieurs projets en une seule modification.
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 difficile
Contrôles par niveau
NiveauContrôle
PréventionPin, scan, review, protected branch.
DétectionAlertes registry, audit logs, SCA, secret scan.
LimitationLeast privilege, runners isolés, variables scoped.
RéponseRévocation tokens, rebuild propre, rollback image.
Bonne pratique : raisonner en blast radius : “si ce runner/template/token est compromis, jusqu’où l’attaquant peut-il aller ?”
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
PratiquePourquoiExemple
Éviter latestTag mutable, build non reproductible.python:3.12.3-slim
Pinner par digestGarantit le contenu exact.image@sha256:...
Scanner les imagesDétecter CVE critiques.Trivy, Grype, GitLab scanning.
Réduire l’imageMoins de surface d’attaque.slim, distroless, multi-stage.
Utilisateur non-rootLimiter 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 prod
Risques à surveiller
Tag mutableLe contenu change sans changement Git.
Base image obsolèteCVE non corrigées.
Build en rootRisque accru en cas de compromission.
Secrets dans imageFuite durable via layers Docker.
Règle : ne jamais mettre de secret dans un Dockerfile, une image, un layer ou un argument de build conservé dans l’historique.
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ôleButExemples
LockfileReproductibilité des versions.package-lock.json, poetry.lock.
SCA scanDé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 upgradesComprendre 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.txt
Exemple Node.js
# Installer depuis lockfile en CI
                            npm ci

                            # Audit
                            npm audit --audit-level=high
Pipeline 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 production
Signaux d’alerte
SignalPourquoi suspect
Package nouveau et inconnuTyposquatting possible.
Upgrade massif non expliquéRisque régression ou dépendance compromise.
Script postinstall agressifPeut exécuter du code en CI.
Dépendance non maintenueCVE futures non corrigées.
Registry public utilisé pour package interneDependency confusion.
Bonne pratique : séparer les MR de dépendances des MR fonctionnelles. Cela facilite la review et le rollback.
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
RunnerUsageProtection
shared-low-riskLint, tests sans secrets.Pas de variables sensibles.
build-dockerBuild images.Registry push limité.
terraform-devPlan/apply dev.Secrets dev uniquement.
terraform-prodPlan/apply production.Protected runner, protected env.
security-scanScans 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 df
Runner 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 logs
Risques runner
RisqueCorrection
Runner partagé avec secrets prodRunner protégé dédié prod.
Docker socket exposéÉviter ou isoler très strictement.
Cache persistant sensibleNettoyage et cache sans secrets.
Runner non patchéMises à jour et hardening OS.
Tags trop largesTags précis par usage et environnement.
Règle : un runner qui peut déployer en production ne doit pas exécuter des jobs arbitraires de branches non protégées.
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
OutputUsageRisque
plan.txtReview humaine Terraform.Noms de ressources sensibles.
plan.jsonPolicy-as-code.Contenu infrastructure détaillé.
Binary/packageRelease applicative.Remplacement ou corruption.
Cache dependenciesAccélération build.Cache poisoning.
Logs CIDebug 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: always
Règles artifacts/cache
RèglePourquoi
Expiration courteRéduire exposition.
Pas de secretsArtifacts sont consultables selon droits GitLab.
Paths explicitesÉviter d’embarquer trop de fichiers.
Cache non sensibleÉviter fuite ou poisoning.
Review des outputsIdentifier données sensibles.
À ne pas faire
# Dangerous
                            artifacts:
                            paths:
                            - .

                            # Dangerous debug
                            script:
                            - env
                            - printenv
                            - cat .env
                            - cat terraform.tfvars
Debug 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"
                            fi
Attention : un artifact peut rester téléchargeable après l’incident. Un secret exposé dans un artifact doit être considéré compromis.
Provenance : 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émentExempleUtilité
Commit SHACI_COMMIT_SHARelier image au code source.
Pipeline IDCI_PIPELINE_IDRetrouver logs et jobs.
Image digestsha256:...Identifier contenu immuable.
SBOMListe dépendances.Impact CVE et audit.
SignatureImage signée.Vérifier origine.
Release notesChangelog, 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 complete
Questions 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.
Bonne pratique : construire une fois, tester cette même image, puis promouvoir le même digest vers production.
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 digest
Exemple 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
GateBloquant ?Pourquoi
Tests unitairesOuiQualité minimale.
Secret scanOuiÉviter fuite directe.
Dependency critical CVEOui ou exception validéeRisque runtime.
Image critical CVEOui ou exception validéeRisque container.
SBOMRecommandéAudit et impact CVE.
SignatureProduction critiqueProvenance 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ègle : un job de build ou de test exécuté sur une branche non protégée ne doit pas avoir accès aux secrets production.
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ésRéduit persistance attaquant.
Désactiver runner suspectStoppe nouvelles exécutions.
Bloquer image suspecteEmpêche déploiement.
Préserver logsNé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
                            └── RCA
Questions 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é.
Bonne pratique : après exposition potentielle d’un secret CI, on ne “cache” pas le log : on révoque et on régénère le secret.
Anti-patterns supply chain CI/CD
Anti-patternPourquoi c’est dangereuxCorrection professionnelle
Utiliser latestBuild non reproductible.Pinner version et digest.
Runner partagé avec secrets prodRisque d’exfiltration.Runner prod protégé et isolé.
Secrets dans DockerfileFuite durable dans layers.Secrets runtime ou secret manager.
Artifacts trop largesEmbarque fichiers sensibles.Paths explicites et expiration.
Pas de scan imageCVE critiques non détectées.Scan bloquant ou exception validée.
Template CI inclus depuis mainChangement global non maîtrisé.Include versionné par tag.
Déployer un tag mutableImpossible de prouver le contenu.Déployer un digest immuable.
Rebuild entre staging et prodProd 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 prod
Résultat : build non reproductible, secrets exposés, origine difficile à prouver et rollback incertain.
Bon 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 prod
Résultat : chaîne reproductible, auditable, plus sûre et exploitable en incident.
Checklist Supply chain CI/CD
Checklist projet
ContrôleValidation attendue
Branches protégéesProduction uniquement depuis branches autorisées.
Templates CI versionnésInclude sur tag stable, pas main.
Images pinnéesVersions explicites et idéalement digest.
Lockfiles présentsBuild reproductible.
Dependency scanCVE critiques détectées.
Image scanImage bloquée si risque critique non accepté.
Secret scanPas de token dans Git, logs, artifacts.
Artifacts limitésPaths explicites, expiration courte.
Runner protégéProduction sur runner isolé.
ProvenanceCommit, pipeline, digest, release liés.
Checklist avant production
Image testée en stagingMême digest promu vers prod.
Scans verts ou exceptions validéesRisque connu et accepté.
Secrets scoped productionDisponibles seulement au job prod.
Deploy manuel protégéEnvironment + approval.
Rollback image connuDigest précédent disponible.
Checklist audit / incident
QuestionRé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.
Définition d’une supply chain CI/CD maîtrisée : on sait qui a construit quoi, depuis quel commit, avec quelles dépendances, sur quel runner, avec quels droits, et quel digest exact a été déployé.
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 exposed
4.6 Kubernetes pour DevOps : pods, deployments, services, ingress, Helm et production
Kubernetes : 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.

Objectif professionnel : savoir lire un déploiement Kubernetes, comprendre le chemin utilisateur vers un pod, diagnostiquer les erreurs courantes, et éviter de mélanger infrastructure cloud, manifests applicatifs et secrets.
Pourquoi Kubernetes est important pour DevOps
SujetCe que le DevOps doit savoirExemple production
DéploiementComprendre rollout, replicas, images et rollback.Version API déployée progressivement.
RéseauComprendre Service, Ingress, DNS interne et ports.502 sur Ingress vers mauvais service.
ConfigurationDiffé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/CDDé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 APIs
Les objets à connaître
ObjetRôle
PodUnité d’exécution contenant un ou plusieurs containers.
DeploymentGère replicas, rollout et rollback de pods.
ServiceExpose des pods via une adresse stable interne.
IngressExpose HTTP/HTTPS vers l’extérieur.
ConfigMapStocke configuration non sensible.
SecretStocke données sensibles, à protéger fortement.
NamespaceSépare logiquement les environnements ou équipes.
Helm chartPackage de manifests Kubernetes paramétrable.
Règle : Kubernetes ne remplace pas Terraform. Terraform crée souvent le socle cloud, Kubernetes exécute les applications.
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
ConceptDéfinition simpleCommande utile
ClusterEnsemble de nœuds qui exécutent les workloads.kubectl cluster-info
NodeMachine qui héberge des pods.kubectl get nodes
NamespaceSéparation logique dans le cluster.kubectl get ns
PodPlus petite unité déployée.kubectl get pods -n app
DeploymentContrôle les replicas et les rollouts.kubectl get deploy -n app
ServiceAdresse stable devant des pods.kubectl get svc -n app
IngressRoutage HTTP/HTTPS externe.kubectl get ingress -n app
EventTrace 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=.lastTimestamp
Relations 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émentRôleErreur fréquente
LabelMarque un objet.Label pod différent du selector service.
SelectorSélectionne des pods.Service sans endpoint.
AnnotationMétadonnée pour contrôleurs.Ingress annotation incorrecte.
Exemple labels
metadata:
                            labels:
                            app: api
                            environment: production

                            spec:
                            selector:
                            matchLabels:
                            app: api
Bonne pratique : en incident, vérifier très tôt les labels/selectors. Beaucoup de pannes Service/Ingress viennent d’un selector qui ne cible aucun pod.
Pods, 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: 8000
Commandes 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
ÉtatSignification probableAction
PendingPas assez de ressources ou scheduling impossible.describe pod, vérifier nodes/resources.
CrashLoopBackOffContainer démarre puis crash.Lire logs et previous logs.
ImagePullBackOffImage introuvable ou auth registry KO.Vérifier image, tag, pull secret.
Running mais not readyReadiness probe échoue.Vérifier endpoint health et dépendances.
OOMKilledContainer a dépassé la limite mémoire.Analyser mémoire, limits, fuite possible.
Règle : supprimer un pod peut le recréer, mais ne corrige pas la cause. Il faut lire les logs et events avant de nettoyer.
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: 8000
Ingress 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: 80
Commandes 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 production
Chemin réseau Kubernetes
Client externe
                            │
                            ▼
                            DNS public
                            │
                            ▼
                            Load Balancer cloud
                            │
                            ▼
                            Ingress Controller
                            │
                            ▼
                            Ingress rule
                            │
                            ▼
                            Service
                            │
                            ▼
                            Endpoints
                            │
                            ▼
                            Pods ready
Pannes réseau fréquentes
SymptômeCause probableDiagnostic
Ingress 404Host/path mal configuré.Décrire Ingress et controller logs.
502 / 503Service sans endpoints ou pods not ready.kubectl get endpoints
Service ne route pasSelector ne matche aucun pod.Comparer labels pods et selector.
TLS KOSecret TLS absent ou mauvais.Vérifier secret et Ingress.
DNS interne KOService 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.local
Bonne pratique : si un Service ne fonctionne pas, vérifier d’abord ses endpoints. Pas d’endpoint = pas de pod prêt derrière le Service.
ConfigMaps, 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"
Attention : ne pas stocker les vrais secrets en clair dans Git. Utiliser Sealed Secrets, External Secrets, Vault, SOPS ou un secret manager cloud.
Injection dans un Deployment
envFrom:
                            - configMapRef:
                            name: api-config
                            - secretRef:
                            name: api-secret
Différences ConfigMap / Secret
ObjetUsageExemple
ConfigMapConfiguration non sensible.Log level, feature flag, URL publique.
SecretDonnées sensibles.Password, token, private key.
External SecretSynchroniser 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 yaml
Règle : un changement de ConfigMap ou Secret ne redémarre pas toujours automatiquement les pods. Il faut connaître la stratégie de reload de l’application.
Helm 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.yaml
Commandes 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 production
Kustomize : overlays
k8s/
                            ├── base/
                            │   ├── deployment.yaml
                            │   ├── service.yaml
                            │   └── kustomization.yaml
                            │
                            └── overlays/
                            ├── staging/
                            │   └── kustomization.yaml
                            └── production/
                            └── kustomization.yaml
Helm vs Kustomize
OutilAvantageAttention
HelmPackage, release, rollback, values.Templates complexes si mal conçus.
KustomizeSimple, natif kubectl, overlays.Moins orienté package applicatif.
Raw YAMLTrès lisible au début.Duplication rapide entre environnements.
Bonnes pratiques values
Values par environnementstaging et production clairement séparés.
Pas de secret en clairSecrets via outil dédié.
Image tag/digest expliciteDéploiement reproductible.
Diff avant applyReview des changements générés.
Bonne pratique : dans une MR, montrer le diff des manifests rendus avec 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-checks
Exemple 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 production
Garde-fous CI/CD
Garde-fouBut
Image taggée au commit SHATraçabilité.
Scan imageBloquer CVE critiques.
Helm lint/templateDétecter erreurs YAML/chart.
Namespace expliciteÉviter déploiement mauvais environnement.
Protected environmentProduction déployable uniquement par autorisés.
Rollout statusVé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-cluster
Règle : un pipeline de production ne doit jamais déployer dans le cluster sans afficher clairement le contexte Kubernetes, le namespace, la release et l’image.
Debug 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 production
Debug 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 --previous
Diagnostic par symptôme
SymptômeCause probableCommande
CrashLoopBackOffErreur app au démarrage.kubectl logs --previous
ImagePullBackOffImage/tag/registry secret KO.kubectl describe pod
PendingRessources insuffisantes ou node selector.kubectl describe pod
Service 503Pods not ready, endpoints absents.kubectl get endpoints
Rollout bloquéNew pods non ready.kubectl rollout status
OOMKilledLimite 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 / DNS
Bonne pratique : pendant un incident, ne pas commencer par redéployer. Lire d’abord events, describe, logs et rollout status.
Terraform, 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
CoucheOutil recommandéExemples
Cloud foundationTerraformVPC, subnets, IAM, DNS, registry.
ClusterTerraformEKS/GKE/AKS, node pools, add-ons.
Platform add-onsTerraform ou Helm contrôléIngress controller, cert-manager, monitoring.
Application manifestsHelm / Kustomize / GitOpsDeployments, Services, Ingress, HPA.
Runtime deployGitLab CI ou GitOpsPromote 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 production
Pièges Terraform + Kubernetes
PiègeRisqueCorrection
Tout gérer en TerraformState énorme, releases applicatives lourdes.Séparer infra et app deploy.
Tout gérer en HelmCloud/IAM non tracés correctement.Terraform pour socle cloud.
Deux outils gèrent le même objetDrift et conflits.Owner unique par ressource.
Secrets en values HelmFuite Git/artifacts.External Secrets/Vault/SOPS.
Cluster prod modifiable depuis feature branchRisque 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 integration
Règle : une ressource Kubernetes ne doit pas être gérée par deux outils concurrents. Sinon, le drift devient permanent.
Anti-patterns Kubernetes pour DevOps
Anti-patternPourquoi c’est dangereuxCorrection professionnelle
Déployer en prod sans namespace expliciteRisque de mauvaise cible.Toujours préciser -n production.
Utiliser kubectl apply manuel en prodPas de trace CI ni review.Déploiement via GitLab/Helm/GitOps.
Pas de readiness probeTrafic envoyé vers pod non prêt.Définir readiness adaptée.
Secrets en clair dans GitFuite durable.External Secrets, SOPS, Vault, Sealed Secrets.
Pas de requests/limitsScheduling instable, OOM, noisy neighbor.Définir requests/limits réalistes.
Tout gérer dans TerraformState 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 largePipeline 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 check
Résultat : incidents difficiles à diagnostiquer, rollback incertain et risque sécurité élevé.
Bon 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-checks
Résultat : déploiements reproductibles, incidents plus lisibles et production plus stable.
Checklist Kubernetes pour DevOps
Checklist avant déploiement
PointValidation attendue
Contexte Kuberneteskubectl config current-context vérifié.
Namespace expliciteDev, staging, prod séparés.
Image identifiéeTag ou digest clair, idéalement commit SHA.
Helm/Kustomize validéLint/template/diff relu.
Secrets protégésPas de secret en clair dans Git ou artifacts.
Probes définiesReadiness et liveness adaptées.
Resources définiesRequests/limits réalistes.
Rollback connuHelm rollback ou rollout undo documenté.
Checklist debug
Podskubectl get pods -o wide
Logskubectl logs et --previous
Eventskubectl get events --sort-by=.lastTimestamp
Rolloutkubectl rollout status
Servicekubectl get svc,endpoints
Ingresskubectl describe ingress
Checklist production
QuestionRé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.
Définition d’une bonne maîtrise Kubernetes DevOps : savoir lire les objets, suivre le chemin réseau, diagnostiquer pods/services/ingress, déployer via CI/CD, et séparer clairement Terraform, Helm et les responsabilités runtime.
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 production
4.7 Linux hardening : systemd, utilisateurs, SSH, firewall, logs, permissions et mises a jour
Linux 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.

Objectif professionnel : reduire la surface d'attaque sans casser l'exploitation : acces limites, services supervises, ports controles, logs exploitables, mises a jour maitrisees et commandes de diagnostic simples.
Axes principaux de hardening
AxeObjectifExemple concret
UtilisateursEviter root direct et comptes partages.Compte deploy, sudo limite, audit login.
SSHReduire risque brute force et acces non maitrise.Keys only, no root login, port controle.
FirewallOuvrir uniquement les ports necessaires.80/443 publics, SSH limite, DB privee.
SystemdSuperviser proprement les services.Restart policy, EnvironmentFile, logs journald.
LogsDiagnostiquer et reconstruire les incidents.journalctl, logrotate, audit auth.
PermissionsLimiter l'impact d'une compromission.Owner correct, chmod strict, secrets non lisibles.
UpdatesCorriger 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
                            └── alertes
Commandes 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 | tail
Regle : toute mesure de hardening doit rester exploitable. Une securite qui bloque le rollback ou l'acces d'urgence peut aggraver un incident.
Utilisateurs, 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
CompteUsageDroits
rootAdministration systeme exceptionnelle.Login SSH direct interdit.
guillaume / user nominatifAcces humain auditable.Sudo selon besoin.
deployDeploiement applicatif automatise.Acces limite aux dossiers applicatifs.
appExecution de l'application.Pas de shell ou shell limite.
backupJobs de sauvegarde.Lecture ciblee, ecriture backup.
gitlab-runnerExecution 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
                            lastlog
Sudoers 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.service
Principes sudo
PrincipePourquoi
Utiliser visudoEvite de casser sudo avec une syntaxe invalide.
Preferer fichiers dans /etc/sudoers.dPlus lisible et versionnable.
Limiter commandes NOPASSWDEvite escalation trop large.
Eviter comptes partagesAudit impossible sinon.
Retirer comptes obsoletesReduit 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 supprimer
Regle : ne jamais supprimer un compte ou retirer sudo en production sans verifier qu'il n'est pas utilise par un service, un cron ou un pipeline.
SSH 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 deploy
Validation 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@server
Regle absolue : ne jamais fermer sa session active apres modification SSH avant d'avoir teste une nouvelle connexion.
Audit 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_keys
Permissions SSH
Fichier / dossierPermissionPourquoi
~/.ssh700Repertoire prive.
authorized_keys600Cles non modifiables par autres users.
Private key locale600SSH 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 verbose
Bonne pratique : combiner SSH keys, no root login, firewall source limitee, Fail2ban ou equivalent, et surveillance des logs auth.
Firewall, 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 22
UFW 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 verbose
nftables / iptables
# nftables
                            sudo nft list ruleset

                            # iptables
                            sudo iptables -L -n -v
                            sudo iptables -S
Matrice d'exposition
PortExposition recommandeeCommentaire
22 SSHIP admin uniquement.Eviter public global.
80 HTTPPublic si redirection HTTPS.Peut etre ferme si HTTPS only strict.
443 HTTPSPublic.Port principal web.
3306 MySQLPrive uniquement.Jamais internet direct.
5432 PostgreSQLPrive uniquement.Security group interne.
6379 RedisLocal ou prive uniquement.Jamais expose public.
8000 appLocal 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 / DNS
Regle : ne pas ouvrir 0.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.target
Commandes 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 -f
Options importantes
OptionBut
User / GroupEviter execution en root.
WorkingDirectoryContexte clair du service.
EnvironmentFileSeparer config du service.
Restart=on-failureRedemarrage automatique en cas de crash.
PrivateTmp=trueIsolation du repertoire temporaire.
NoNewPrivileges=trueLimiter 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 failed
Service hardening check
systemd-analyze security myapp.service
Bonne pratique : un service systemd doit pouvoir etre compris et relance par un autre DevOps sans connaitre toute l'application.
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-usage
Rotation journald
# Nettoyage ponctuel
                            sudo journalctl --vacuum-time=14d
                            sudo journalctl --vacuum-size=1G

                            # /etc/systemd/journald.conf
                            SystemMaxUse=1G
                            MaxRetentionSec=14day
Logs classiques
FichierUsage
/var/log/auth.logSSH, sudo, authentification.
/var/log/syslogEvenements systeme Debian/Ubuntu.
/var/log/nginx/access.logRequetes HTTP.
/var/log/nginx/error.logErreurs Nginx / proxy.
journalctl -u serviceLogs 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
                            who
Ce qu'il ne faut pas logger
Tokens APIRotation obligatoire si exposes.
Passwords / DB URLSecrets persistants dans logs.
Private keysCompromission critique.
Dumps complets de headersPeuvent contenir cookies ou auth.
Regle : si un secret apparait dans un log, il faut le considerer compromis et le renouveler.
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.sh
Secrets 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.env
Permissions recommandees
CheminOwnerMode
/opt/myapp/currentapp:app750 dossiers
Code applicatifapp:app640 fichiers
Scripts deploydeploy:deploy750
/etc/myapp/myapp.envroot:app640
~/.sshUser700
authorized_keysUser600
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/null
Regle : chmod 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-required
Verifier versions
uname -a
                            cat /etc/os-release
                            nginx -v
                            python3 --version
                            openssl version
                            systemctl --version
Process 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 changement
Politique recommandee
Type updateFrequenceControle
Security criticalRapide.Fenetre courte + validation.
Security standardHebdo / bihebdo.Patch window.
KernelPlanifie.Reboot requis.
Major versionProjet dedie.Staging, backup, rollback.
Attention : un serveur jamais patché devient dangereux, mais un patch production sans verification peut aussi provoquer un incident.
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
ProblemeMitigationPrudence
SSH attaque brute forceLimiter IP, Fail2ban, keys only.Ne pas se lock out.
Service crash loopLire journald, rollback release, restart cible.Ne pas masquer cause.
Disque pleinNettoyer logs, journald, /tmp, backups obsoletes.Ne jamais supprimer fichiers DB au hasard.
Port exposeFermer firewall ou limiter source.Verifier dependances.
Permission trop ouverteCorriger owner/groupe/mode.Tester service apres changement.
Update critiquePatch 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 changement
Bonne pratique : pour SSH, firewall et systemd, toujours garder une session ouverte pendant la validation du changement.
Anti-patterns Linux hardening
Anti-patternPourquoi c'est dangereuxCorrection professionnelle
SSH root directCompte cible evident pour attaques.PermitRootLogin no et sudo nominatif.
PasswordAuthentication activeRisque brute force.SSH keys only.
chmod 777Tout le monde peut modifier.Corriger owner/groupe.
Ports DB exposes publicRisque compromission directe.Reseau prive ou source limitee.
Service systemd en rootImpact maximal si app compromise.User applicatif dedie.
Logs non rotatesDisque plein.journald limits + logrotate.
Updates jamais appliqueesCVE accumulees.Patch process regulier.
Firewall ouvert pour debugExposition 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 oubliees
Resultat : compromission plus probable, incident plus difficile a diagnostiquer et blast radius plus large.
Bon modele
Serveur durci
                            ├── SSH keys only
                            ├── no root login
                            ├── firewall minimal
                            ├── users separes
                            ├── systemd non-root
                            ├── logs surveilles
                            ├── permissions strictes
                            └── patch process
Resultat : serveur plus stable, moins expose, plus facile a exploiter et auditer.
Checklist Linux hardening
Checklist securite serveur
ControleValidation attendue
Root SSH interditPermitRootLogin no.
Password SSH interditPasswordAuthentication no.
Users nominatifsPas de compte humain partage.
Sudo limitePas de sudo global inutile.
Firewall actifPorts publics limites.
Ports verifiesss -tulpn connu et documente.
Services non-rootApplications sous user dedie.
Secrets protegesFichiers env non world-readable.
Logs conservesjournald/logrotate configures.
Updates suiviesPatch process et reboot planifies.
Checklist avant changement sensible
Session SSH de secours ouverteEvite lock-out.
Commande reluePas d'action destructive improvisee.
Rollback connuAncienne config sauvegardee.
Test syntaxesshd -t, nginx -t, etc.
Reload plutot que restartQuand possible.
Post-checkService, port, logs, health.
Checklist diagnostic production
QuestionCommande 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.
Definition d'un serveur Linux correctement durci : acces nominatifs, SSH strict, firewall minimal, services non-root, logs exploitables, permissions propres et patch management maitrise.
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-required
5.5 Former les nouveaux DevOps : progression, exercices, erreurs volontaires, revues et rituels d'équipe
Former 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.

Objectif professionnel : rendre les nouveaux DevOps autonomes progressivement : d'abord lire et comprendre, puis proposer, puis executer en staging, puis intervenir en production avec garde-fous et supervision senior.
Les piliers de la formation DevOps
PilierObjectifExemple concret
ComprendreLire architecture, pipelines et runbooks.Expliquer un pipeline Terraform de bout en bout.
PratiquerExecuter en sandbox sans risque production.Faire un plan Terraform sans apply.
DiagnostiquerObserver avant d'agir.Lire logs Nginx, systemd, GitLab runner.
RevoirApprendre via feedback structure.MR commentee avec risques et rollback.
SimulerCreer des incidents controles.Pipeline casse, secret manquant, lock Terraform.
DocumenterTransformer 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 trace
Ce qu'un junior doit apprendre tot
ReflexePourquoi
Afficher l'environnement cibleEviter confusion dev/staging/prod.
Lire avant d'ecrireReduire les actions dangereuses.
Preparer rollbackNe pas improviser sous pression.
Ne jamais exposer les secretsLes logs et artifacts persistent.
Documenter le pourquoiLa commande seule ne suffit pas.
Regle : un nouveau DevOps ne doit pas apprendre directement en production sans environnement d'exercice, supervision et rollback clair.
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
NiveauCe que le junior faitGarde-fou
0. ObservationLit les pipelines, runbooks, logs et MR.Aucune action de modification.
1. Lecture activeExplique un incident ou un pipeline.Validation senior.
2. SandboxExecute commandes sans impact production.Environnement isole.
3. StagingPropose une MR simple, lance plan/deploy staging.MR review obligatoire.
4. Production accompagneeSuit un runbook production avec senior.Supervision directe.
5. Autonomie controleeGere changements standards et incidents simples.Post-review et escalation claire.
Competences par palier
PalierCompetence attendue
Semaine 1Comprendre architecture, repos, environnements, outils.
Semaine 2Lire logs, pipelines, Terraform plan, dashboards.
Mois 1Faire MR infra simple et deploy staging.
Mois 2Diagnostiquer pipeline ou incident staging.
Mois 3Participer 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 supervise
Critere pour passer au niveau suivant
CriterePreuve attendue
Comprend le risquePeut expliquer impact et rollback.
Utilise bons outilsPipeline, logs, dashboards, runbooks.
Ne cache pas l'incertitudeEscalade quand il ne sait pas.
DocumenteMR claire, note de changement, RCA courte.
Respecte securitePas de secrets exposes, pas de droits inutiles.
Bonne pratique : formaliser les paliers d'autonomie evite deux extremes : junior bloque sans confiance, ou junior expose trop vite a la production.
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
ExerciceObjectifNiveau
Lire un Terraform planIdentifier create/update/delete et risque.Debutant
Debug pipeline GitLabTrouver variable manquante ou artifact absent.Debutant/intermediaire
Service systemd KOLire status, journald, env file, permissions.Intermediaire
Nginx 502Tester upstream, logs, ports, service app.Intermediaire
State lock TerraformComprendre lock, apply concurrent, force-unlock.Intermediaire
Rollback stagingRevenir a version precedente proprement.Intermediaire
Mini incident DBConnexions, locks, slow query en lecture seule.Avance
Post-mortem courtTransformer 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 endpoint
Regle : un exercice doit avoir un objectif clair, des limites, une correction attendue et une discussion sur le risque.
Erreurs 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 volontaireSymptomeCompetence apprise
Variable GitLab manquanteJob auth failed ou variable empty.Variables masked/protected/scoped.
Mauvais TF_ROOTcd: no such file.Debug chemins CI.
Artifact Terraform absentApply ne trouve pas tfplan.dependencies / needs / paths.
Nginx upstream faux502 Bad Gateway.Tester upstream et logs Nginx.
Permission env file incorrecteService systemd ne demarre pas.Permissions et users services.
Port firewall fermeTimeout externe.ss, nc, UFW, security groups.
Secret expose en log sandboxToken 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 fix
Cycle 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 vigilance
Regles de securite
ReglePourquoi
Jamais en productionUne erreur pedagogique ne doit pas impacter les utilisateurs.
Donnees fictivesEviter fuite ou destruction de donnees sensibles.
Rollback simpleRemettre l'environnement propre rapidement.
Objectif annonceEviter piege humiliant ou flou.
Debrief obligatoireTransformer l'erreur en connaissance.
Attention : une erreur volontaire n'est pas un piege. C'est un simulateur. Le but est de construire des reflexes, pas de mettre le junior en echec.
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
PointQuestion de revue
ContextePourquoi ce changement est-il necessaire ?
EnvironnementDev, staging ou production ?
Terraform planY a-t-il un destroy ou remplacement inattendu ?
SecretsUn secret est-il ajoute dans Git ou logs ?
IAMLe droit ajoute est-il minimal ?
CI/CDLe pipeline est-il reproductible et protege ?
RollbackComment revenir en arriere ?
Post-checkComment 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 path
Feedback senior utile
Feedback faibleFeedback 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.”
Bonne pratique : une revue junior doit corriger le changement, mais aussi expliquer le raisonnement qui permet d'eviter l'erreur la prochaine fois.
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
RituelFrequenceBut
Revue de plan TerraformHebdomadaireApprendre a lire les risques infra.
Debug pipeline liveHebdomadaire ou bihebdoFormer aux logs GitLab et runners.
Incident reviewApres incidentComprendre cause et prevention.
Runbook readingMensuelleVerifier que la doc est utilisable.
Game day stagingMensuelle/trimestrielleSimuler panne sans risque utilisateur.
Office hour DevOpsHebdomadaireQuestions 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 points
Cycle 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 associee
Bonnes pratiques de rituel
Court30 a 45 minutes maximum pour garder l'attention.
ConcretUn vrai plan, un vrai log, une vraie MR.
Sans blameOn analyse le systeme, pas la personne.
ActionnableChaque rituel produit une amelioration.
DocumenteLes apprentissages vont dans le guide ou runbook.
Regle : un rituel sans action de suivi devient une reunion passive. Chaque session doit ameliorer un runbook, une alerte, un template ou une checklist.
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
ReflexeQuestion a se poser
ImpactQui sera touche si cela casse ?
FenetreEst-ce le bon moment pour ce changement ?
RollbackComment revenir en arriere rapidement ?
ObservationQuels dashboards/logs regarder pendant et apres ?
CommunicationQui doit etre informe ?
DonneesPeut-on perdre, corrompre ou exposer des donnees ?
SecuriteCe 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 accountable
Decision 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-checks
Ce qu'il faut enseigner explicitement
SujetPourquoi
Ne pas paniquerObserver avant d'agir.
Dire “je ne sais pas”L'incertitude cachee est dangereuse.
Escalader totMieux vaut appeler trop tot que trop tard.
Ne pas masquer une erreurLa transparence reduit l'impact.
Tracer les actionsIndispensable en RCA.
Bonne pratique : la culture production n'est pas la peur de toucher. C'est la capacite a toucher proprement, avec controle, observation et rollback.
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
CompetenceDebutantAutonome
ContexteSuit les instructions.Identifie environnement, impact et risque.
TerraformLance fmt/validate/plan.Interprete plan et detecte destroy inattendu.
GitLab CILit un job echoue.Diagnostique runner, variables, artifacts.
LinuxLit systemctl et journalctl.Trouve cause permission/env/port/service.
SecuriteSait qu'il ne faut pas exposer secrets.Detecte fuite potentielle et propose rotation.
ProductionDemande 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
NiveauDescription
1. SuitExecute une procedure connue avec supervision.
2. ExpliquePeut expliquer ce que fait la procedure.
3. DiagnostiqueFormule hypotheses et les verifie.
4. CorrigePropose une correction minimale et reversible.
5. TransmetAmeliore 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.
Attention : evaluer uniquement la vitesse est une erreur. En DevOps, la methode et la prudence comptent autant que la rapidite.
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
ObjectifLivrable
Comprendre l'architectureSchema simple du flux applicatif.
Lire les pipelinesExplication d'un pipeline GitLab existant.
Lire TerraformResume d'un module et d'un plan.
Connaitre les runbooksLecture guidee de 3 runbooks.
Premiers exercicesSandbox : plan, logs, systemd, curl health.
Plan 60 jours
MR infra simpleModification non critique avec plan et rollback.
Debug pipelineCorrection d'un job staging casse.
Incident simuleMini RCA apres game day.
DocumentationAmelioration d'un runbook existant.
Plan 90 jours
ObjectifLivrable
Staging autonomeDeploiement staging complet avec post-check.
Production accompagneeParticipation a un changement prod standard.
Diagnostic autonomePipeline ou service systemd resolu.
Runbook owner juniorResponsable d'un runbook simple.
Presentation equipeRetour 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 continu
Bonne pratique : associer chaque periode a un livrable visible : schema, MR, RCA, runbook, exercice corrige ou presentation.
Anti-patterns de formation DevOps
Anti-patternPourquoi c'est dangereuxCorrection professionnelle
Donner seulement des commandesLe junior execute sans comprendre le risque.Expliquer contexte, impact et rollback.
Former directement en productionErreur d'apprentissage = incident utilisateur.Sandbox, staging, supervision.
Pas de progressionAutonomie floue et anxiete.Paliers 30/60/90 et niveaux d'autonomie.
Feedback brutal ou vagueBloque l'apprentissage.Feedback factuel, precis et actionnable.
Runbooks jamais testesLa doc echoue pendant l'incident.Game days et lecture runbook.
Culture du blameLes erreurs sont cachees.Post-mortem sans blame.
Pas d'exercices d'incidentPremiere vraie crise = premiere pratique.Incidents simules en staging.
Senior garde tout en teteDependance 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 passive
Resultat : junior dependant, risque production plus eleve, erreurs repetees et savoir bloque chez les seniors.
Bon modele
Formation professionnelle
                            ├── progression par paliers
                            ├── exercices controles
                            ├── erreurs volontaires
                            ├── revues MR
                            ├── game days
                            ├── documentation active
                            └── culture sans blame
Resultat : autonomie progressive, meilleure qualite, meilleure securite et equipe plus robuste.
Checklist Former les nouveaux DevOps
Checklist onboarding
ControleValidation attendue
Mentor assigneUn senior referent est disponible.
Acces limitesDroits progressifs, pas admin global.
Environnements expliquesDev, staging, prod et risques connus.
Runbooks lusIncident, rollback, pipeline, Linux, DB.
Sandbox disponibleExercices sans impact utilisateur.
Premiere MR simpleAvec review, plan et rollback.
Game day planifieIncident simule en staging.
Feedback recurrentHebdo au debut, puis regulier.
Checklist exercice
Objectif clairCompetence visee explicite.
Environnement controleSandbox ou staging.
Risque limitePas de donnees sensibles ni prod.
Correction attendueSolution et criteres de reussite.
DebriefCe qui a ete appris et doc a modifier.
Checklist autonomie production
QuestionReponse 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.
Definition d'une bonne formation DevOps : le junior ne repete pas des commandes ; il comprend le contexte, mesure le risque, agit progressivement, verifie le resultat et enrichit la connaissance collective.
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 lesson
5.6 Glossaire avance : les termes que les nouveaux DevOps rencontrent tous les jours
Glossaire 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.

Objectif pedagogique : permettre a un nouveau DevOps de comprendre les discussions, poser de meilleures questions, eviter les malentendus et relier les mots techniques a l'impact production.
Les familles de vocabulaire
FamilleExemplesPourquoi c'est important
ProductionSLA, SLO, SLI, RTO, RPO, rollback.Relie technique, risque et utilisateur.
CI/CDPipeline, runner, artifact, stage, job, approval.Comprendre comment le changement arrive en prod.
TerraformState, plan, apply, drift, module, provider.Eviter les erreurs d'infrastructure.
CloudVPC, subnet, security group, IAM, load balancer.Comprendre le chemin reseau et les droits.
SecuriteLeast privilege, OIDC, RBAC, secrets, break-glass.Reduire le blast radius et proteger les acces.
ObservabiliteLogs, 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
                            └── dashboards
Mots a maitriser en premier
TermeDefinition courte
RollbackRetour a un etat stable precedent.
Blast radiusPerimetre maximal impacte par une erreur.
StateMemoire Terraform de l'infrastructure geree.
ArtifactFichier produit par un pipeline : plan, build, rapport.
HealthcheckTest rapide indiquant si un service est utilisable.
RCAAnalyse de cause racine apres incident.
Regle : si deux personnes utilisent le meme mot avec deux sens differents, le risque operationnel augmente. Il faut clarifier avant d'agir.
Production : SLA, SLO, SLI, RTO, RPO, rollback
Termes production essentiels
TermeDefinition simpleExemple
SLAEngagement contractuel de service.Disponibilite 99.9% par mois.
SLOObjectif interne mesurable.95% des requetes repondent sous 300 ms.
SLIIndicateur qui mesure le service.Latence p95, taux de 5xx, uptime.
RTOTemps maximal acceptable pour restaurer le service.Remettre l'API en ligne en 30 minutes.
RPOPerte de donnees maximale acceptable.Perdre au maximum 5 minutes de donnees.
RollbackRetour a une version ou config precedente.Revenir a l'image Docker N-1.
MitigationAction 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 respectee
Termes lies au changement
TermeUsage operationnel
Change windowFenetre autorisee pour modifier production.
FreezePeriode ou les changements sont limites.
Go / No-goDecision de continuer ou bloquer un changement.
Post-checkVerification apres action : health, logs, metrics.
Backout planPlan de retour arriere si le changement echoue.
Degradation modeMode 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 loss
Bonne pratique : dans une MR production, utiliser ces termes explicitement : impact, rollback, SLI, post-check, owner, go/no-go.
CI/CD : pipeline, job, runner, artifact, environment, approval
Glossaire GitLab CI/CD
TermeDefinitionExemple
PipelineEnsemble de jobs executes pour tester, construire, deployer.test -> build -> plan -> deploy.
StageEtape logique du pipeline.validate, plan, apply.
JobUnite d'execution dans un stage.terraform_plan_prod.
RunnerMachine ou container qui execute les jobs.Runner protege production.
ArtifactFichier produit et conserve par un job.tfplan, plan.txt, rapport scan.
CacheFichiers reutilises pour accelerer les jobs.Cache dependencies npm/pip.
EnvironmentCible logique de deploiement.staging, production.
ApprovalValidation 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 notes
Termes souvent confondus
TermeA ne pas confondre avecDifference
ArtifactCacheArtifact sert a transmettre ou auditer ; cache accelere.
RunnerPipelineRunner execute ; pipeline orchestre les jobs.
Variable maskedVariable protectedMasked cache l'affichage ; protected limite le contexte.
Manual jobApproval completManual seul ne suffit pas si droits trop larges.
IncludeExtendsInclude 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.
Attention : un pipeline vert ne signifie pas toujours que le changement est sur. Il faut lire le plan, les artifacts et le contexte d'execution.
Terraform : state, plan, apply, drift, provider, module
Glossaire Terraform
TermeDefinitionRisque associe
ProviderPlugin qui parle a une API.Mauvaise version = comportement different.
ResourceObjet gere par Terraform.Destroy inattendu si mal configure.
ModuleBloc reutilisable de ressources.Changement module impacte plusieurs envs.
StateMemoire des objets connus par Terraform.State perdu ou corrompu = risque majeur.
BackendLieu ou le state est stocke.Backend local en equipe = dangereux.
LockVerrou empechant deux apply concurrents.Force-unlock abusif = corruption possible.
PlanSimulation du changement.Non lu = destroy cache possible.
ApplyExecution du changement.Impact reel sur cloud/production.
DriftEcart 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 jour
Commandes 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 ID
Phrase 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.
Regle : un terraform apply sans lecture du plan est une prise de risque, surtout en production.
Cloud / Infrastructure : VPC, subnet, security group, LB, DNS
Glossaire cloud
TermeDefinition simpleExemple incident
VPC / VNetReseau prive cloud.Peering absent entre deux VPC.
SubnetSous-reseau dans une zone.Instance en subnet prive sans NAT.
Route tableRegles de routage reseau.Pas de route vers internet gateway.
Security groupFirewall attache aux ressources.Port 443 ferme par erreur.
NACLFirewall stateless au niveau subnet.Ports ephemeres bloques.
Load balancerDistribue le trafic vers backends.Targets unhealthy.
DNS recordAssocie un nom a une cible.CNAME pointe vers ancien LB.
Managed serviceService 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 / Queue
Confusions frequentes
ConfusionClarification
Security group vs firewall OSSG est cloud ; UFW/nftables est dans la VM.
Public subnet vs public IPUn subnet public a une route ; l'instance peut ou non avoir une IP publique.
DNS OK vs service OKDNS peut resoudre vers une cible qui ne repond pas.
LB healthy vs app totalement saineHealthcheck peut etre trop superficiel.
Route aller vs route retourLe 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.com
Bonne pratique : en incident reseau, decrire le chemin complet : source, destination, port, protocole, firewall, route, service.
Securite : IAM, RBAC, OIDC, secrets, least privilege
Glossaire securite DevOps
TermeDefinitionExemple
IAMGestion des identites et permissions.Role Terraform apply production.
RBACDroits bases sur les roles.Role Kubernetes lecture namespace.
OIDCFederation d'identite via token court.GitLab assume un role cloud sans secret long terme.
Least privilegeDonner uniquement les droits necessaires.Plan role different de apply role.
SecretInformation sensible.Password DB, token API, private key.
Break-glassAcces d'urgence exceptionnel.Role admin temporaire en incident critique.
Supply chainChaine qui produit et livre le logiciel.Images Docker, dependencies, runners.
Blast radiusPerimetre 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
TermeVa souvent avec
SecretMasked, protected, rotation, vault.
IAMRole, policy, trust policy, assume-role.
OIDCTemporary credentials, audience, subject.
RBACNamespace, service account, permissions.
Break-glassMFA, ticket, audit, expiration.
Regle : quand un secret est expose, on ne se contente pas de supprimer le log. On considere le secret compromis et on le renouvelle.
Observabilite : logs, metrics, traces, alerts, dashboards
Glossaire observabilite
TermeDefinitionExemple
LogEvenement textuel produit par un systeme.Erreur Nginx 502, exception Django.
MetricValeur numerique mesuree dans le temps.CPU, RAM, 5xx rate, latency p95.
TraceSuivi d'une requete entre services.API -> DB -> Redis -> external API.
AlertNotification quand une condition est anormale.Disk > 90% for 10 minutes.
DashboardVue graphique des signaux importants.Production API overview.
BaselineComportement normal attendu.Latence p95 normale autour de 180 ms.
CardinalityNombre de combinaisons de labels.Trop de labels user_id explose les metrics.
NoiseAlerte 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 is
Questions 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.
Bonne pratique : enseigner les golden signals tot. Ils donnent un cadre simple pour analyser presque tous les incidents.
Incidents : triage, mitigation, RCA, post-mortem
Glossaire incident
TermeDefinitionQuestion associee
TriageEvaluation rapide de l'impact et de la priorite.Qui est touche ? Depuis quand ?
SeverityNiveau de gravite de l'incident.Incident mineur ou critique ?
Incident commanderPersonne qui coordonne la reponse.Qui decide go/no-go ?
MitigationAction pour reduire l'impact rapidement.Peut-on desactiver, scaler, rollback ?
RCARoot Cause Analysis.Pourquoi l'incident est arrive ?
Post-mortemAnalyse documentee apres incident.Que change-t-on pour eviter la recidive ?
Action itemAction preventive issue du post-mortem.Qui fait quoi et pour quand ?
BlamelessCulture 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
                            └── prevention
Phrases 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.
Regle : pendant un incident, il faut separer clairement : ce que l'on sait, ce que l'on suppose, ce que l'on fait.
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.
Bonne pratique : entrainer les juniors a formuler des phrases completes : contexte, risque, preuve, action, validation.
Confusions et anti-patterns de vocabulaire
ConfusionPourquoi c'est dangereuxCorrection
Confondre rollback et fix forwardRollback revient en arriere ; fix forward corrige en avant.Nommer clairement la strategie choisie.
Dire “le serveur est down” sans preuveLe probleme peut etre DNS, TLS, LB, app, DB.Dire quel check echoue.
Confondre artifact et cacheOn peut perdre le fichier necessaire a l'apply.Artifact = output a conserver ; cache = acceleration.
Confondre state et code TerraformModifier le code ne change pas le state directement.Expliquer code, plan, apply, state.
Confondre masked et protectedUn secret peut etre cache mais accessible dans mauvais contexte.Utiliser masked + protected + scoped.
Dire “SLA” pour toutSLA, SLO, SLI ont des sens differents.Utiliser le bon niveau : mesure, objectif, contrat.
Confondre healthcheck et test metierUn endpoint peut etre OK alors que le parcours client est KO.Ajouter smoke tests metier.
Confondre incident et post-mortemL'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"
Resultat : diagnostic lent, decisions confuses, risque production et communication fragile.
Bon modele
Vocabulaire precis
                            ├── symptome mesure
                            ├── environnement identifie
                            ├── impact utilisateur
                            ├── hypothese separee du fait
                            ├── mitigation nommee
                            └── validation explicite
Resultat : meilleure communication, meilleurs diagnostics, revues plus efficaces et incidents mieux geres.
Checklist Glossaire avance
Checklist vocabulaire pour junior
QuestionReponse 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 clairQui est touche et comment.
Environnement clairDev, staging, production.
Symptome mesurable5xx, latence, timeout, backlog.
Hypothese separeeCe que l'on pense, pas encore prouve.
Mitigation nommeeRollback, scale, disable feature, rate limit.
Validation expliciteHealth, logs, metrics, smoke test.
Mini-glossaire prioritaire
TermeDefinition en 1 ligne
Blast radiusPerimetre touche si le changement echoue.
RollbackRetour a la version ou configuration precedente.
DriftDifference entre configuration attendue et realite.
ArtifactFichier produit par un job CI.
RunnerMachine qui execute les jobs CI.
OIDCFederation d'identite pour credentials temporaires.
RCAAnalyse de cause racine.
Post-checkVerification apres changement.
Definition d'un bon glossaire DevOps : il ne donne pas seulement des definitions ; il aide a mieux diagnostiquer, mieux revoir les changements, mieux communiquer en incident et mieux former les nouveaux membres de l'equipe.
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"
6.1 Annexes pratiques : plans de formation, matrices de risques, Go/No-Go et modeles operationnels
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.

Objectif professionnel : donner a l'equipe des supports prets a copier-coller pour cadrer les changements, reduire les risques, former les juniors, documenter les incidents et standardiser les pratiques DevOps.
Contenu de l'annexe
AnnexeUsageMoment d'utilisation
Matrice de risquesEvaluer impact, probabilite, blast radius et rollback.Avant une MR ou un apply production.
Go / No-GoDecider si un changement peut partir.Avant une fenetre de production.
Plan de formationFormer les nouveaux DevOps par ateliers.Onboarding et montee en competence.
Maturite DevOpsMesurer le niveau d'industrialisation.Audit interne ou roadmap plateforme.
Change modelDocumenter une modification infra/app.Dans une MR, un ticket ou une release note.
Incident modelStructurer 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 equipe
Regles d'utilisation
ReglePourquoi
Modeles courtsIls seront utilises en conditions reelles.
Champs obligatoiresEvite les oublis critiques.
Rollback toujours visibleReduit la panique pendant un incident.
Owner expliciteEvite les responsabilites floues.
Trace conserveeAudit, formation et post-mortem.
Regle : un modele operationnel doit aider a agir mieux, pas ralentir l'equipe. S'il n'est jamais utilise, il doit etre simplifie.
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
NiveauImpactExempleDecision
1 - FaibleAucun impact utilisateur.Tag, commentaire, variable dev.Review standard.
2 - ModereImpact limite ou staging.Ajout ressource non critique.Review + plan.
3 - SignificatifProduction touchee mais rollback simple.Changement Nginx ou autoscaling.Go/No-Go recommande.
4 - EleveProduction critique, risque client.DB, IAM prod, security group public.Approval senior obligatoire.
5 - CritiqueRisque 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 required
Matrice de controles
ZoneControle attenduOwner
TerraformPlan relu, aucun destroy inattendu, backend confirme.DevOps + reviewer.
CI/CDPipeline vert, artifact present, runner protege si prod.DevOps.
IAMDroits minimaux, pas de wildcard critique non justifiee.Security / Platform.
NetworkPorts, sources, DNS, TLS et LB verifies.Platform / SRE.
DatabaseBackup recent, migration testee, rollback documente.DBA / App owner.
SecretsAucun secret en Git, logs, artifacts ou plan public.DevOps + Security.
ObservabiliteDashboards et alertes ouverts avant action.SRE.
RollbackProcedure testee ou au minimum clairement executable.Owner changement.
Regle : un changement sans rollback clair doit etre considere plus risque, meme si le plan technique semble simple.
Matrice de risque detaillee
CritereFaibleMoyenFort
EnvironnementDev ou sandbox.Staging partage.Production.
DonneesAucune donnee persistante.Donnees non critiques.Donnees client, paiement, commande, auth.
RollbackRevert simple.Revert + redeploy.Restore DB, migration inverse ou action manuelle.
Blast radiusUn service interne.Un domaine applicatif.Plateforme, reseau, IAM ou production globale.
SecuriteAucun 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:
Regle : si le rollback, le monitoring ou l'owner est flou, la decision doit tendre vers No-Go.
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 → GO
Exemples de No-Go legitimes
RaisonPourquoi
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.
Bonne pratique : un No-Go n'est pas un echec. C'est une decision de protection de la production.
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
AtelierObjectifLivrable
1. ArchitectureLire le schema global et le chemin requete.Schema resume par l'apprenant.
2. GitLab CIComprendre stages, jobs, variables, artifacts.Explication d'un pipeline reel.
3. Terraform planLire create/update/destroy et risques.Resume humain du plan.
4. Modules TerraformComprendre variables, outputs, versioning.Mini module documente.
5. State distantComprendre backend, lock, drift.Exercice state en sandbox.
6. Secrets CIMasked, protected, scoped, OIDC.Checklist secrets.
7. Linux opssystemctl, journalctl, ports, disque.Diagnostic service casse.
8. Network opsDNS, TLS, Nginx, firewall, LB.Runbook 502 / TLS.
9. ObservabiliteLogs, metrics, alerts, dashboards.Dashboard reading notes.
10. Incident simulationTriage, mitigation, communication.Timeline + mini RCA.
11. Production changeGo/No-Go, rollback, post-check.Change note complete.
12. Review seniorAutonomie 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 equipe
Critere de reussite
CompetencePreuve attendue
ContexteIdentifie environnement, service, impact.
RisqueExplique blast radius et rollback.
CI/CDDebug jobs, variables, artifacts.
TerraformLit plan et detecte destroy inattendu.
ProductionExecute avec supervision et post-checks.
Bonne pratique : chaque atelier doit produire un livrable visible : schema, MR, plan commente, runbook, RCA ou checklist.
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.

NiveauDescriptionSignaux visiblesProchain cap
0. ManuelClickOps, changements manuels, peu de traces.Console cloud, docs incompletes, changements non reproductibles.Mettre Git au centre.
1. ScriptedScripts et Terraform local, state local.Automatisation partielle mais fragile.Backend distant, separation environnements.
2. CI visiblefmt, validate, plan en pipeline.Apply encore manuel depuis laptop.Apply via GitLab avec approvals.
3. Production controleeMR, approvals, protected env, runbooks.Changements prod mieux traces.Observabilite et exercices incidents.
4. Platform engineeringModules versionnes, OIDC, policy-as-code, templates CI.Standards reutilisables multi-equipes.Self-service securise.
5. Excellence continueMesure 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 platform
Attention : la maturite ne signifie pas tout automatiser aveuglement. Elle signifie automatiser avec controles, audit et rollback.
Modele 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
ClairePas besoin d'appeler l'auteur pour comprendre.
CourteLisible pendant une fenetre de changement.
VerifiableContient commandes, dashboards ou criteres.
ReversibleRollback explicite avant execution.
TracableLiee a MR, ticket, pipeline, owner.
Bonne pratique : la note de changement doit etre ecrite avant l'execution, pas reconstruite apres coup.
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
CritereQuestion
LisibleUn junior peut-il le suivre ?
PrudentLes actions read-only viennent-elles d'abord ?
VerifiableY a-t-il des post-checks ?
EscalableQui appeler si cela ne suffit pas ?
MaintenuDate de derniere revue presente ?
Regle : un runbook qui commence par restart, delete, force-unlock ou apply doit etre relu. L'observation doit venir avant l'action.
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 items
Blameless 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.
Bonne pratique : pendant l'incident, noter les faits en temps reel. Apres l'incident, transformer ces notes en RCA claire.
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
ScoreSignificationDecision
AContexte clair, risque faible, rollback et post-checks OK.Approve.
BChangement correct mais details manquants.Approve apres corrections mineures.
CRisque mal explique ou rollback incomplet.Changes requested.
DDestroy, IAM large ou impact prod non maitrise.Block review.
ESecret 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.
Regle : une bonne revue ne dit pas seulement "non". Elle explique le risque et la correction attendue.
Anti-patterns operationnels dans les annexes
Anti-patternPourquoi c'est dangereuxCorrection professionnelle
Modeles trop longsPersonne ne les utilise en incident.Templates courts, champs essentiels.
Go/No-Go purement administratifIl ne protege pas vraiment la production.Verifier plan, rollback, monitoring, owner.
Matrice risque jamais appliqueeLes changements critiques passent comme des changements simples.Lier niveau risque a approvals et fenetre.
Runbooks non testesIls echouent pendant la crise.Game days et exercices reguliers.
RCA sans action ownerL'incident se reproduit.Action item, owner, due date, suivi.
Formation sans livrablesProgression invisible.MR, schema, runbook, RCA, presentation.
Approval sans lecture du planValidation de surface.Reviewer doit lire le plan et les diffs.
Rollback ecrit apres incidentTrop 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 theorique
Resultat : documentation decorative, changements mal cadres et apprentissage faible.
Bon modele
Annexes operationnelles
    ├── templates courts
    ├── decisions Go/No-Go
    ├── risques visibles
    ├── runbooks testes
    ├── RCA actionnables
    ├── formation par ateliers
    └── amelioration continue
Resultat : equipe plus autonome, changements plus surs, incidents mieux geres et nouveaux DevOps mieux formes.
Checklist finale des annexes pratiques
Checklist avant changement production
ControleValidation attendue
MR claireContexte, impact, owner, environnement.
Plan reluCreate/update/delete expliques.
Destroy controleAucun destroy inattendu.
Secrets protegesAucun secret dans Git, logs, artifacts.
IAM limiteLeast privilege respecte.
Monitoring ouvertDashboards et alertes prets.
Rollback pretProcedure claire et executable.
Go/No-Go faitDecision tracee avec approver.
Checklist apres changement
Healthcheck OKEndpoint, service, LB ou pod ready.
Logs propresPas d'erreurs nouvelles.
Metrics stablesLatence, 5xx, saturation, DB.
Owner informeResultat partage.
Documentation mise a jourRunbook, 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
Une bonne annexe DevOps est courte, reutilisable, concrete, orientee production, reliee aux risques reels et suffisamment claire pour etre utilisee par un nouveau DevOps sous supervision.
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