🚀

【python】-Azureのコストをpythonで取得する

2024/08/24に公開

やること

pythonを使ってAzureのコストを取得する方法を紹介します。

手順

  1. サービスプリンシパルの作成
  2. コード実行

前提

  • python 3.11.9

サービスプリンシパルの作成

  1. 以下を参考にサービスプリンシパルを作成する

https://zenn.dev/headwaters/articles/e82aca7bec3579

  1. Azure Subscriptionを開く
  2. 「サブスクリプション」>「アクセス制御(IAM)」>「ロールの割り当て」で「追加」をクリックし、「コスト管理の共同作成者」ロールを選択し、サービスプリンシパルを割り当てます。

https://learn.microsoft.com/ja-jp/azure/cost-management-billing/costs/understand-work-scopes#azure-rbac-scopes

コード実行

  1. 以下を実行し、ライブラリーをinstallする
pip install azure-mgmt-costmanagement azure-identity
  1. 以下のコードを実行し、過去1か月のコストを出力する
main.py
import os  
from azure.identity import DefaultAzureCredential  
from azure.mgmt.costmanagement import CostManagementClient  
from datetime import datetime, timedelta  
  
# 環境変数を設定(実際の値を置き換えてください)  
os.environ["AZURE_CLIENT_ID"] = "your-client-id"  
os.environ["AZURE_TENANT_ID"] = "your-tenant-id"  
os.environ["AZURE_CLIENT_SECRET"] = "your-client-secret"  
os.environ["AZURE_SUBSCRIPTION_ID"] = "your-subscription-id"  
  
# 環境変数からサブスクリプションIDを取得  
subscription_id = os.getenv("AZURE_SUBSCRIPTION_ID")  
  
# 認証情報の設定  
credential = DefaultAzureCredential()  
  
# Cost Management クライアントの作成  
client = CostManagementClient(credential)  
  
# 今日の日付を取得  
end_date = datetime.today().date()  
# 1ヶ月前の日付を取得  
start_date = end_date - timedelta(days=30)  
  
# コスト管理のクエリを設定  
query = {  
    "type": "ActualCost",  
    "timeframe": "Custom",  
    "timePeriod": {  
        "from": start_date.strftime("%Y-%m-%dT%H:%M:%SZ"),  
        "to": end_date.strftime("%Y-%m-%dT%H:%M:%SZ"),  
    },  
    "dataset": {  
        "granularity": "Daily",  
        "aggregation": {"totalCost": {"name": "PreTaxCost", "function": "Sum"}},  
    },  
}  
  
# コスト情報を取得  
response = client.query.usage(scope=f"/subscriptions/{subscription_id}", parameters=query)  
  
# 結果を表示  
for item in response.rows:  
    cost = item[0]  
    date = item[1]  
    print(f"Date: {date}, Cost: {cost}")  

main.py
import os
from azure.identity import DefaultAzureCredential
from azure.mgmt.costmanagement import CostManagementClient
from datetime import datetime, timedelta
import time

# 環境変数を設定(実際の値を置き換えてください)  
os.environ["AZURE_CLIENT_ID"] = "your-client-id"  
os.environ["AZURE_TENANT_ID"] = "your-tenant-id"  
os.environ["AZURE_CLIENT_SECRET"] = "your-client-secret"  
os.environ["AZURE_SUBSCRIPTION_ID"] = "your-subscription-id"  
  
# 環境変数からサブスクリプションIDを取得  
subscription_id = os.getenv("AZURE_SUBSCRIPTION_ID")  

# 認証情報の設定
credential = DefaultAzureCredential()

# Cost Management クライアントの作成
client = CostManagementClient(credential)

# 今日の日付を取得
end_date = datetime.today().date()
# 1ヶ月前の日付を取得
start_date = end_date - timedelta(days=30)

# コスト管理のクエリを設定
query = {
    "type": "ActualCost",
    "timeframe": "Custom",
    "timePeriod": {
        "from": start_date.strftime("%Y-%m-%dT%H:%M:%SZ"),
        "to": end_date.strftime("%Y-%m-%dT%H:%M:%SZ"),
    },
    "dataset": {
        "granularity": "Daily",
        "aggregation": {"totalCost": {"name": "PreTaxCost", "function": "Sum"}},
    },
}

# リトライロジックの実装
max_retries = 3 # retry回数を設定
retry_interval = 5  # 待機時間を設定

for attempt in range(max_retries):
    try:
        # コスト情報を取得
        response = client.query.usage(
            scope=f"/subscriptions/{subscription_id}", parameters=query
        )
        # 結果を表示
        for item in response.rows:
            cost = item[0]
            date = item[1]
            print(f"Date: {date}, Cost: {cost}")
        break  # 成功したらループを抜ける
    except Exception as e:
        print(f"Attempt {attempt + 1} failed: {e}")
        if attempt < max_retries - 1:
            print(f"Retrying in {retry_interval} seconds...")
            time.sleep(retry_interval)
        else:
            print("Max retries reached. Exiting.")
            raise

  1. 以下のように出力されることを確認する
ヘッドウォータース

Discussion