Logo Teamwork

EC2 Capacity Manager : la visibilité qui manquait à votre gestion de capacité

Published on
Authors
Version audio
Chargement...
EC2 Capacity Manager


Dans un précédent article, nous avons vu en détail les stratégies de réservation de capacité EC2 : ODCR, Savings Plans, Reserved Instances et le mix avec les Spot Instances. Nous avions toutes les briques pour garantir la disponibilité et optimiser les coûts.

Mais il manquait un élément crucial : la visibilité centralisée. Comment savoir si vos ODCR sont bien utilisées ? Comment détecter une réservation à 20% d'utilisation qui vous coûte des milliers d'euros par mois ? Comment avoir une vue consolidée quand vous opérez sur 50 comptes et 4 régions ?

Amazon EC2 Capacity Manager, lancé en octobre 2025, est la réponse d'AWS. C'est un service gratuit qui agrège toutes les données de capacité — On-Demand, Spot et Capacity Reservations — dans une interface unique, à travers tous vos comptes et régions, avec un rafraîchissement horaire.

Le problème que résout Capacity Manager

Avant Capacity Manager, obtenir une vue consolidée de votre capacité EC2 nécessitait :

  • Des appels manuels aux API describe-capacity-reservations sur chaque compte/région
  • La création de scripts custom pour agréger les données
  • Du context-switching entre la console EC2, AWS Cost Explorer, Amazon CloudWatch et les CUR (Cost and Usage Reports)
  • Des dashboards maison pour visualiser les tendances

Ce travail d'agrégation devenait ingérable à grande échelle. Capacity Manager élimine cette complexité opérationnelle.

Le Dashboard : vue d'ensemble en un coup d'œil

Le dashboard principal affiche trois catégories de métriques avec des indicateurs de tendance :

Onglet Dashboard

Trois cartes de synthèse donnent le pouls de votre capacité, avec indicateurs de tendance :

  • Reservations : taux d'utilisation moyen (en heures de vCPU) et coût estimé de la capacité inutilisée
  • Usage : usage réservé en vCPU-heures (hors Spot)
  • Spot : durée moyenne d'exécution avant interruption (en heures)

Plus bas, deux blocs de détail complètent la vue :

  • Usage metrics : répartition réservé / non-réservé / Spot (donut) et tendance dans le temps, avec choix de l'unité (vCPUs, instances ou coût estimé)
  • Reservation metrics : historique capacité utilisée vs inutilisée (« Reserved capacity trends ») et un tableau « Unused capacity » listant les ODCR les plus sous-utilisées, triées par coût inutilisé, avec pourcentage d'utilisation, type d'instance et zone de disponibilité

Onglet Usage

L'onglet Usage offre un historique détaillé filtrable par dimensions :

  • Account ID
  • Region
  • Instance Family
  • Availability Zone
  • Instance Type

On peut grouper et filtrer selon ces dimensions pour créer des vues personnalisées. Par exemple : "montre-moi l'utilisation des m5 en eu-west-1 sur le compte production sur les 30 derniers jours".

Onglet Reservations

