ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

Azure コスト可視化の実践ガイド(Cost Management Query API × Python、Azure OpenAI 例あり)

Azure のコスト状況を継続的に把握し、異常検知や最適化につなげることは、運用コストの低減に直結します。Azure Cost Management のポータル機能で可視化するだけでなく、API 連携によって既存の監視基盤や社内ダッシュボード(Power BI、Grafana、社内ポータルなど)にコスト指標を統合すれば、より柔軟で実務的な運用が可能になります。

本記事では、Azure Cost Management の概要に触れたうえで、Cost Management Query API(Azure Resource Manager)を Python から呼び出し、Azure OpenAI(例:GPT-4.1)に関連するコストを取得・可視化する方法をご紹介します。

ライター:庄谷 信哉
2005年にネットワンシステムズに入社し、スイッチ製品の新旧技術の調査・検証業務を元にネットワーク提案、導入を支援する業務、クラウド関連、自動化推進(Ansible)を経て、最近はAIを活用した業務改善活動に従事している。

目次

はじめに

Azure のコスト状況を継続的に把握し、異常検知や最適化につなげることは、運用コストの低減に直結します。Azure Cost Management のポータル機能で可視化するだけでなく、API 連携によって既存の監視基盤や社内ダッシュボード(Power BI、Grafana、社内ポータルなど)にコスト指標を統合すれば、より柔軟で実務的な運用が可能になります。

本記事では、Azure Cost Management の概要に触れたうえで、Cost Management Query API(Azure Resource Manager)を Python から呼び出し、Azure OpenAI(例:GPT-4.1)に関連するコストを取得・可視化する方法を紹介します。

1. Azure ポータルでの公式機能(Cost Management)による可視化

Azure ポータルのコスト分析では、サービス名、リソースグループ、タグ、メーターなどでの集計・可視化が可能です。まずはポータル上で、集計粒度、ディメンション、フィルターの当たりを付けておくと、API 化の要件定義がスムーズになります。

参考:
クイック スタート - コスト分析の使用を開始する - Microsoft Cost Management | Microsoft Learn

2. 外部ツールでのコスト可視化(API 連携)の利点

Cost Management Query API を使うと、プログラムからコストデータを取得し、任意の可視化やデータ連携が可能です。

代表的な利用例
・ 日次・時間帯別のコスト推移を既存の監視ダッシュボードへ統合
・ タグ(Project、Environment など)による部門/案件別の配賦
・ 異常検知(前日比・曜日比・移動平均からの乖離)と通知
・ Power BI、Grafana、社内 BI ツール等へのデータ連携

3. API連携での前提・準備(認証と権限)

API連携を実施するため、Azure Portal 上で以下を準備します。

【準備事項】

  1. アプリ登録とサービス プリンシパルの作成(Microsoft Entra ID)
  2. 認証情報の準備
    クライアント ID、テナント ID、クライアント シークレット
    (本番はマネージド ID、証明書、フェデレーション資格情報の利用を推奨)
  3. RBAC(最小権限)
    集計対象スコープ
    (管理グループ/サブスクリプション/リソース グループなど)に、Cost Management Reader(コスト管理閲覧者)を付与
    集計したいスコープに応じて API のスコープ URL が変わります。
    (サブスクリプション単位):
    https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.CostManagement/query?api-version=…

また、準備する上では、セキュリティのベストプラクティスとして以下を考慮する必要があります。

  • 本番環境では、クライアント シークレットの使用は避け、代わりに マネージド ID、証明書、フェデレーション資格情報 など、より安全な認証方式の利用が推奨されます。
  • ただし、業務要件などによりクライアント シークレットを使用する場合は、Azure Key Vault による厳格な管理が必須です。アクセス制御や監査ログの活用により、セキュリティリスクを最小限に抑えることができます。
  • また、最小権限の原則を徹底し、アクセス権限は必要最小限の範囲に限定することが重要です。

4. API のスコープとクエリ設計のポイント

コスト分析を行う上で、APIにて取得するスコープ(集計対象)は URL で表現します。
例:https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.CostManagement/query?api-version=...

