Aller au contenu principal

Concepts d'Observabilité AWS

Les 3 Piliers de l'Observabilité​

┌─────────────────────────────────────────────────────────────┐
│ LES 3 PILIERS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ MÉTRIQUES LOGS TRACES │ │
│ │ ───────── ──── ────── │ │
│ │ │ │
│ │ Quoi ? Pourquoi ? Comment ? │ │
│ │ │ │
│ │ CPU: 80% ERROR: Request A │ │
│ │ Requests: 1000 Connection → Service 1 │ │
│ │ Errors: 5% failed to DB → Service 2 │ │
│ │ → Database │ │
│ │ │ │
│ │ CloudWatch CloudWatch X-Ray │ │
│ │ Metrics Logs │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Ensemble, ils répondent à : │
│ • Que se passe-t-il ? (Métriques) │
│ • Pourquoi ça se passe ? (Logs) │
│ • Où ça se passe ? (Traces) │
│ │
└─────────────────────────────────────────────────────────────┘

CloudWatch Metrics​

Métriques EC2 Natives​

┌─────────────────────────────────────────────────────────────┐
│ MÉTRIQUES EC2 NATIVES │
├─────────────────────────────────────────────────────────────┤
│ │
│ MÉTRIQUE DESCRIPTION UNITÉ │
│ ──────── ─────────── ───── │
│ │
│ CPUUtilization Usage CPU % │
│ NetworkIn Trafic entrant Bytes │
│ NetworkOut Trafic sortant Bytes │
│ DiskReadBytes Lecture disque Bytes │
│ DiskWriteBytes Écriture disque Bytes │
│ DiskReadOps Opérations lecture Count │
│ DiskWriteOps Opérations écriture Count │
│ StatusCheckFailed Échec health check Count │
│ │
│ ⚠️ ATTENTION : │
│ La mémoire (RAM) N'EST PAS incluse par défaut ! │
│ → Nécessite CloudWatch Agent │
│ │
└─────────────────────────────────────────────────────────────┘

CloudWatch Agent (Métriques Avancées)​

┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH AGENT │
├─────────────────────────────────────────────────────────────┤
│ │
│ L'agent CloudWatch collecte des métriques supplémentaires │
│ depuis l'intérieur de l'instance : │
│ │
│ MÉTRIQUES ADDITIONNELLES : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ • mem_used_percent : Utilisation RAM (%) │ │
│ │ • disk_used_percent : Utilisation disque (%) │ │
│ │ • processes_total : Nombre de processus │ │
│ │ • cpu_usage_user : CPU utilisateur │ │
│ │ • cpu_usage_system : CPU système │ │
│ │ • netstat_tcp_established : Connexions TCP │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ INSTALLATION : │
│ 1. Installer l'agent sur l'instance │
│ 2. Configurer les métriques à collecter │
│ 3. Attacher un rôle IAM avec les permissions │
│ │
│ # Installation sur Amazon Linux 2 │
│ sudo yum install amazon-cloudwatch-agent │
│ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon- │
│ cloudwatch-agent-config-wizard │
│ sudo systemctl start amazon-cloudwatch-agent │
│ │
└─────────────────────────────────────────────────────────────┘

CloudWatch Alarms​

Types d'Alarmes​

┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH ALARMS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ÉTATS D'UNE ALARME : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ OK → La métrique est dans les limites │ │
│ │ ALARM → La métrique a dépassé le seuil │ │
│ │ INSUFFICIENT_DATA → Pas assez de données │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ COMPOSANTS D'UNE ALARME : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. Métrique : CPUUtilization │ │
│ │ 2. Statistique : Average │ │
│ │ 3. Période : 300 secondes (5 min) │ │
│ │ 4. Évaluation : 2 périodes │ │
│ │ 5. Seuil : > 80% │ │
│ │ 6. Action : Notifier SNS │ │
│ │ │ │
│ │ Traduction : │ │
│ │ "Si CPU moyen > 80% pendant 2 périodes de 5 min, │ │
│ │ alors déclencher l'alarme et notifier SNS" │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Configuration CLI​

# Créer une alarme CPU haute
aws cloudwatch put-metric-alarm \
--alarm-name cpu-high-alarm \
--metric-name CPUUtilization \
--namespace AWS/EC2 \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=InstanceId,Value=i-xxx \
--alarm-actions arn:aws:sns:us-east-1:123456789:alerts \
--alarm-description "CPU above 80% for 10 minutes"

# Créer une alarme mémoire (nécessite CloudWatch Agent)
aws cloudwatch put-metric-alarm \
--alarm-name mem-high-alarm \
--metric-name mem_used_percent \
--namespace CWAgent \
--statistic Average \
--period 300 \
--threshold 90 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=InstanceId,Value=i-xxx \
--alarm-actions arn:aws:sns:us-east-1:123456789:alerts

CloudWatch Logs​