C'est ici que Capacity Manager prend toute sa valeur. L'onglet affiche :

  • Les statistiques agrégées (nombre total de réservations, taux d'utilisation global, capacité réservée vs utilisée)
  • Un tableau triable avec chaque ODCR, son utilisation et un lien direct pour la modifier
  • La possibilité de modifier une ODCR directement depuis cette interface (sans naviguer vers une autre section de la console)

Onglet Spot

L'analyse des Spot Instances inclut la durée avant interruption — une donnée précieuse pour calibrer vos workloads Spot et améliorer la diversification des types d'instances.

Activation

# Activer Capacity Manager (agrège 14 jours d'historique)
aws ec2 enable-capacity-manager

# Vérifier le statut (activation, accès Organizations, ingestion des données)
aws ec2 get-capacity-manager-attributes

Le service est disponible dans toutes les régions commerciales et est entièrement gratuit.

Visibilité multi-compte avec AWS Organizations

Pour les organisations opérant à grande échelle, Capacity Manager s'intègre avec AWS Organizations. Depuis le compte de management ou un administrateur délégué, vous obtenez une vue consolidée de la capacité sur tous les comptes membres.

# Activer l'intégration Organizations (depuis le compte de management)
aws ec2 update-capacity-manager-organizations-access \
  --organizations-access

# Métriques de taux d'utilisation et de coût inutilisé, groupées par compte
aws ec2 get-capacity-manager-metric-data \
  --metric-names reservation-avg-utilization-vcpu reservation-unused-total-estimated-cost \
  --start-time 2026-08-01T00:00:00Z \
  --end-time 2026-08-14T00:00:00Z \
  --period 86400 \
  --group-by account-id

Cette vue inter-comptes révèle des patterns d'optimisation invisibles autrement. Exemple illustratif de ce que peut révéler un groupement par compte :

CompteUtilisation moyenne (vCPU)Coût estimé de capacité inutilisée
production96%faible
staging41%élevé — à revoir
sandbox12%élevé — candidat à l'annulation

Un compte à faible utilisation n'est pas forcément un problème (capacité réservée pour un pic à venir), mais c'est un signal à investiguer.

Data Exports : analyse au-delà des 90 jours

La console et les API offrent 90 jours de rétention. Pour l'analyse de tendances à long terme, Capacity Manager exporte vers Amazon S3 en CSV (Gzip) ou Parquet (Snappy) — Parquet étant recommandé pour les performances de requêtage. Un seul export est autorisé par compte, avec une fréquence horaire.

# Créer l'export vers S3 (le bucket doit avoir la policy IAM adéquate, voir la doc)
aws ec2 create-capacity-manager-data-export \
  --s3-bucket-name capacity-manager-exports-123456789012 \
  --s3-bucket-prefix capacity-data/ \
  --schedule hourly \
  --output-format parquet \
  --region eu-west-1

# Vérifier le statut de livraison
aws ec2 describe-capacity-manager-data-exports --region eu-west-1

Une fois les données dans S3, vous pouvez les exploiter avec Amazon Athena en créant une table externe pointant sur le bucket (partitionnée par année/mois/jour/heure), puis en interrogeant les colonnes exportées (reservationavgutilizationinst, reservationunusedtotalestimatedcost, etc.) :

-- Identifier les ODCR sous-utilisées et leur coût inutilisé
SELECT
  reservationid,
  instancetype,
  region,
  "az-id",
  ROUND(CAST(reservationavgutilizationinst AS double) * 100, 2) AS utilization_pct,
  ROUND(CAST(reservationunusedtotalestimatedcost AS double), 4) AS wasted_cost_usd
FROM capacity_manager_db.capacity_data
WHERE metricgroupname = 'Reservation Usage'
  AND CAST(reservationavgutilizationinst AS double) < 0.5
  AND y = '2026' AND m = '07'
ORDER BY wasted_cost_usd DESC
LIMIT 10;

Pour le détail complet (création du bucket, policy S3, script Glue/Athena avec partition projection), voir l'article Maximize Amazon EC2 Capacity Reservations with Capacity Manager data exports publié par AWS.

Automatisation : alertes et optimisation proactive

Capacity Manager fournit les données ; l'automatisation les transforme en actions. Voici une architecture combinant Amazon EventBridge et AWS Lambda pour alerter automatiquement sur les ODCR sous-utilisées :

EventBridge (cron quotidien)Lambda (vérification utilisation)Amazon SNS (alerte)

La Lambda interroge directement l'API describe-capacity-reservations (données en temps réel, sans passer par Capacity Manager) pour calculer le taux d'utilisation de chaque ODCR et publier une alerte SNS si le seuil n'est pas atteint.

# EventBridge : vérification quotidienne à 8h
resource "aws_cloudwatch_event_rule" "check_capacity" {
  name                = "check-odcr-utilization"
  schedule_expression = "cron(0 8 * * ? *)"
}

resource "aws_cloudwatch_event_target" "lambda" {
  rule = aws_cloudwatch_event_rule.check_capacity.name
  arn  = aws_lambda_function.capacity_alert.arn
}

# Indispensable : sans cette permission, EventBridge ne peut pas invoquer la Lambda
resource "aws_lambda_permission" "allow_eventbridge" {
  statement_id  = "AllowExecutionFromEventBridge"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.capacity_alert.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.check_capacity.arn
}

resource "aws_lambda_function" "capacity_alert" {
  function_name = "capacity-utilization-alert"
  runtime       = "python3.12"
  handler       = "handler.lambda_handler"
  role          = aws_iam_role.lambda_capacity.arn
  timeout       = 120

  environment {
    variables = {
      MIN_UTILIZATION = "50"
      SNS_TOPIC_ARN  = aws_sns_topic.capacity_alerts.arn
    }
  }
}
import boto3
import os

ec2 = boto3.client('ec2')
sns = boto3.client('sns')

THRESHOLD = int(os.environ['MIN_UTILIZATION'])
SNS_TOPIC = os.environ['SNS_TOPIC_ARN']

def lambda_handler(event, context):
    reservations = ec2.describe_capacity_reservations(
        Filters=[{'Name': 'state', 'Values': ['active']}]
    )['CapacityReservations']

    alerts = []
    for cr in reservations:
        total = cr['TotalInstanceCount']
        used = total - cr['AvailableInstanceCount']
        util = (used / total * 100) if total > 0 else 0

        if util < THRESHOLD:
            alerts.append(
                f"• {cr['CapacityReservationId']} "
                f"({cr['InstanceType']}, {cr['AvailabilityZone']}): "
                f"{util:.0f}% — recommandation: réduire à {max(used+1, 1)}"
            )

    if alerts:
        sns.publish(
            TopicArn=SNS_TOPIC,
            Subject=f"[Capacity] {len(alerts)} ODCR sous le seuil de {THRESHOLD}%",
            Message="\n".join(alerts)
        )

    return {'underutilized': len(alerts)}

Bonnes pratiques

  • Activez Capacity Manager dès maintenant — c'est gratuit et la collecte démarre immédiatement
  • Configurez l'intégration Organizations si vous opérez en multi-compte
  • Exportez vers S3 en Parquet pour les analyses long terme et la corrélation avec vos données FinOps
  • Automatisez les alertes sur les ODCR sous 50% d'utilisation
  • Revue mensuelle : passez en revue le dashboard Reservations et nettoyez les réservations inutiles
  • Utilisez les unités "estimated cost" pour prioriser — 100 vCPU-heures inutilisées sur des p5 coûtent bien plus que sur des t3

Conclusion

EC2 Capacity Manager transforme la gestion de capacité d'un exercice manuel et fragmenté en une pratique centralisée et data-driven. Combiné avec les stratégies de réservation que nous avons déjà couvertes, il offre enfin la boucle de feedback nécessaire pour optimiser en continu.

C'est aussi un outil à ajouter à la liste des services à déléguer sur un compte membre de votre organisation — typiquement le compte FinOps ou le compte Opérations. En déléguant la gestion de la capacité à l'équipe responsable du suivi des coûts, vous renforcez le principe du moindre privilège tout en assurant un suivi opérationnel efficace.

Mon conseil : activez Capacity Manager aujourd'hui, configurez un export S3 vers Athena, et mettez en place une Lambda d'alerte sur les ODCR sous-utilisées. En moins d'une heure, vous aurez une visibilité que beaucoup d'organisations mettent des mois à construire manuellement.