Surveiller l'utilisation mémoire des instances EC2 avec l'agent CloudWatch

Vous venez d'ouvrir la console CloudWatch pour diagnostiquer une lenteur sur votre instance EC2, et la métrique RAM est introuvable. Ce n'est pas un bug, ni un oubli — c'est une limite architecturale fondamentale : CloudWatch ne peut pas voir à l'intérieur du système d'exploitation de votre instance sans un agent installé. Comprendre pourquoi cette limite existe, et comment la contourner correctement, est indispensable pour toute opération de production sérieuse sur la surveillance mémoire EC2.

TL;DR — Surveillance mémoire EC2

AspectComportement
Métriques CloudWatch par défautCPU, réseau, disque EBS (I/O) — aucune métrique OS
Pourquoi pas de RAM par défautAWS n'a pas accès à l'intérieur du système d'exploitation invité
SolutionInstaller l'agent CloudWatch sur l'instance
Métriques OS disponibles via l'agentRAM utilisée, RAM disponible, utilisation disque, swap, processus
Prérequis IAMRôle IAM avec la politique CloudWatchAgentServerPolicy
Espace de noms CloudWatchCWAgent (personnalisable)

Pourquoi CloudWatch ne voit pas la RAM par défaut

AWS opère selon un modèle de responsabilité partagée. La couche hyperviseur expose à CloudWatch certaines métriques observables depuis l'extérieur de la machine virtuelle : utilisation CPU (via les cycles d'horloge alloués), trafic réseau, et opérations d'I/O sur les volumes EBS. Ces données sont collectées par l'infrastructure AWS sans nécessiter d'accès au système d'exploitation invité.

La mémoire RAM, en revanche, est gérée entièrement à l'intérieur du système d'exploitation. L'hyperviseur alloue de la mémoire physique à l'instance, mais il ne sait pas comment le noyau Linux ou Windows la subdivise entre processus, caches, buffers, et espace libre. Cette information n'est accessible qu'en lisant /proc/meminfo (Linux) ou les compteurs WMI (Windows) — deux sources qui nécessitent un processus s'exécutant à l'intérieur de l'instance.

C'est comme surveiller un entrepôt depuis l'extérieur : vous pouvez compter les camions qui entrent et sortent, mais vous ne savez pas comment les étagères sont organisées à l'intérieur sans envoyer quelqu'un vérifier.

L'agent CloudWatch est ce 'quelqu'un' — un processus léger qui s'exécute dans l'instance, lit les métriques OS, et les publie vers CloudWatch via l'API PutMetricData.

graph TD HV["Hyperviseur AWS
métriques visibles depuis l'extérieur"] CW["CloudWatch
AWS/EC2 namespace"] OS["Système d'exploitation invité
RAM, swap, disque"] AGT["Agent CloudWatch
s'exécute dans l'instance"] CWA["CloudWatch
CWAgent namespace"] HV -->|"CPU, réseau, EBS I/O"| CW OS -->|"lit /proc/meminfo"| AGT AGT -->|"PutMetricData"| CWA style HV fill:#2d6a9f,color:#fff style CW fill:#1a7f5a,color:#fff style OS fill:#7d3c98,color:#fff style AGT fill:#b7500a,color:#fff style CWA fill:#1a7f5a,color:#fff
  1. Hyperviseur AWS : collecte les métriques visibles depuis l'extérieur (CPU, réseau, EBS I/O) et les publie automatiquement dans CloudWatch.
  2. Système d'exploitation invité : gère la mémoire RAM, le swap, et l'espace disque — ces données restent invisibles depuis l'hyperviseur.
  3. Agent CloudWatch : s'exécute à l'intérieur de l'instance, lit les métriques OS, et les envoie à CloudWatch via PutMetricData.
  4. Espace de noms CWAgent : les métriques publiées par l'agent apparaissent dans un espace de noms séparé des métriques EC2 par défaut.

Installation de l'agent CloudWatch sur EC2 — Prérequis IAM

Avant d'installer quoi que ce soit, l'instance doit avoir les permissions nécessaires pour publier des métriques. Sans le bon rôle IAM, l'agent démarre silencieusement mais n'envoie rien — et vous passerez du temps à chercher un problème de configuration qui n'existe pas.

Attachez la politique gérée AWS CloudWatchAgentServerPolicy au rôle IAM de l'instance. Cette politique accorde les permissions minimales requises : cloudwatch:PutMetricData, ec2:DescribeTags, et les permissions de lecture SSM si vous utilisez le Parameter Store pour stocker la configuration de l'agent.

# Créer un rôle IAM pour l'instance EC2
aws iam create-role \
  --role-name EC2CloudWatchAgentRole \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "ec2.amazonaws.com"},
      "Action": "sts:AssumeRole"
    }]
  }'

