(Python) AWS-Rechnungsbetrag abrufen

Einführung

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.

Umgebung

Die Ausführungsumgebung ist wie folgt

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.1
BuildVersion:   19B88

$ python --version
Python 3.7.4

API-Spezifikationen

Holen Sie sich das API-Ausführungsdatum und den 1. des Ausführungsmonats

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()

Erfassen Sie den Erfassungszeitraum für den Rechnungsbetrag

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

Erhalten Sie die Erfassung des Gesamtabrechnungsbetrags

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'],
    }

Holen Sie sich den detaillierten Rechnungsbetrag für jeden Service

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

Führen Sie die erstellte API aus.

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'}
]

abschließend

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. スクリーンショット 2020-01-12 16.46.57.png

Recommended Posts

(Python) AWS-Rechnungsbetrag abrufen
[Python] Holen Sie sich den Trend von Qiita
[Python3] Ermittelt die Datumsdifferenz
Holen Sie sich ein Date mit Python
Python Aktuelle Zeit abrufen
Holen Sie sich YouTube-Kommentare in Python
Holen Sie sich den Ländercode mit Python
Python --bitflyer Holen Sie sich das Guthaben
Holen Sie sich letzten Monat in Python
[Python] Scraping in AWS Lambda
Holen Sie sich Twitter-Timeline mit Python
AWS CDK-Lambda + API-Gateway (Python)
Holen Sie sich Youtube-Daten mit Python
[Python] Holen Sie sich den Vormonat
Holen Sie sich die Thread-ID mit Python
Beginnen Sie mit Python! ~ ② Grammatik ~
[Python] Quotient und Überschuss erhalten
Holen Sie sich Lager mit Python
Holen Sie sich Evernote-Notizen in Python
Python> Teilzeichenfolge abrufen> Seriennummer drucken [5:10] / Seriennummer drucken [5: -1]
Holen Sie sich das Home-Verzeichnis mit Python
Holen Sie sich Tastaturereignis mit Python
IfcOpenShell-Python-Bindungen werden gestartet
Python --bitflyer Chat-Inhalte abrufen
Holen Sie sich Alembic-Informationen mit Python
Python> Wörterbuch> get ()> optionaler Wert
Holen Sie sich japanische Synonyme mit Python
Holen Sie sich LeapMotion-Daten in Python.
Beginnen Sie mit Python! ~ ① Umweltbau ~
Zusammenfassung bei Verwendung von AWS Lambda (Python)
Link, um mit Python zu beginnen
Holen Sie sich Bewertungen mit Python Googlemap API
Textextraktion mit AWS Textract (Python3.6)
Holen Sie sich den Desktop-Pfad in Python
Schreiben Sie die AWS Lambda-Funktion in Python
Holen Sie sich das Wetter mit Python-Anfragen
Holen Sie sich Web-Screen-Capture mit Python
Holen Sie sich das Wetter mit Python-Anfragen 2
[Python] Mit DataReader Wirtschaftsdaten abrufen
Holen Sie sich den Skriptpfad in Python
Führen Sie Python planmäßig auf AWS Lambda aus
So erhalten Sie die Python-Version
boto3 (AWS SDK für Python) Hinweis
[Kleine Geschichte] Holen Sie sich mit Python einen Zeitstempel
Holen Sie sich ein Kommunikationsmemo in Python
AWS Layer Creation Script für Python
Holen Sie sich Qiita-Trends mit Python-Scraping
Holen Sie sich den Desktop-Pfad in Python
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
Holen Sie sich den Hostnamen in Python
Python Hinweis: Holen Sie sich den aktuellen Monat
Python-Version, um nicht verwendete Ports zu erhalten
Beginnen Sie mit Python mit Blender
Holen Sie sich Wetterinformationen mit Python & Scraping
[AWS SAM] Einführung in die Python-Version
[Cloud102] # 1 Beginnen wir mit Python (Teil 2 Jupyter Notebook Construction AWS Edition)
Ich erhalte einen Python No-Modul mit dem Namen 'Encodings' mit dem Befehl aws