Structure des Logs​

┌─────────────────────────────────────────────────────────────┐
│ STRUCTURE CLOUDWATCH LOGS │
├─────────────────────────────────────────────────────────────┤
│ │
│ LOG GROUP (conteneur) │
│ └── /aws/ec2/my-app │
│ │ │
│ ├── LOG STREAM (flux par source) │
│ │ └── i-xxx/application.log │
│ │ │ │
│ │ ├── LOG EVENT (entrée individuelle) │
│ │ │ └── 2024-01-15 10:30:00 INFO User login │
│ │ │ │
│ │ └── LOG EVENT │
│ │ └── 2024-01-15 10:30:01 ERROR DB timeout │
│ │ │
│ └── LOG STREAM │
│ └── i-yyy/application.log │
│ │
│ RÉTENTION : │
│ • Configurable : 1 jour à 10 ans (ou jamais) │
│ • Par défaut : jamais (attention aux coûts !) │
│ │
└─────────────────────────────────────────────────────────────┘

Log Insights (Requêtes)​

┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH LOG INSIGHTS │
├─────────────────────────────────────────────────────────────┤
│ │
│ Langage de requête pour analyser les logs : │
│ │
│ # Rechercher les erreurs │
│ fields @timestamp, @message │
│ | filter @message like /ERROR/ │
│ | sort @timestamp desc │
│ | limit 100 │
│ │
│ # Compter les erreurs par heure │
│ fields @timestamp, @message │
│ | filter @message like /ERROR/ │
│ | stats count() by bin(1h) │
│ │
│ # Top 10 des IPs avec erreurs │
│ fields @timestamp, @message │
│ | filter @message like /ERROR/ │
│ | parse @message /IP: (?<ip>\d+\.\d+\.\d+\.\d+)/ │
│ | stats count() by ip │
│ | sort count desc │
│ | limit 10 │
│ │
│ # Latence P99 │
│ fields @timestamp, latency │
│ | stats percentile(latency, 99) as p99 │
│ │
└─────────────────────────────────────────────────────────────┘

CloudWatch Dashboards​

┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH DASHBOARD │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ PRODUCTION DASHBOARD 🔄 │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ CPU Usage │ │ Memory Usage │ │ │
│ │ │ ████████░░ 80% │ │ ██████░░░░ 60% │ │ │
│ │ │ [graph] │ │ [graph] │ │ │
│ │ └─────────────────┘ └─────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ Request Count │ │ Error Rate │ │ │
│ │ │ 1,234 req/min │ │ 0.5% │ │ │
│ │ │ [graph] │ │ [graph] │ │ │
│ │ └─────────────────┘ └─────────────────┘ │ │
│ │ │ │
│ │ ┌───────────────────────────────────────┐ │ │
│ │ │ Latency P50/P95/P99 │ │ │
│ │ │ [line chart over time] │ │ │
│ │ └───────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ TYPES DE WIDGETS : │
│ • Line : Tendances dans le temps │
│ • Stacked : Comparaison composants │
│ • Number : Valeur unique (KPI) │
│ • Text : Documentation, liens │
│ • Alarm Status : État des alarmes │
│ • Logs : Derniers événements │
│ │
└─────────────────────────────────────────────────────────────┘

Runbook d'Incident​

┌─────────────────────────────────────────────────────────────┐
│ RUNBOOK TYPE │
├─────────────────────────────────────────────────────────────┤
│ │
│ INCIDENT : CPU Haute (> 90%) │
│ ───────────────────────── │
│ │
│ 1. ÉVALUER LA GRAVITÉ │
│ □ Une instance ou plusieurs ? │
│ □ Impact utilisateur visible ? │
│ □ Erreurs dans les logs ? │
│ │
│ 2. DIAGNOSTIC RAPIDE │
│ □ top -c sur l'instance │
│ □ Identifier le processus consommateur │
│ □ Vérifier les logs applicatifs │
│ │
│ 3. ACTIONS IMMÉDIATES │
│ □ Si charge légitime → Scale out (ajouter instances) │
│ □ Si processus fou → Redémarrer le service │
│ □ Si attaque → Bloquer l'IP source │
│ │
│ 4. RÉSOLUTION │
│ □ CPU revenu < 70% ? │
│ □ Service fonctionnel ? │
│ □ Utilisateurs impactés informés ? │
│ │
│ 5. POST-MORTEM │
│ □ Documenter la cause │
│ □ Actions préventives │
│ □ Améliorer les alertes │
│ │
└─────────────────────────────────────────────────────────────┘

Résumé​

ServiceUsageDonnées
MetricsSurveillance temps réelCPU, RAM, Network
AlarmsAlertes automatiquesSeuils dépassés
LogsDebugging, auditTexte applicatif
DashboardsVisualisationGraphiques, KPIs
Log InsightsAnalyseRequêtes sur logs

Prochaine section : Lab Monitoring