(Python) Obtenir le montant de facturation AWS

introduction

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.

environnement

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

Spécifications de l'API

--Affichez le montant total facturé. --Affichez le montant de facturation détaillé pour chaque service.

Obtenez la date d'exécution de l'API et le 1er du mois d'exécution

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

Acquérir la période d'acquisition du montant de facturation

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 l'acquisition du montant de facturation total

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

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

Exécutez l'API créée.

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

en conclusion

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

Recommended Posts

(Python) Obtenir le montant de facturation AWS
[Python] Découvrez la tendance de Qiita
[Python3] Obtenez la différence de date
Obtenez date avec python
python Obtenir l'heure actuelle
Obtenez des commentaires YouTube en Python
Obtenez le code du pays avec python
Python --bitflyer Obtenir le solde des actifs
Obtenez le mois dernier en Python
[Python] Scraping dans AWS Lambda
Obtenez la chronologie Twitter avec Python
AWS CDK-Lambda + API Gateway (Python)
Obtenez des données Youtube avec python
[Python] Récupérez le mois précédent
Obtenir l'ID de thread avec python
Commencez avec Python! ~ ② Grammaire ~
[python] Obtenir le quotient et le surplus
Obtenez des stocks avec Python
Obtenez des notes Evernote en Python
python> Obtenir la sous-chaîne> imprimer le numéro de série [5:10] / imprimer le numéro de série [5: -1]
Obtenir le répertoire personnel avec python
Obtenir un événement de clavier avec python
Les liaisons Python IfcOpenShell commencent
Python --bitflyer Obtenir le contenu du chat
Obtenez des informations sur l'alambic avec Python
Python> dictionnaire> get ()> valeur facultative
Obtenez des synonymes japonais avec Python
Obtenez des données LeapMotion en Python.
Commencez avec Python! ~ ① Construction de l'environnement ~
Récapitulatif si vous utilisez AWS Lambda (Python)
Lien pour commencer avec python
Obtenir des données de Quandl en Python
Obtenez des avis avec l'API googlemap de python
Extraction de texte avec AWS Textract (Python3.6)
Obtenez le chemin du bureau en Python
Ecrire une fonction AWS Lambda en Python
Obtenez la météo avec les requêtes Python
Obtenez une capture d'écran Web avec python
Obtenez la météo avec les requêtes Python 2
[Python] Obtenez des données économiques avec DataReader
Obtenez le chemin du script en Python
Exécutez Python selon la planification sur AWS Lambda
Comment obtenir la version Python
Remarque sur boto3 (AWS SDK for Python)
[Petite histoire] Obtenez l'horodatage avec Python
Obtenir, publier un mémo de communication en Python
Script de création de couche AWS pour python
Obtenez les tendances Qiita avec le scraping Python
Obtenez le chemin du bureau en Python
Notifier HipChat avec AWS Lambda (Python)
Obtenez le nom d'hôte en Python
Remarque Python: obtenez le mois en cours
Version Python pour obtenir les ports inutilisés
Démarrez avec Python avec Blender
Obtenez des informations météorologiques avec Python et le grattage
[AWS SAM] Présentation de la version Python
[Cloud102] # 1 Commençons avec Python (Partie 2 Jupyter Notebook Construction AWS Edition)
J'obtiens une erreur Python No module nommée'encodings 'avec la commande aws