概要
Azure SDK for Python を利用して、接続しているテナントのサブスクリプション毎に、そのサブスクリプションにあるリソースグループ単位での使用料金を取得し、使用料金の高い順にソート表示するための Python プログラムです。
実行環境
macOS Big Sur 11.1
python 3.8.3
実行プログラム
GetSubscriptionCostManagement_2.py
import time
import argparse
from tabulate import tabulate
from azure.identity import AzureCliCredential
from azure.mgmt.resource import SubscriptionClient
from azure.mgmt.costmanagement import CostManagementClient
# 接続しているテナントのサブスクリプションを操作するオブジェクトを取得
def GetSubscriptionObject():
subscription_client = SubscriptionClient(
credential=AzureCliCredential()
)
return subscription_client
# CostManagement情報 を操作するオブジェクトを取得
def GetCostManagementObject():
costmgmt_client = CostManagementClient(
credential=AzureCliCredential()
)
return costmgmt_client
# 指定した Subscription について CostManagement からコストを取得
def GetCostManagement(costmgmt_client, subs_id):
# Query costmanagement
SCOPE = '/subscriptions/{}'.format(subs_id)
costmanagement = costmgmt_client.query.usage(
SCOPE,
{
"type": "Usage",
"timeframe": "MonthToDate",
"dataset": {
"granularity": "None",
"aggregation": {
"totalCost": {
"name": "PreTaxCost",
"function": "Sum"
}
},
"grouping": [
{
"type": "Dimension",
"name": "ResourceGroup"
}
]
}
}
)
return costmanagement
# サブスクリプションIDを指定しリソースグループ毎に CostManagement情報を取得
def GetSubscriptionCsotManagement():
# サブスクリプションを操作するオブジェクトの取得
subscription_list = GetSubscriptionObject()
# CostManagementを操作するオブジェクトの取得
costmgmt_client = GetCostManagementObject()
# サブスクリプション毎に CostManagement からコストを取得
for n, subs in enumerate(subscription_list.subscriptions.list()):
# print("\nサブスクリプション : {} {}\n".format(subs.subscription_id, subs.display_name))
print("\nサブスクリプション : {}\n".format(subs.display_name))
costmanagement = GetCostManagement(costmgmt_client, subs.subscription_id)
# rowsカラムデータを取得し、コストで降順ソートする
rows = sorted(costmanagement.rows, key=lambda x:x[0], reverse=True)
header = ['UsageCost', 'ResourceGroup', 'Currency']
print(tabulate(rows, headers=header))
# コストの合計値の取得
TotalCost = sum(cost[0] for cost in rows)
print("\n\t コスト合計:{0}".format(TotalCost) + " JPY \n")
print("\n サブスクリプション数:{0} \n".format(n+1))
costmgmt_client.close()
subscription_list.close()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Subscription / リソースグループ毎 のコスト取得')
args = parser.parse_args()
start = time.time()
GetSubscriptionCsotManagement()
generate_time = time.time() - start
print("\n 取得時間:{0}".format(generate_time) + " [sec] \n")
プログラムの実行
$ python GetSubscriptionCostManagement_2.py
サブスクリプション : iapp-01
UsageCost ResourceGroup Currency
----------- ---------------------------------------- ----------
4191.64 networldappazure JPY
0.749086 networldappazure-japaneastwebspace-linux JPY
0.357419 testrg JPY
0 yaya-cv-0803 JPY
コスト合計:4192.743525909148 JPY
:
かなり中略
:
サブスクリプション : NNN-01
UsageCost ResourceGroup Currency
----------- --------------------------------- ----------
6871.69 rg-netmotion JPY
1347.09 rg-jimjim JPY
17.8423 cloud-shell-storage-southeastasia JPY
コスト合計:8236.625178712422 JPY
サブスクリプション数:15
取得時間:100.4397029876709 [sec]
まとめ
Azure portal で確認するのもよいですが、プログラムでゴリゴリしたいときはこちらですね。