また、クエリ ボディは、以下のパラメータで設定を実施します。
 ・type:
  ActualCost または AmortizedCost(償却コスト)。
  用途に応じて選択
 ・timeframe:
  BillingMonthToDate、MonthToDate、Custom など
 ・timePeriod:
  timeframe が Custom の場合に UTC で from/to を指定
 ・dataset:
  - granularity:
   Daily / Monthly / None
  - aggregation:
   例)Cost の合計(Sum)
  - grouping:
   ディメンションでグルーピング(上限あり)
  - filter:
   dimensions/tags を and/or で組み合わせて絞り込み

注意点

  • ディメンション名は API 仕様の表記に合わせる必要があります
    (例: ResourceGroupName、ServiceName、Product、Meter など)
    Portal の表示名と API の内部名が異なる場合があるため、後述のドキュメントで確認してください。
  • Azure OpenAI のメーターや製品名は、SKU やリージョン、世代(例: GPT-4.1)により名称が変わることがあります。実際の環境に合わせて値を確認のうえ修正してください。

5. Python サンプル(Cost Management Query API)

以下に、外部からPythonで実施するCost Management Query APIのサンプルコードを記載します。

依存関係
- pip install msal requests

サンプルコードと出力結果例(サブスクリプション スコープ、Azure OpenAI 例)

  • クライアント資格情報フロー(MSAL)でトークンを取得
  • API バージョンはドキュメントの最新を確認してください
    (今回は、例として 2025-03-01 を使用)
    下記ページのCost Management ⇒Reference⇒Resource Manager⇒Query⇒OverviewのAPI Versionより確認可能です。
    (2025/09/03地点)
    Microsoft Cost Management REST APIs | Microsoft Learn
  • 結果の行列は columns と rows に格納される
    columns: 各列の name と type
    rows: データ本体(列順は columns に対応)
  • サンプルコードと出力例ともに固有情報はxxxxx等でマスキングしております。

import os
import json
import requests
from msal import ConfidentialClientApplication

# 検証環境のため環境変数で設定
# (本番は Key Vault 等で安全に管理)
os.environ["AZURE_TENANT_ID"] = 'your_tenant_id'
os.environ["AZURE_CLIENT_ID"] = 'your_client_id'
os.environ["AZURE_CLIENT_SECRET"] = 'your_client_secret'
os.environ["AZURE_SUBSCRIPTION_ID"] = 'your_subscription_id'

TENANT_ID = os.environ.get("AZURE_TENANT_ID")
CLIENT_ID = os.environ.get("AZURE_CLIENT_ID")
CLIENT_SECRET = os.environ.get("AZURE_CLIENT_SECRET")
SUBSCRIPTION_ID = os.environ.get("AZURE_SUBSCRIPTION_ID")

# MSAL によるトークン取得
AUTHORITY = f"https://login.microsoftonline.com/{TENANT_ID}"
SCOPE = ["https://management.azure.com/.default"]

app = ConfidentialClientApplication(
  client_id=CLIENT_ID,
  client_credential=CLIENT_SECRET,
  authority=AUTHORITY
)
token_result = app.acquire_token_for_client(scopes=SCOPE)
if "access_token" not in token_result:
  raise RuntimeError(f"トークン取得に失敗しました: {token_result}")

access_token = token_result["access_token"]

# Cost Management Query API エンドポイント
# API バージョンは最新のドキュメントを確認して更新(例: 2025-03-01
API_VERSION = "2025-03-01"
api_url = (
  f"https://management.azure.com/subscriptions/{SUBSCRIPTION_ID}"
  f"/providers/Microsoft.CostManagement/query?api-version={API_VERSION}"
)

headers = {
  "Authorization": f"Bearer {access_token}",
  "Content-Type": "application/json"
}