# Attacher la politique gérée CloudWatchAgentServerPolicy
aws iam attach-role-policy \
  --role-name EC2CloudWatchAgentRole \
  --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

# Créer un profil d'instance et y associer le rôle
aws iam create-instance-profile \
  --instance-profile-name EC2CloudWatchAgentProfile

aws iam add-role-to-instance-profile \
  --instance-profile-name EC2CloudWatchAgentProfile \
  --role-name EC2CloudWatchAgentRole

# Associer le profil à l'instance EC2 existante
aws ec2 associate-iam-instance-profile \
  --instance-id i-0123456789abcdef0 \
  --iam-instance-profile Name=EC2CloudWatchAgentProfile

Installation et configuration de l'agent CloudWatch sur Linux

L'agent CloudWatch est distribué via SSM ou directement téléchargeable. Sur Amazon Linux 2 et Amazon Linux 2023, le paquet est disponible dans les dépôts officiels. Sur d'autres distributions, utilisez le paquet RPM ou DEB fourni par AWS.

# Sur Amazon Linux 2 / Amazon Linux 2023
sudo yum install -y amazon-cloudwatch-agent

# Sur Ubuntu / Debian
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb

L'agent utilise un fichier de configuration JSON pour définir quelles métriques collecter et à quelle fréquence. Vous pouvez générer ce fichier interactivement avec l'assistant de configuration, ou l'écrire directement. Voici une configuration minimale pour collecter les métriques mémoire et disque :

🔽 Cliquer pour afficher la configuration JSON de l'agent CloudWatch
{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "cwagent"
  },
  "metrics": {
    "append_dimensions": {
      "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
      "ImageId": "${aws:ImageId}",
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    },
    "metrics_collected": {
      "mem": {
        "measurement": [
          "mem_used_percent",
          "mem_available",
          "mem_used",
          "mem_total"
        ],
        "metrics_collection_interval": 60
      },
      "disk": {
        "measurement": [
          "used_percent",
          "used",
          "free"
        ],
        "metrics_collection_interval": 60,
        "resources": [
          "/"
        ]
      },
      "swap": {
        "measurement": [
          "swap_used_percent",
          "swap_used",
          "swap_free"
        ],
        "metrics_collection_interval": 60
      }
    }
  }
}

Enregistrez cette configuration dans /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json, puis démarrez l'agent :

# Démarrer l'agent avec le fichier de configuration local
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config \
  -m ec2 \
  -s \
  -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

# Vérifier le statut de l'agent
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -m ec2 \
  -a status

Un statut running confirme que l'agent collecte et publie les métriques. Les premières données apparaissent dans CloudWatch dans les deux minutes suivant le démarrage.

Vérifier que les métriques mémoire EC2 arrivent dans CloudWatch

Les métriques publiées par l'agent apparaissent dans l'espace de noms CWAgent, pas dans AWS/EC2. C'est la première chose que les gens ratent quand ils cherchent leurs métriques RAM dans la console — ils regardent au mauvais endroit.

# Lister les métriques disponibles dans l'espace de noms CWAgent
aws cloudwatch list-metrics \
  --namespace CWAgent \
  --region us-east-1

