Skip to content
Learni
View all tutorials
Cloud

Comment implémenter l'allocation des coûts cloud en 2026

Introduction

L'allocation des coûts cloud est cruciale en 2026, où les factures AWS dépassent souvent les budgets IT de 30-50% sans visibilité fine. Imaginez répartir automatiquement les coûts EC2, S3 et Lambda par projet, équipe ou environnement (prod/staging) via des tags. Ce tutoriel avancé vous guide pour activer les tags d'allocation AWS, query l'API Cost Explorer avec Boto3, appliquer des règles métier pour sommer par owner, et visualiser via un dashboard Streamlit.

Pourquoi c'est vital ? Une allocation précise permet des chargebacks justes, détecte les gaspillages (ex: dev sans tags = alerte), et optimise via des recommandations. Nous partons des bases (tags) vers l'expertise (règles custom + pagination). Résultat : un outil CLI/dashboard production-ready, bookmarké par tout DevOps senior. Temps estimé : 45 min setup + analyse mensuelle.

Préparez votre compte AWS Billing avec Cost Explorer activé (gratuit, 24h de latence).

Prérequis

  • Compte AWS avec accès Billing (IAM policy ce:Get, ce:Describe)
  • Cost Explorer activé (console AWS > Billing > Cost Explorer > Enable)
  • Activer 1-3 tags d'allocation (ex: project, team, env) dans Cost Allocation Tags
  • Python 3.10+, AWS CLI v2 installé et configuré (aws configure avec profil default)
  • Connaissances avancées en Boto3, pandas et pagination API
  • Ressources taggées (ex: EC2 avec project:alpha, team:dev)

Installation des dépendances

install_deps.sh
#!/bin/bash
pip install boto3 pandas streamlit openpyxl matplotlib plotly
aws configure set region us-east-1
aws ce describe-cost-category-definition --region us-east-1
echo "Dépendances installées. Vérifiez Cost Explorer activé."

Ce script installe Boto3 pour l'API AWS, Pandas pour manipuler les données, Streamlit pour le dashboard, et OpenPyXL pour exports Excel. Il configure la région et teste l'accès Cost Explorer. Exécutez-le une fois ; piège : sans aws configure, les credentials échouent silencieusement.

Premier query : Coûts totaux

Avant l'allocation fine, validez l'accès avec un query total. Utilisez get_cost_and_usage pour sommer les coûts Unblended sur un mois. Analogie : comme un SELECT SUM(cost) SQL sur vos bills. Notez la pagination via NextPageToken pour datasets >100 lignes.

Script coûts totaux avec pagination

total_costs.py
import boto3
import sys
from datetime import datetime, timedelta

def get_total_costs(start_date, end_date):
    ce = boto3.client('ce')
    total_cost = 0.0
    paginator = ce.get_paginator('get_cost_and_usage')
    page_iterator = paginator.paginate(
        TimePeriod={'Start': start_date, 'End': end_date},
        Granularity='MONTHLY',
        Metrics=['UnblendedCost']
    )
    for page in page_iterator:
        for result in page['ResultsByTime']:
            total_cost += float(result['Total']['UnblendedCost']['Amount'])
    return total_cost

if __name__ == '__main__':
    end = datetime.now().strftime('%Y-%m-%d')
    start = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')
    print(f"Coûts totaux {start} à {end}: ${get_total_costs(start, end):.2f}")

Ce script gère la pagination automatiquement via Paginator, somme les coûts mensuels sans blending. Paramétrez dates via CLI ; robuste pour gros comptes (>1M$). Piège : dates futures/invalides = erreur 400 ; toujours valider format YYYY-MM-DD.

Allocation par tags

Passez à l'allocation : groupBy sur tag project. Filtrez services (ex: EC2+S3) pour précision. Résultat : DataFrame Pandas avec coûts par valeur tag, comme un pivot table Excel automatisé.

Coûts par tag project

costs_by_tag.py
import boto3
import pandas as pd
from datetime import datetime, timedelta

def get_costs_by_tag(start_date, end_date, tag_key='project'):
    ce = boto3.client('ce')
    results = []
    paginator = ce.get_paginator('get_cost_and_usage')
    page_iterator = paginator.paginate(
        TimePeriod={'Start': start_date, 'End': end_date},
        Granularity='MONTHLY',
        Metrics=['UnblendedCost'],
        GroupBy=[{'Type': 'TAG', 'Key': tag_key}]
    )
    for page in page_iterator:
        for result in page['ResultsByTime']:
            for group in result['Groups']:
                results.append({
                    'Time': result['TimePeriod']['Start'],
                    'TagValue': group['Keys'][0],
                    'Cost': float(group['Metrics']['UnblendedCost']['Amount'])
                })
    return pd.DataFrame(results)

