Nachdem ich ein AWS-Konto habe, möchte ich meine Abrechnung verwalten. Ich möchte ungeplante Ausgaben möglichst vermeiden. Daher verwenden wir Python, um die Rechnungsinformationen aus dem Kosten-Explorer von AWS abzurufen.
Die Ausführungsumgebung ist wie folgt
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.1
BuildVersion: 19B88
$ python --version
Python 3.7.4
Erstellen Sie eine Methode, um das Ausführungsdatum und den ersten Tag des Ausführungsmonats mithilfe des Pakets "datetime" wie folgt abzurufen.
from datetime import datetime, timedelta, date
#Holen Sie sich den ersten Tag des Ausführungsmonats
def get_begin_of_month() -> str:
return date.today().replace(day=1).isoformat()
#Ausführungsdatum abrufen
def get_today() -> str:
return date.today().isoformat()
Erstellen Sie eine Methode, um den Zielzeitraum für die Erfassung des Rechnungsbetrags mithilfe der oben beschriebenen Methode zurückzugeben. Wenn jedoch START und ENDE des Erfassungszielzeitraums identisch sind, kann dies im SDK von Cost Explorer nicht als Argument festgelegt werden. Wenn daher START und ENDE des Akquisitionszielzeitraums gleich sind, sollte das Monatsende ab dem 1. des Vormonats zurückgegeben werden.
#Erfassen Sie den Erfassungszeitraum für den Rechnungsbetrag
def get_total_cost_date_range() -> (str, str):
start_date = get_begin_of_month()
end_date = get_today()
# get_cost_and_usage()Weil nicht das gleiche Datum für Anfang und Ende von angegeben werden kann
#Wenn "Heute ist der 1.", machen Sie es im Bereich von "Letzter Monat 1. bis zu diesem Monat 1. (heute)".
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
Verwenden Sie das SDK, um den Gesamtabrechnungsbetrag für den Erfassungszeitraum abzurufen.
import boto3
client = boto3.client('ce', region_name='us-east-1')
#Erhalten Sie die Erfassung des Gesamtabrechnungsbetrags
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'],
}
Erhalten Sie den detaillierten Abrechnungsbetrag für jeden Service sowie den Gesamtabrechnungsbetrag.
import boto3
client = boto3.client('ce', region_name='us-east-1')
#Erhalten Sie einen detaillierten Rechnungsbetrag für jeden 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
Unten ist das Ausführungsergebnis.
{'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'}
]
Verarbeiten Sie dieses Ergebnis in eine Nachricht, die Sie auf Slack usw. anzeigen möchten, und integrieren Sie es in die von [hier] erstellte Bot-API (https://qiita.com/Nidhog-tm/items/54f15b1205bfab46974c). Es wird so angezeigt.
Recommended Posts