# Récupérer les statistiques de mémoire utilisée pour une instance spécifique
aws cloudwatch get-metric-statistics \
  --namespace CWAgent \
  --metric-name mem_used_percent \
  --dimensions Name=InstanceId,Value=i-0123456789abcdef0 \
  --start-time 2024-01-15T10:00:00Z \
  --end-time 2024-01-15T11:00:00Z \
  --period 300 \
  --statistics Average \
  --region us-east-1

Si la commande list-metrics ne retourne aucun résultat pour CWAgent, l'agent ne publie pas. Vérifiez les journaux de l'agent avant de chercher ailleurs.

# Consulter les journaux de l'agent pour diagnostiquer les erreurs
sudo tail -f /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
graph TD S1["1. Vérifier le statut de l'agent
amazon-cloudwatch-agent-ctl -a status"] S2{"Agent en cours
d'exécution ?"} S3["Consulter les journaux système
/var/log/messages"] S4["Consulter les journaux de l'agent
amazon-cloudwatch-agent.log"] S5{"Erreur AccessDenied
ou RequestError ?"} S6["Vérifier le rôle IAM
et le profil d'instance"] S7["Redémarrer l'agent
après correction IAM"] S8["Vérifier les métriques
dans l'espace de noms CWAgent"] S9["Créer alarmes
et tableaux de bord"] S1 --> S2 S2 -->|"Non"| S3 S2 -->|"Oui"| S4 S3 --> S4 S4 --> S5 S5 -->|"Oui"| S6 S5 -->|"Non"| S8 S6 --> S7 S7 --> S8 S8 --> S9 style S1 fill:#2d6a9f,color:#fff style S6 fill:#b7500a,color:#fff style S9 fill:#1a7f5a,color:#fff
  1. Vérifier le statut : la commande status confirme si l'agent tourne. Un état stopped indique un problème de démarrage — consultez les journaux système.
  2. Vérifier les journaux de l'agent : les erreurs d'authentification IAM (AccessDenied) apparaissent ici. C'est souvent la cause racine quand l'agent tourne mais ne publie rien.
  3. Vérifier le rôle IAM : confirmez que le profil d'instance est bien attaché à l'instance et que le rôle contient CloudWatchAgentServerPolicy.
  4. Vérifier l'espace de noms : cherchez dans CWAgent, pas dans AWS/EC2.

Erreur classique : l'agent tourne mais aucune métrique n'apparaît

Voici un scénario que vous rencontrerez probablement une fois. L'agent affiche le statut running, les journaux ne montrent aucune erreur évidente, mais list-metrics retourne une liste vide pour CWAgent.

Le réflexe initial est de vérifier la configuration JSON — mauvais nom de métrique, mauvaise syntaxe. Après vingt minutes à comparer la configuration avec la documentation, tout semble correct.

La vraie cause : le profil d'instance IAM a été attaché à l'instance après le démarrage de l'agent. L'agent récupère les credentials IAM au démarrage via le service de métadonnées de l'instance (IMDS). Si le rôle n'était pas encore attaché à ce moment-là, l'agent démarre sans credentials valides et échoue silencieusement sur chaque appel PutMetricData.

Le journal de l'agent contient la ligne révélatrice, mais elle est facile à manquer si vous ne cherchez pas spécifiquement une erreur RequestError ou AccessDenied. La correction est simple : redémarrer l'agent après avoir attaché le rôle IAM.

# Redémarrer l'agent après modification du rôle IAM
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -m ec2 \
  -a stop

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config \
  -m ec2 \
  -s \
  -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

Un détail que la documentation ne met pas en avant : si vous utilisez IMDSv2 (recommandé), l'agent CloudWatch le supporte nativement depuis les versions récentes. Sur les instances configurées pour exiger IMDSv2 exclusivement, une version ancienne de l'agent peut échouer à récupérer ses credentials. Vérifiez que vous utilisez une version récente de l'agent avant de chercher un problème de politique IAM.

Créer une alarme CloudWatch sur l'utilisation mémoire

Une fois les métriques disponibles, créer une alarme sur le pourcentage de RAM utilisée suit le même modèle que pour n'importe quelle métrique CloudWatch — à ceci près que vous devez spécifier l'espace de noms CWAgent et les dimensions correctes.

aws cloudwatch put-metric-alarm \
  --alarm-name "EC2-MemoryUsage-High" \
  --alarm-description "Alerte si utilisation memoire depasse 85%" \
  --namespace CWAgent \
  --metric-name mem_used_percent \
  --dimensions Name=InstanceId,Value=i-0123456789abcdef0 \
  --statistic Average \
  --period 300 \
  --evaluation-periods 2 \
  --threshold 85 \
  --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:AlertsTopic \
  --region us-east-1

Déploiement à grande échelle avec SSM et Systems Manager

Installer et configurer l'agent manuellement sur chaque instance n'est pas viable au-delà de quelques machines. AWS Systems Manager propose deux approches complémentaires : le document SSM AWS-ConfigureAWSPackage pour l'installation, et le Parameter Store pour centraliser la configuration de l'agent.

# Stocker la configuration de l'agent dans SSM Parameter Store
aws ssm put-parameter \
  --name "/cloudwatch-agent/config" \
  --type String \
  --value file://amazon-cloudwatch-agent.json \
  --region us-east-1

# Démarrer l'agent sur une instance en utilisant la configuration SSM
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config \
  -m ec2 \
  -s \
  -c ssm:/cloudwatch-agent/config

Pour un déploiement sur un parc d'instances, utilisez une commande SSM Run Command avec le document AmazonCloudWatch-ManageAgent — ce document gère l'installation, la configuration, et le démarrage de l'agent en une seule opération.

Conclusion — Surveillance mémoire EC2 en production

La surveillance mémoire EC2 nécessite l'agent CloudWatch parce que la frontière entre l'infrastructure AWS et le système d'exploitation invité est réelle et délibérée. CloudWatch ne traverse pas cette frontière sans un processus côté OS pour lui transmettre les données.

L'installation de l'agent est simple, mais les erreurs silencieuses liées au timing d'attachement du rôle IAM ou aux versions de l'agent face à IMDSv2 peuvent faire perdre du temps. Vérifiez toujours les journaux de l'agent en premier, et confirmez que les métriques apparaissent dans l'espace de noms CWAgent avant de construire des alarmes ou des tableaux de bord.

Pour les environnements avec de nombreuses instances, centralisez la configuration via SSM Parameter Store dès le départ — modifier la configuration sur chaque instance individuellement devient rapidement ingérable.

Glossaire

TermeDéfinition
Agent CloudWatchProcessus s'exécutant à l'intérieur de l'instance EC2, responsable de collecter les métriques OS et de les publier vers CloudWatch via PutMetricData.
Espace de noms CWAgentEspace de noms CloudWatch dans lequel l'agent publie les métriques collectées. Distinct de l'espace de noms AWS/EC2 utilisé pour les métriques par défaut.
Profil d'instance IAMConteneur IAM qui associe un rôle à une instance EC2, permettant aux processus s'exécutant sur l'instance d'obtenir des credentials AWS temporaires via IMDS.
IMDS (Instance Metadata Service)Service local accessible depuis l'instance à l'adresse 169.254.169.254, fournissant les métadonnées de l'instance et les credentials IAM temporaires.
mem_used_percentNom de métrique publié par l'agent CloudWatch représentant le pourcentage de mémoire RAM utilisée sur l'instance, calculé à partir de /proc/meminfo sur Linux.

Commentaires

Posts les plus consultés de ce blog

Groupes IAM AWS : Pourquoi Attacher les Politiques aux Groupes Plutôt qu'aux Utilisateurs

LSI vs GSI dans DynamoDB : choisir le bon index secondaire

NAT Gateway vs NAT Instance : Quelle solution choisir pour vos instances privées ?