if __name__ == '__main__':
    end = datetime.now().strftime('%Y-%m-%d')
    start = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')
    df = get_costs_by_tag(start, end)
    print(df.pivot_table(values='Cost', index='TagValue', aggfunc='sum').round(2))

Extrait coûts par valeur de tag (ex: alpha: $150, beta: $200), pivot en table. Filtre implicite sur tag activé. Avancé : support multi-tags via loop. Piège : tag non activé en Cost Allocation = vide ; vérifiez console AWS.

Règles d'allocation avancées

Règles métier : mappez tags à équipes/owners, appliquez splits (ex: shared RDS 50/50). Chargez config YAML, agrégez avec Pandas groupby. Scalable pour 100+ projets.

Allocation avec règles YAML

allocate_costs.py
import boto3
import pandas as pd
import yaml
from datetime import datetime, timedelta

def load_rules():
    with open('allocation_rules.yaml', 'r') as f:
        return yaml.safe_load(f)

def allocate_costs(start_date, end_date):
    rules = load_rules()
    df = get_costs_by_tag(start_date, end_date)  # from previous script
    df['team'] = df['TagValue'].map(rules['projects'])
    df['owner'] = df['team'].map(rules['teams'])
    allocation = df.groupby(['team', 'owner'])['Cost'].sum().reset_index()
    allocation['share'] = allocation['Cost'] / allocation['Cost'].sum() * 100
    return allocation

if __name__ == '__main__':
    end = datetime.now().strftime('%Y-%m-%d')
    start = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')
    alloc_df = allocate_costs(start, end)
    print(alloc_df.round(2))
    alloc_df.to_excel('allocation_report.xlsx', index=False)

Intègre get_costs_by_tag, mappe via YAML (ex: project:alpha -> team:dev -> owner:alice). Export Excel auto. Piège : NaN sur tags inconnus ; ajoutez 'unknown' rule. Copiez le code précédent pour get_costs_by_tag.

Config règles YAML

allocation_rules.yaml
projects:
  alpha: dev
  beta: ops
  shared: shared
teams:
  dev: Alice
  ops: Bob
  shared: Management
default_owner: Unassigned
filters:
  services: [EC2, S3, Lambda]

YAML externe pour règles sans redeploy. Extensible : ajoutez splits (ex: shared: [dev:0.5, ops:0.5]). Charge via PyYAML ; piège : indentation YAML stricte, validez avec yamllint.

Dashboard interactif

Finalisez avec Streamlit : sliders dates, graphs Plotly par team/tag. Déployez sur Streamlit Cloud pour sharing équipe.

Dashboard Streamlit

dashboard.py
import streamlit as st
import plotly.express as px
from allocate_costs import allocate_costs  # import your func

st.title('Allocation Coûts Cloud AWS')
col1, col2 = st.columns(2)
start_date = col1.date_input('Début', value=pd.Timestamp.now() - pd.Timedelta(days=30))
end_date = col2.date_input('Fin', value=pd.Timestamp.now())
if st.button('Analyser'):
    alloc_df = allocate_costs(start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d'))
    st.dataframe(alloc_df)
    fig = px.pie(alloc_df, values='Cost', names='team', title='Répartition par équipe')
    st.plotly_chart(fig)
    st.download_button('Export CSV', alloc_df.to_csv(index=False), 'report.csv')

Dashboard live : inputs dates, pie chart, export. streamlit run dashboard.py. Intègre vos funcs. Piège : deps Streamlit en env ; pour prod, secrets AWS via Streamlit secrets.toml.

Bonnes pratiques

  • Tags obligatoires : Politique AWS Organizations + Lambda auto-tag.
  • Queries optimisées : Cache Pandas en Redis, schedule via EventBridge.
  • Multi-cloud : Wrapper Boto3/GCP Billing API.
  • Sécurité : Least privilege IAM, encrypt reports S3.
  • Alertes : >budget via SNS si share > seuil.

Erreurs courantes à éviter

  • Oublier d'activer tags en Cost Allocation Tags (24h delay).
  • Ignorer pagination : datasets >1k lignes tronqués.
  • Dates invalides/mal formées : toujours YYYY-MM-DD, pas weekends-only.
  • Pas de fallback 'unknown' : 20% coûts orphelins.

Pour aller plus loin

Approfondissez avec AWS Cost Anomaly Detection ou Kubecost pour EKS. Intégrez à Grafana via exporter Prometheus. Découvrez nos formations Learni DevOps & Cloud pour certifs AWS Advanced Networking.