Introduction
Dans un environnement cloud multi-équipes, la répartition des coûts est cruciale pour le FinOps : elle permet d'attribuer précisément les dépenses aux projets, départements ou environnements, évitant les surprises facturation et favorisant l'optimisation. AWS domine avec ses Cost Allocation Tags, activables pour propager les tags des ressources (EC2, S3, RDS) vers les factures. Ce tutoriel avancé vous guide pas à pas : activation des tags, scripts Python boto3 pour tagging automatisé, requêtes Cost Explorer pour rapports granulaires, et export CSV. À la fin, vous automatiserez l'allocation sur des comptes multiples, comme un pro FinOps. Gain : visibilité à 95% des coûts, réduction de 20-30% via insights. Préparez-vous à scaler (128 mots).
Prérequis
- Compte AWS avec droits administrateur Billing et IAM.
- AWS CLI v2 installé et configuré (
aws configure). - Python 3.10+ avec
pip. - Connaissances avancées en boto3, Cost Explorer et Terraform.
- Accès à un compte de test avec ressources EC2/S3 existantes.
Installer les dépendances
#!/bin/bash
pip install boto3 pandas openpyxl
aws configure set region us-east-1
aws sts get-caller-identityCe script installe boto3 pour l'API AWS, pandas pour l'analyse de données, et openpyxl pour les exports Excel/CSV. Il configure la région par défaut et vérifie l'identité IAM. Exécutez-le en premier pour valider les credentials ; évitez les régions par défaut si multi-région.
Activer les Cost Allocation Tags
Avant le code, activez manuellement 3-5 clés de tags dans la console AWS : Billing > Preferences > Cost allocation tags (ex: 'Project', 'Team', 'Environment'). Propagation prend 24h. Utilisez l'AWS CLI pour lister : aws ce get-cost-allocation-tags. Cela lie tags ressources à Cost Explorer sans recodage.
Tagger des instances EC2 existantes
import boto3
client = boto3.client('ec2')
# Lister instances
response = client.describe_instances()
for reservation in response['Reservations']:
for instance in reservation['Instances']:
instance_id = instance['InstanceId']
# Appliquer tags si absents
tags = [{'Key': 'Project', 'Value': 'FinOpsDemo'}, {'Key': 'Team', 'Value': 'DevOps'}, {'Key': 'Environment', 'Value': 'Prod'}]
client.create_tags(Resources=[instance_id], Tags=tags)
print(f'Taggé {instance_id}')
print('Tagging EC2 terminé.')Ce script liste toutes les EC2 et applique des tags standardisés si manquants, propageables aux coûts. Utilisez describe_instances() pour inventaire ; create_tags() est idempotent. Piège : limitez à 50 ressources/run pour éviter throttling API ; testez sur compte staging.
Tagger un bucket S3
import boto3
s3 = boto3.client('s3')
resource = boto3.resource('s3')
bucket_name = 'mon-bucket-finops-demo'
tags = {
'Project': 'FinOpsDemo',
'Team': 'DevOps',
'Environment': 'Prod',
'CostCenter': 'CC123'
}
tagging_config = {'TagSet': [{'Key': k, 'Value': v} for k, v in tags.items()]}
s3.put_bucket_tagging(Bucket=bucket_name, Tagging=tagging_config)
print(f'Bucket {bucket_name} taggé avec succès.')Spécifique S3 : put_bucket_tagging() applique des tags au niveau bucket, propagés aux coûts stockage/transfert. Dict-to-TagSet convertit facilement. Attention : tags S3 max 10/bucket ; validez avec get_bucket_tagging() post-exécution pour idempotence.
Générer un rapport coûts par tag
Maintenant, interrogeons Cost Explorer pour agréger coûts par tag sur 30 jours. Filtrez par service/tag ; granulaire à l'heure/jour.
Rapport Cost Explorer par tag
import boto3
from datetime import datetime, timedelta
ce = boto3.client('ce')
end = datetime.now()
start = end - timedelta(days=30)
group_by = [
{'Type': 'TAG', 'Key': 'Project'},
{'Type': 'TAG', 'Key': 'Team'}
]
metrics = [{'Expression': {'Text': 'SUM(BlendedCost)'}, 'Label': 'Coût Total'}]
response = ce.get_cost_and_usage(
TimePeriod={'Start': start.strftime('%Y-%m-%d'), 'End': end.strftime('%Y-%m-%d')},
Granularity='MONTHLY',
Metrics=metrics,
GroupBy=group_by
)
for result in response['ResultsByTime']:
print(result)
print('Rapport généré.')Utilise get_cost_and_usage() pour grouper par tags multiples ; BlendedCost pour shared/dedicated. Période dynamique 30j. Limite : 1000 résultats max ; paginez avec NextPageToken pour volumes >1M$. Analogie : comme un SQL GROUP BY sur factures.
Exporter rapport en CSV
import boto3
import pandas as pd
from datetime import datetime, timedelta
import csv
ce = boto3.client('ce')
end = datetime.now()
start = end - timedelta(days=30)
group_by = [{'Type': 'TAG', 'Key': 'Project'}, {'Type': 'TAG', 'Key': 'Team'}]
response = ce.get_cost_and_usage(
TimePeriod={'Start': start.strftime('%Y-%m-%d'), 'End': end.strftime('%Y-%m-%d')},
Granularity='DAILY',
Metrics=[{'Expression': {'Text': 'SUM(BlendedCost)'}, 'Label': 'Coût'}],
GroupBy=group_by
)
data = []
for time in response['ResultsByTime']:
for group in time['Groups']:
data.append({
'Date': time['TimePeriod']['Start'],
'Project': next((g['Keys'][0] for g in group['Keys'] if g['Name']=='Project'), 'N/A'),
'Team': next((g['Keys'][0] for g in group['Keys'] if g['Name']=='Team'), 'N/A'),
'Cout': group['Metrics']['Coût']['Amount']
})
df = pd.DataFrame(data)
df.to_csv('cost_allocation.csv', index=False)
print('Export CSV: cost_allocation.csv')Étends le rapport en CSV via pandas : parsing nested JSON de CostExplorer. Granularité DAILY pour trends. Piège : gérer Keys dict ; testez parsing sur petits datasets. Idéal pour BI tools comme Tableau.
Terraform pour infra taggée
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "finops_demo" {
ami = "ami-0c02fb55956c7d316"
instance_type = "t3.micro"
tags = {
Name = "FinOpsDemo"
Project = "FinOpsDemo"
Team = "DevOps"
Environment = "Prod"
CostCenter = "CC123"
}
}
resource "aws_s3_bucket" "finops_bucket" {
bucket = "finops-demo-bucket-${random_id.bucket_suffix.hex}"
tags = {
Project = "FinOpsDemo"
Team = "DevOps"
Environment = "Prod"
}
}
resource "random_id" "bucket_suffix" {
byte_length = 4
}
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}IaC avec Terraform : tags obligatoires sur EC2/S3 via bloc tags. Random pour bucket unique. terraform apply propage tags automatiquement. Avantage : audit trail Git ; évitez hardcoding, utilisez variables.tf pour dynamiser.
Bonnes pratiques
- Standardisez 5 tags max : Project, Team, Env, Owner, CostCenter – facile à activer/maintenir.
- Automatisez tagging : Lambda + EventBridge sur create ressources.
- Multi-comptes : utilisez AWS Organizations + Control Tower pour tags centralisés.
- Alertes anomalies : Budgets AWS + SNS sur tags spécifiques (>10% variance).
- Revues mensuelles : intégrez à FinOps avec exports CSV vers QuickSight.
Erreurs courantes à éviter
- Oublier d'activer tags en Billing : coûts non groupables (24h délai).
- Tags >50 caractères ou non-alphanum : rejetés silencieusement.
- Ignorer propagation : testez avec Cost Explorer UI post-tagging.
- Pas de pagination CostExplorer : troncature sur >10k lignes.
Pour aller plus loin
- Documentation AWS Cost Explorer : aws.amazon.com/cost-explorer.
- FinOps Foundation : finops.org.
- Formation avancée Cloud FinOps : formations Learni.
- Implémentez Kubernetes cost allocation avec Kubecost.