# クエリボディ(例: 2025-06-20 の 1 日分、日次粒度、メーター別)
# ResourceGroupName など、ディメンション名は API の内部名に合わせる
query_body = {
  "type": "ActualCost",
  "timeframe": "Custom",
  "timePeriod": {
    "from": "2025-06-20T00:00:00Z",
    "to": "2025-06-20T23:59:59Z"
  },
  "dataset": {
    "granularity": "Daily",
    "grouping": [
      { "type": "Dimension", "name": "Meter" }
    ],
    "aggregation": {
      "totalCost": { "name": "Cost", "function": "Sum" }
    },
    "filter": {
      "and": [
        {
          "dimensions": {
            "name": "MeterCategory",
            "operator": "In",
            "values": ["Cognitive Services", "Azure AI Services"]
          }
        },
        {
          "dimensions": {
            "name": "ResourceGroupName",
            "operator": "In",
            "values": ["xxxxx"]
          }
        },
        {
          "dimensions": {
            "name": "Meter",
            "operator": "In",
            "values": [
              "gpt 4.1 Inp Data Zone Tokens",
              "gpt 4.1 Inp glbl Tokens",
              "gpt 4.1 Outp Data Zone Tokens",
              "gpt 4.1 Outp glbl Tokens",
              "gpt 4.1 cached Inp glbl Tokens"
            ]
          }
        }
      ]
    }
  }
}

参考:認証を実施するコードで参照したURL
Web API を呼び出すデーモン アプリを構成する方法 - Microsoft identity platform | Microsoft Learn

デーモン アプリケーションを使用して Web API を呼び出すためのトークンを取得する - Microsoft identity platform | Microsoft Learn


以下は、上記コードを実施時の出力例となります。

{
 "id": "subscriptions/xxxxx/providers/Microsoft.CostManagement/query/xxxxx",
 "name": "xxxx",
 "type": "Microsoft.CostManagement/query",
 "location": null,
 "sku": null,
 "eTag": null,
 "properties": {
  "nextLink": null,
  "columns": [
   {
    "name": "Cost",
    "type": "Number"
   },
   {
    "name": "UsageDate",
    "type": "Number"
   },
   {
    "name": "Meter",
    "type": "String"
   },
   {
    "name": "Currency",
    "type": "String"
   }
  ],
  "rows": [
   [
    xxxxx,
    20250620,
    "gpt 4.1 Inp glbl Tokens",
    "JPY"
   ],
   [
    xxxxx,
    20250620,
    "gpt 4.1 Outp glbl Tokens",
    "JPY"
   ],
   [
    xxxxx,
    20250620,
    "gpt 4.1 cached Inp glbl Tokens",
    "JPY"
   ]
  ]
 }
}

6. クエリのバリエーション

以下は、参考として、クエリのバリエーション例を紹介致します。

  • granularity(粒度)変更
    - granularity を "Monthly" にして月次推移を取得
  • dimensions(ディメンション)の切り替え
    - ResourceGroupName / ResourceId / ServiceName / ResourceType / Product などで集計
  • タグによる配賦
    - filter 内で tags を使用した条件指定、または grouping にタグを指定
    - 例)tags: {"name": "Project", "operator": "In", "values": ["Alpha"]}
  • 期間指定の簡略化
    - timeframe を "BillingMonthToDate" などにして、請求期間の月初〜当日を簡易指定

7. 検証と参考リンク

外部からAPIを実施する上で、まずはポータルのコスト分析で期待する集計が得られるかを確認し、ディメンション名・粒度・フィルターの当たりをつけてから API 化するのが効率的です。REST API ドキュメントの「Try It」では、ディメンション名と戻りデータ形式を確認できます。
 Query - Usage - REST API (Azure Cost Management) | Microsoft Learn

補足
 ・dimensions(ディメンション)名(例: ResourceGroupName と ResourceGroup)
  は似ていますが、API が受け付けるのは前者です。
  Try It で必ず名称を確認してください。
 ・Azure OpenAI のメーター名、製品名は更新されることがあるため
  最新の名称を確認のうえ値を調整してください。
 ・API バージョンはドキュメントで最新を確認して使用してください
  (本記事の例は 2025-03-01)。

まとめ

Cost Management Query API を利用すれば、外部ツールや既存の運用基盤にコスト情報を柔軟に連携でき、Azure OpenAI など特定サービスのコストトレンドも詳細に把握できます。
ここで紹介したクエリ例・コード例をベースに、組織のタグ設計やダッシュボード要件に合わせて拡張し、継続的な可視化とアラート設計を進めてみて頂ければと思います。今後も、他のデータ連携や可視化の実装例を紹介していきます。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND