Introduction
La gestion des coûts AWS est cruciale en 2026, où les déploiements multi-régions et IA explosent les budgets. Sans outils avancés, les factures peuvent doubler en un mois. Ce tutoriel avancé vous guide pour automatiser l'analyse via Cost Explorer API, configurer des budgets avec notifications SNS, activer les tags d'allocation de coûts et déployer des scripts Boto3 pour des rapports personnalisés. Imaginez un dashboard automatisé qui alerte sur les dépassements EC2 avant qu'ils n'impactent votre P&L. Nous partons des bases CLI pour monter en complexité vers des Lambdas serverless. À la fin, vous maîtriserez des workflows qui économisent typiquement 20-40% sur les comptes enterprise. Prêt à transformer vos coûts en atout compétitif ? (128 mots)
Prérequis
- Compte AWS avec droits IAM CostExplorerFullAccess, BudgetsReadOnlyAccess et budgets:CreateBudget
- AWS CLI v2 installé et configuré (
aws configure) - Python 3.12+ avec
pip install boto3 - Node.js 20+ pour les exemples Lambda (optionnel)
- Connaissances avancées en IAM, SNS et CloudWatch
Configurer AWS CLI et activer Cost Explorer
aws configure set region us-east-1
aws configure set output json
# Activer Cost Explorer (une fois par compte)
aws ce update-cost-allocation-tags-status \
--region us-east-1 \
--tag-keys Key1=Value1,Key2=Value2 \
--status ACTIVE
# Vérifier les tags activés
aws ce list-tags-for-cost-allocation --region us-east-1Ce script configure la CLI pour JSON et active deux tags d'allocation ('Key1', 'Key2') essentiels pour segmenter les coûts par projet/équipe. L'activation prend 24h à propager ; évitez les wildcards (*) qui polluent les queries. Testez toujours avec list-tags-for-cost-allocation pour confirmer.
Comprendre les tags d'allocation
Les Cost Allocation Tags transforment les métadonnées en billable items. Sans eux, Cost Explorer agrège tout en 'untagged'. Activez-les via CLI pour une granularité immédiate, puis appliquez-les à vos ressources EC2/S3 via User-Defined Tags. Analogie : comme un comptable qui catégorise les reçus par département.
Créer un budget programmatique avec notifications
#!/bin/bash
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
cat > budget.json << EOF
{
"BudgetName": "Monthly-Prod-Budget-2026",
"BudgetLimit": {
"Amount": "5000",
"Unit": "USD"
},
"PlannedBudgetLimits": {
"BudgetLimit": {
"Amount": "4500",
"Unit": "USD"
}
},
"CostFilters": {
"Service": ["Amazon EC2"]
},
"CostTypes": {
"IncludeTax": true,
"IncludeSubscription": true,
"IncludeSupport": false,
"IncludeUpfront": true,
"IncludeCommitment": true
},
"TimeUnit": "MONTHLY",
"TimePeriod": {
"Start": "2026-01-01T00:00Z",
"End": "2027-12-31T23:59Z"
},
"Notification": {
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80,
"NotificationType": "FORECASTED",
"NotificationState": "OK"
},
"Arn": "arn:aws:sns:us-east-1:${ACCOUNT_ID}:CostAlertTopic"
}
EOF
aws budgets create-budget --account-id $ACCOUNT_ID --budget file://budget.json --cli-input-json file://budget.json
aws budgets create-notification --account-id $ACCOUNT_ID --budget-name Monthly-Prod-Budget-2026 --notification file://budget.jsonCe script bash complet crée un budget mensuel EC2 à 5000 USD avec alerte SNS à 80% forecasted. Il gère les cost types (taxes incluses) et time period annuel. Piège : vérifiez l'ARN SNS existe ; sinon, créez-le d'abord pour éviter 400 BadRequest.
Intégration avec SNS pour alertes
Les notifications budgets triggerent SNS, qui peut invoquer Lambda ou Slack. Configurez un topic SNS dédié (aws sns create-topic --name CostAlertTopic) avant exécution. Cela rend les budgets actionnables, pas passifs.
Script Python Boto3 pour query Cost Explorer
import boto3
import pandas as pd
from datetime import datetime, timedelta
ce = boto3.client('ce', region_name='us-east-1')
# Période : dernier mois
end = datetime.now()
start = end - timedelta(days=30)
group_by = [
{'Type': 'DIMENSION', 'Key': 'SERVICE'},
{'Type': 'TAG', 'Key': 'Key1'}
]
metrics = [{'Expression': {'Text': 'SUM({{SERVICE}})', 'Label': 'TotalCost'}, 'Period': 'MONTHLY'}]
response = ce.get_cost_and_usage(
TimePeriod={'Start': start.strftime('%Y-%m-%d'), 'End': end.strftime('%Y-%m-%d')},
Granularity='MONTHLY',
Metrics=['BlendedCost'],
GroupBy=group_by,
Filter={'Dimensions': {'Key': 'SERVICE', 'Values': ['Amazon EC2']}}
)
# Convertir en DataFrame pour analyse
rows = []
for group in response['ResultsByTime'][0]['Groups']:
rows.append({
'Service': next((d['Value'] for d in group['Keys'] if d.startswith('SERVICE')), 'N/A'),
'TagKey1': next((d['Value'] for d in group['Keys'] if 'Key1' in d), 'N/A'),
'Cost': float(group['Metrics']['BlendedCost']['Amount'])
})
df = pd.DataFrame(rows)
print(df.sort_values('Cost', ascending=False))
df.to_csv('monthly_ec2_costs.csv', index=False)
print('Rapport exporté : monthly_ec2_costs.csv')Ce script Boto3 query les coûts EC2 du mois par service et tag Key1, exporte en CSV via Pandas. Il utilise BlendedCost pour les RI/SP savings. Piège : ajoutez Filter pour scoping ; sans pandas, utilisez json.dumps pour output brut.
Analyse avancée des coûts
Ce query segmente par tags, révélant les silos coûteux (ex: prod vs dev). Exécutez-le en cron pour trends. Analogie : un scanner IR qui détecte les fuites thermiques dans un data center.
Lambda TypeScript pour alerte coûts via EventBridge
import { CostExplorerClient, GetCostAndUsageCommand } from '@aws-sdk/client-cost-explorer';
import { SNSClient, PublishCommand } from '@aws-sdk/client-sns';
const ceClient = new CostExplorerClient({ region: 'us-east-1' });
const snsClient = new SNSClient({ region: 'us-east-1' });
export const handler = async (event: any) => {
const today = new Date();
const start = new Date(today.getFullYear(), today.getMonth(), 1).toISOString().split('T')[0];
const end = today.toISOString().split('T')[0];
const params = {
TimePeriod: { Start: start, End: end },
Granularity: 'DAILY',
Metrics: ['UnblendedCost'],
GroupBy: [{ Type: 'DIMENSION', Key: 'SERVICE' }],
Filter: { CostCategories: { Key: 'Key1', Values: ['Prod'] } }
};
try {
const command = new GetCostAndUsageCommand(params);
const data = await ceClient.send(command);
const totalCost = data.ResultsByTime?.[0]?.Groups?.reduce((sum, g) => sum + parseFloat(g.Metrics?.UnblendedCost?.Amount || '0'), 0) || 0;
if (totalCost > 1000) {
const snsParams = new PublishCommand({
TopicArn: process.env.SNS_TOPIC_ARN,
Message: `Alerte coûts Prod: $${totalCost.toFixed(2)} ce mois.`,
Subject: 'AWS Cost Alert'
});
await snsClient.send(snsParams);
}
return { statusCode: 200, body: `Coût total: $${totalCost.toFixed(2)}` };
} catch (error) {
console.error(error);
return { statusCode: 500, body: 'Erreur Cost Explorer' };
}
};Cette Lambda TS, triggerée par EventBridge (cron daily), query les coûts Prod et alerte SNS si >1000 USD. Utilise SDK v3 modulaire. Piège : set SNS_TOPIC_ARN en env var ; testez avec sam local invoke pour éviter cold starts coûteux.
Automatisation serverless
Déployez cette Lambda via SAM/ CDK pour un monitoring zéro-op. EventBridge rule : rate(1 day) sur budget events. Scalable à 100+ comptes via Organizations.
CloudFormation pour stack budgets multi-régions
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Budgets multi-régions avec SNS'
Parameters:
BudgetAmount:
Type: Number
Default: 5000
Resources:
CostAlertTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: MultiRegionCostAlerts
Ec2Budget:
Type: AWS::Budgets::Budget
Properties:
BudgetName: !Sub '${AWS::StackName}-EC2'
BudgetLimit:
Amount: !Ref BudgetAmount
Unit: USD
TimeUnit: MONTHLY
CostFilters:
Service: ['Amazon EC2']
CostTypes:
IncludeTax: true
Notification:
- ComparisonOperator: GREATER_THAN
Threshold: 85
NotificationType: ACTUAL
NotificationState: ALARM
- ComparisonOperator: GREATER_THAN
Threshold: 90
NotificationType: FORECASTED
NotificationState: ALARM
Subscribers:
- SubscriptionType: SNS
Address: !Ref CostAlertTopic
Outputs:
SnsTopicArn:
Value: !Ref CostAlertTopic
Export:
Name: !Sub '${AWS::StackName}-SnsArn'Ce template CFN déploie budgets EC2 avec dual alerts (actual/forecasted) et SNS intégré. Paramétrisable pour scaling. Piège : budgets sont global ; utilisez --capabilities CAPABILITY_NAMED_IAM lors du deploy pour SNS perms.
Bonnes pratiques
- Activez toujours 5-10 tags max : trop dilue les queries Cost Explorer.
- Utilisez RI/SP via CLI :
aws ec2 describe-reserved-instances-offeringspour 40-70% savings. - Cronisez scripts Boto3 : EventBridge > Lambda pour zéro infra.
- Organizations + Control Tower : centralisez budgets pour 1000+ comptes.
- QuickSight dashboards : ingérez CSV Boto3 pour visu interactive.
Erreurs courantes à éviter
- Oublier 24h propagation tags : queries vides ; patiencez ou utilisez RI tags.
- Filtre sans Dimensions : milliards de résultats ; scopez toujours Service/LinkedAccount.
- Budgets sans Subscribers : alertes muettes ; validez SNS endpoint.
- SDK v2 obsolète : migrez v3 pour pagination auto dans GetCostAndUsage.
Pour aller plus loin
Maîtrisez AWS Savings Plans avec ce guide CLI. Explorez FinOps avec AWS Cost Optimization Hub. Inscrivez-vous à nos formations Learni Dev sur AWS Advanced pour certifications pro. Intégrez CUR (Cost & Usage Reports) à Athena pour SQL queries massives.