🚀
【python】-Azureのコストをpythonで取得する
やること
pythonを使ってAzureのコストを取得する方法を紹介します。
手順
- サービスプリンシパルの作成
- コード実行
前提
- python 3.11.9
サービスプリンシパルの作成
- 以下を参考にサービスプリンシパルを作成する
- Azure Subscriptionを開く
- 「サブスクリプション」>「アクセス制御(IAM)」>「ロールの割り当て」で「追加」をクリックし、「コスト管理の共同作成者」ロールを選択し、サービスプリンシパルを割り当てます。
コード実行
- 以下を実行し、ライブラリーをinstallする
pip install azure-mgmt-costmanagement azure-identity
- 以下のコードを実行し、過去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
- 以下のように出力されることを確認する
Discussion