Claude Code × AWS CloudWatch : logs, métriques, alarmes, dashboards et incidents
Implémentez CloudWatch avec Claude Code : logs JSON, métriques, alarmes, dashboards et revue d’incident.
Lors d’un incident de production, le pire n’est pas toujours l’absence de logs. Le cas le plus courant est plutôt l’inverse : trop de logs, des champs incohérents, des alarmes bruyantes et aucune méthode claire pour passer du symptôme à la décision. AWS CloudWatch fournit Logs, Metrics, Alarms, Dashboards et Logs Insights, mais ces briques ne deviennent utiles que si l’application émet des données structurées et si l’équipe dispose de requêtes et de runbooks répétables.
Ce guide montre comment utiliser Claude Code pour transformer CloudWatch en workflow concret d’observabilité pour Lambda, ECS, API Gateway, ALB et les métriques métier. L’objectif n’est pas de laisser un agent modifier la production sans contrôle. L’objectif est de générer et relire plus vite les parties répétitives : logs JSON, requêtes Logs Insights, filtres de métriques, alarmes CloudFormation/SAM, widgets de dashboard, permissions IAM en lecture seule et prompt de revue d’incident.
Quelques termes simples : un log structuré est un log avec des champs stables, souvent en JSON. Une métrique est une série numérique comme le nombre de requêtes, les 5xx ou la latence p95. Une alarme est une règle sur une métrique. Un runbook est une procédure à suivre pendant un incident. Le moindre privilège consiste à donner à Claude Code uniquement les permissions nécessaires, d’abord en lecture.
Architecture
flowchart LR
App["Lambda / ECS / API Gateway"] --> Logs["CloudWatch Logs"]
App --> Metrics["CloudWatch Metrics"]
Logs --> Insights["Requêtes Logs Insights"]
Logs --> Filter["Metric filters"]
Metrics --> Alarms["CloudWatch Alarms"]
Metrics --> Dash["Dashboards"]
Insights --> Claude["Revue avec Claude Code"]
Alarms --> Runbook["SNS / PagerDuty / runbook"]
Claude Code donne de meilleurs résultats quand le contexte est précis : format des logs, fenêtre temporelle, services visés, intention de l’alarme et commandes autorisées.
Cas d’usage réels
Premier cas : un batch Lambda échoue. Les lignes REPORT ne suffisent pas à comprendre la cause métier. Ajoutez jobId, nom du fournisseur externe, nombre de tentatives et nom d’exception dans les logs JSON. Claude Code peut ensuite résumer si les échecs des deux dernières heures sont liés à un fournisseur, une version déployée ou une classe d’entrées.
Deuxième cas : les 5xx augmentent sur une API ECS. La métrique ALB HTTPCode_Target_5XX_Count signale le problème mais pas l’endroit. Avec Logs Insights groupé par route, statusCode et durationMs, Claude Code peut lister les routes les plus bruyantes, les p95 les plus élevées et les erreurs apparues après le dernier déploiement.
Troisième cas : latence API Gateway. Comparer Latency et IntegrationLatency aide à savoir si le problème vient de Gateway, d’un authorizer ou du backend Lambda/ECS. Le dashboard doit montrer p95 et p99, pas uniquement la moyenne.
Quatrième cas : fatigue d’alarme. Les Warning peuvent aller vers Slack, les Critical vers PagerDuty. Plusieurs alarmes liées à la même cause peuvent être regroupées. TreatMissingData doit être explicite.
Émettre des logs JSON structurés
Ce logger Node.js fonctionne dans Lambda ou ECS. Les noms de champs restent constants pour faciliter les requêtes.
// logger.mjs
export function logEvent(level, message, fields = {}) {
const entry = {
timestamp: new Date().toISOString(),
level,
message,
service: process.env.SERVICE_NAME || "checkout-api",
env: process.env.NODE_ENV || "development",
requestId: fields.requestId || "unknown",
route: fields.route,
statusCode: fields.statusCode,
durationMs: fields.durationMs,
userId: fields.userId,
errorName: fields.error?.name,
errorMessage: fields.error?.message,
};
console.log(JSON.stringify(entry));
}
logEvent("ERROR", "payment authorization failed", {
requestId: "req-123",
route: "POST /checkout",
statusCode: 502,
durationMs: 842,
userId: "user-456",
error: new Error("upstream timeout"),
});
Test local :
node logger.mjs | jq .
Ne journalisez pas les numéros de carte, les tokens ou les e-mails complets. CloudWatch Logs propose des protections de données, mais la meilleure défense est de ne pas émettre ces valeurs.
Générer les requêtes Logs Insights
Donnez à Claude Code le schéma des logs et la question opérationnelle.
claude -p "
Crée des requêtes CloudWatch Logs Insights.
Les logs sont en JSON avec timestamp, level, message, service, route, statusCode, durationMs, requestId, userId.
Besoins:
1. Top 10 des routes par nombre de 5xx sur la dernière heure
2. Routes avec la plus forte latence p95
3. Timeline pour un requestId
4. errorName qui augmentent après un déploiement
Retourne seulement les requêtes avec de courts commentaires.
"
Exemples utilisables :
-- 5xx par route
fields @timestamp, route, statusCode, requestId
| filter statusCode >= 500
| stats count(*) as errors by route
| sort errors desc
| limit 10
-- latence p95 par route
fields route, durationMs
| filter ispresent(durationMs)
| stats pct(durationMs, 95) as p95, count(*) as requests by route
| sort p95 desc
| limit 20
-- timeline requestId
fields @timestamp, level, message, route, statusCode, durationMs
| filter requestId = "req-123"
| sort @timestamp asc
-- erreurs par nom
fields @timestamp, errorName, route
| filter level = "ERROR" and ispresent(errorName)
| stats count(*) as count by errorName, route
| sort count desc
| limit 20
Le piège de coût est de scanner trop large. Limitez la période et les log groups interrogés.
Metric Filter et alarme SAM
Un événement de log peut devenir une métrique CloudWatch grâce à Metric Filter.
Resources:
CheckoutLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: /aws/lambda/checkout-api
RetentionInDays: 30
PaymentFailureMetricFilter:
Type: AWS::Logs::MetricFilter
Properties:
LogGroupName: !Ref CheckoutLogGroup
FilterPattern: '{ $.level = "ERROR" && $.message = "payment authorization failed" }'
MetricTransformations:
- MetricNamespace: MyApp/Business
MetricName: PaymentFailure
MetricValue: "1"
DefaultValue: 0
PaymentFailureAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: prod-payment-failure-critical
AlarmDescription: Five or more payment failures in ten minutes
Namespace: MyApp/Business
MetricName: PaymentFailure
Statistic: Sum
Period: 300
EvaluationPeriods: 2
DatapointsToAlarm: 2
Threshold: 5
ComparisonOperator: GreaterThanOrEqualToThreshold
TreatMissingData: notBreaching
AlarmActions:
- arn:aws:sns:eu-west-3:123456789012:prod-alerts
EvaluationPeriods indique combien de périodes sont évaluées. DatapointsToAlarm indique combien doivent dépasser le seuil. Une seule période est rapide mais bruyante ; trop de périodes détectent trop tard.
Gérer le dashboard en JSON
Un dashboard uniquement créé dans la console est difficile à reproduire. Stockez le JSON et faites ajouter les lignes Lambda, ECS, API Gateway, ALB et métier par Claude Code.
{
"widgets": [
{
"type": "metric",
"x": 0,
"y": 0,
"width": 12,
"height": 6,
"properties": {
"region": "eu-west-3",
"title": "API health: requests, 5xx, latency",
"view": "timeSeries",
"metrics": [
["AWS/ApplicationELB", "RequestCount", "LoadBalancer", "app/myapp/abc", { "stat": "Sum" }],
[".", "HTTPCode_Target_5XX_Count", ".", ".", { "stat": "Sum", "yAxis": "right" }],
["AWS/ApiGateway", "Latency", "ApiName", "checkout-api", "Stage", "prod", { "stat": "p95" }]
],
"period": 60
}
}
]
}
aws cloudwatch put-dashboard \
--dashboard-name myapp-production \
--dashboard-body file://dashboard.json
Prompt d’incident et IAM
Pendant l’incident, bornez le périmètre et les commandes.
claude -p "
Analyse cet incident de production. Sépare les faits des hypothèses.
Périmètre:
- log groups: /aws/lambda/checkout-api, /ecs/checkout-api
- window: 2026-06-02T10:00:00+09:00 to 2026-06-02T11:00:00+09:00
- changement récent: checkout-api v1.42.0 deploy
Commandes en lecture seule autorisées:
- aws logs start-query / get-query-results
- aws cloudwatch get-metric-data
- aws cloudwatch describe-alarms
Sortie: timeline, impact, top 3 hypothèses, mitigation immédiate, prévention, alarmes manquantes.
"
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:StartQuery",
"logs:GetQueryResults",
"logs:FilterLogEvents",
"cloudwatch:GetMetricData",
"cloudwatch:DescribeAlarms",
"cloudwatch:GetDashboard"
],
"Resource": "*"
}
]
}
Pièges fréquents
La fatigue d’alarme arrive quand chaque symptôme technique réveille quelqu’un. Priorisez les métriques proches de l’impact utilisateur : 5xx, p95, backlog, échec de paiement et jobs échoués.
La rétention illimitée des logs est une fuite de coût silencieuse. Configurez la rétention sur Lambda et ECS ; gardez plus longtemps uniquement ce qui sert à l’audit.
Les métriques à forte cardinalité coûtent cher et deviennent illisibles. Ne mettez pas userId ou requestId en dimensions. Gardez ces détails dans les logs.
Enfin, ne collez pas des logs sans limite dans Claude Code. Interrogez d’abord, réduisez la fenêtre, masquez les données sensibles et demandez des conclusions appuyées par des preuves.
Étape suivante
Choisissez une API critique et ajoutez cinq éléments : logs JSON, requête 5xx, requête p95, une alarme Critical et une ligne de dashboard. Reliez ensuite ce socle aux pratiques de Claude Code × AWS ECS/Fargate et Claude Code × AWS IAM.
Vérification pratique : j’ai contrôlé la sortie du logger avec jq, et le fragment SAM est structuré pour être intégré après remplacement des noms, région, compte et ARN SNS. Réglez les seuils dans un compte de test avant de notifier de vrais astreintes.
Références officielles
PDF gratuit: cheatsheet Claude Code
Saisissez votre email et téléchargez une page avec commandes, habitudes de review et workflow sûr.
Nous protégeons vos données et n'envoyons pas de spam.
À propos de l'auteur
Masa
Ingénieur spécialisé dans les workflows pratiques avec Claude Code.
Articles liés
Workflow Obsidian vers CLAUDE.md avec Claude Code
Transformer des notes Obsidian en notes CLAUDE.md concises pour reprendre les sessions sans réexpliquer.
Claude Code Revenue CTA Routing : relier articles, PDF, Gumroad et consultation
Un workflow Claude Code pour orienter les lecteurs vers PDF gratuit, Gumroad ou consultation selon l'intention.
Règles de handoff Claude Code en équipe: preuves, permissions, rollback et revenus
Un format concret pour transmettre un travail Claude Code avec preuves, permissions, rollback, PDF gratuit, Gumroad et consultation.