Maintenant que j'ai un compte AWS, je souhaite gérer ma facturation. Je veux éviter les dépenses imprévues si possible. Nous utilisons donc Python pour obtenir les informations de facturation à partir de Cost Explorer d'AWS.
L'environnement d'exécution est le suivant
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.1
BuildVersion: 19B88
$ python --version
Python 3.7.4
--Affichez le montant total facturé. --Affichez le montant de facturation détaillé pour chaque service.
Créez une méthode pour obtenir la date d'exécution et le premier jour du mois d'exécution comme suit en utilisant le package datetime
.
from datetime import datetime, timedelta, date
#Obtenez le premier jour du mois d'exécution
def get_begin_of_month() -> str:
return date.today().replace(day=1).isoformat()
#Obtenir la date d'exécution
def get_today() -> str:
return date.today().isoformat()
Créez une méthode pour renvoyer la période cible d'acquisition du montant de facturation en utilisant la méthode décrite ci-dessus. Cependant, si le DÉBUT et la FIN de la période cible d'acquisition sont identiques, il ne peut pas être défini comme argument dans le SDK de Cost Explorer. Par conséquent, si le DÉBUT et la FIN de la période cible d'acquisition sont identiques, la fin du mois doit être renvoyée à partir du 1er du mois précédent.
#Acquérir la période d'acquisition du montant de facturation
def get_total_cost_date_range() -> (str, str):
start_date = get_begin_of_month()
end_date = get_today()
# get_cost_and_usage()Parce que la même date ne peut pas être spécifiée pour le début et la fin de
#Si "Aujourd'hui est le 1er", définissez-le dans la plage allant du "1er mois dernier au 1er mois (aujourd'hui)"
if start_date == end_date:
end_of_month = datetime.strptime(start_date, '%Y-%m-%d') + timedelta(days=-1)
begin_of_month = end_of_month.replace(day=1)
return begin_of_month.date().isoformat(), end_date
return start_date, end_date
Obtenez le montant total de la facturation pour la période d'acquisition à l'aide du SDK.
import boto3
client = boto3.client('ce', region_name='us-east-1')
#Obtenez l'acquisition du montant de facturation total
def get_total_billing(client) -> dict:
(start_date, end_date) = get_total_cost_date_range()
response = client.get_cost_and_usage(
TimePeriod={
'Start': start_date,
'End': end_date
},
Granularity='MONTHLY',
Metrics=[
'AmortizedCost'
]
)
return {
'start': response['ResultsByTime'][0]['TimePeriod']['Start'],
'end': response['ResultsByTime'][0]['TimePeriod']['End'],
'billing': response['ResultsByTime'][0]['Total']['AmortizedCost']['Amount'],
}
Obtenez le montant de facturation détaillé pour chaque service ainsi que le montant total de la facturation.
import boto3
client = boto3.client('ce', region_name='us-east-1')
#Obtenez le montant de facturation détaillé pour chaque service
def get_service_billings(client) -> list:
(start_date, end_date) = get_total_cost_date_range()
#CostExplorer.Client.get_cost_and_usage
response = client.get_cost_and_usage(
TimePeriod={
'Start': start_date,
'End': end_date
},
Granularity='MONTHLY',
Metrics=[
'AmortizedCost'
],
GroupBy=[
{
'Type': 'DIMENSION',
'Key': 'SERVICE'
}
]
)
billings = []
for item in response['ResultsByTime'][0]['Groups']:
billings.append({
'service_name': item['Keys'][0],
'billing': item['Metrics']['AmortizedCost']['Amount']
})
return billings
Voici le résultat de l'exécution.
{'start': '2020-01-01', 'end': '2020-01-12', 'billing': '0.44'}
[
{'service_name': 'AWS Cost Explorer', 'billing': '0.4'},
{'service_name': 'AWS Key Management Service', 'billing': '0'},
{'service_name': 'AWS Lambda', 'billing': '0'},
{'service_name': 'Amazon API Gateway', 'billing': '0'},
{'service_name': 'Amazon DynamoDB', 'billing': '0'},
{'service_name': 'Amazon Simple Notification Service', 'billing': '0'},
{'service_name': 'Amazon Simple Storage Service', 'billing': '0'},
{'service_name': 'AmazonCloudWatch', 'billing': '0'},
{'service_name': 'Tax', 'billing': '0.04'}
]
Traitez ce résultat dans un message que vous souhaitez afficher sur Slack, etc. et intégrez-le dans l'API du bot créée par ici. Il sera affiché comme ceci.
Recommended Posts