本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
Azure Cost Management API活用術
Azure Cost Management APIは、Azureリソースのコストデータをプログラムで取得、分析、管理するための強力なツール群です。このAPIを活用することで、カスタムレポートの作成、コスト最適化の自動化、既存の財務システムとの連携など、高度なコストガバナンスを実現できます。
アーキテクチャ
Azure Cost Management APIを活用した典型的なアーキテクチャは、以下の要素で構成されます。
flowchart LR
subgraph mermaid_group_1["データソース"]
A["Azure Cost Management API"]
B("Cost Management Exports")
end
subgraph mermaid_group_6["認証・実行"]
C["Azure Entra ID"]
D("Azure Functions/Logic Apps")
end
subgraph mermaid_group_11["データストア・分析"]
E["Azure Storage Account"]
F("Azure Data Explorer/SQL Database")
end
subgraph mermaid_group_16["可視化・通知"]
G["Power BI/Azure Monitor"]
H("Azure Monitor Alerts")
end
A -->|"コストデータ取得"| D
C -->|"認証・認可"| D
B -->|"定期的な大容量エクスポート"| E
D -->|"データ処理・保存"| E
E -->|"データロード"| F
F -->|"クエリ・可視化"| G
G -->|"しきい値超過通知"| H
D -->|"コスト最適化アクション"| I("Azure Automation/Runbooks")解説:
Azure Cost Management API: 主にUsage Details、Forecast、Budgets、ReservationsなどのREST APIを通じてコストデータを提供します。
Cost Management Exports: 大量のコストデータを定期的にAzure Storage Accountに自動エクスポートする機能。APIのレート制限やデータ量によるパフォーマンス課題を回避する際に有効です。
Azure Entra ID: APIへの認証と認可を管理します。サービスプリンシパルまたはマネージドIDを使用して、最小権限の原則に基づいたアクセス制御を行います。
Azure Functions/Logic Apps: APIの呼び出しやエクスポートデータの処理を定期的に実行するサーバーレスコンピューティングサービスです。スケジュールに基づいた自動実行や、他のサービスとの連携を容易にします。
Azure Storage Account: Cost Management Exportsの出力先や、APIで取得した中間データの保存先として利用されます。
Azure Data Explorer/SQL Database: 収集したコストデータを格納し、高速なクエリや複雑な分析を行うためのデータウェアハウスまたはリレーショナルデータベースです。
Power BI/Azure Monitor: 分析結果を視覚化し、カスタムダッシュボードやレポートを作成します。Azure Monitorはログの収集と監視にも利用されます。
Azure Monitor Alerts: 定義された閾値(例: コスト超過)に基づいてアラートを発報し、担当者に通知します。
Azure Automation/Runbooks: コスト分析結果に基づき、自動的なリソース停止、スケールダウン、予約購入の推奨など、具体的な最適化アクションを実行します。
設定手順
ここでは、Azure Entra IDのサービスプリンシパルを作成し、必要な権限を付与した上で、Cost Management APIを呼び出す基本的な手順をPowershellで示します。
1. サービスプリンシパルの作成と権限付与
Azure Cost Management APIにアクセスするためのサービスプリンシパルを作成し、「閲覧者」または「Cost Management 閲覧者」ロールを付与します。
# サービスプリンシパルの作成 $spName = "AzureCostManagementApiSP" $sp = New-AzADServicePrincipal -DisplayName $spName # アプリケーションIDとテナントIDの取得 $appId = $sp.ApplicationId $tenantId = (Get-AzContext).Tenant.Id Write-Host "Service Principal Application ID: $appId" Write-Host "Tenant ID: $tenantId" # サービスプリンシパルに「Cost Management 閲覧者」ロールを付与 # スコープはサブスクリプション全体に設定 (必要に応じてリソースグループに限定) $subscriptionId = (Get-AzContext).Subscription.Id New-AzRoleAssignment -ObjectId $sp.Id -RoleDefinitionName "Cost Management Reader" -Scope "/subscriptions/$subscriptionId" Write-Host "Service Principal '$spName' created and 'Cost Management Reader' role assigned to subscription '$subscriptionId'."
前提: Azure PowerShellモジュールがインストールされ、Connect-AzAccount でAzureにログイン済みであること。
計算量: O(1)
メモリ条件: 低
2. Cost Management APIの呼び出し例
作成したサービスプリンシパルを使用して、Usage Details APIからコストデータを取得する例です。
# 認証情報 (上記で取得した $appId と $tenantId を使用)
$applicationId = "YOUR_SERVICE_PRINCIPAL_APP_ID" # 例: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
$tenantId = "YOUR_TENANT_ID" # 例: yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
$clientSecret = "YOUR_SERVICE_PRINCIPAL_SECRET" # サービスプリンシパル作成時に生成したシークレット(例ではNew-AzADServicePrincipalで自動生成されるが、本番ではNew-AzADAppCredentialでシークレットを別途作成し安全に管理)
# 認証トークンの取得
$body = @{
client_id = $applicationId
grant_type = "client_credentials"
scope = "https://management.azure.com/.default"
client_secret = $clientSecret
}
$tokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" -Method Post -Body $body -ContentType "application/x-www-form-urlencoded"
$accessToken = $tokenResponse.access_token
# APIエンドポイントとクエリ定義
$subscriptionId = (Get-AzContext).Subscription.Id # ターゲットのAzureサブスクリプションID
$apiUri = "https://management.azure.com/subscriptions/$subscriptionId/providers/Microsoft.Consumption/usageDetails?api-version=2021-10-01"
$headers = @{
"Authorization" = "Bearer $accessToken"
"Content-Type" = "application/json"
}
# 過去30日間のコストデータを取得するクエリ
# filterパラメータで期間を指定します。
# 2024年5月30日現在のデータ取得例
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")
$endDate = (Get-Date).ToString("yyyy-MM-dd")
$filter = "`$filter=properties/usageStart ge '$startDate' and properties/usageEnd le '$endDate'"
# API呼び出し
try {
$costData = Invoke-RestMethod -Uri "$apiUri&$filter" -Headers $headers -Method Get
Write-Host "Cost data retrieved successfully for subscription $subscriptionId."
$costData.value | Select-Object -First 5 properties.usageStart, properties.usageEnd, properties.resourceId, properties.pretaxCost, properties.currency
}
catch {
Write-Error "Failed to retrieve cost data: $($_.Exception.Message)"
}
前提: 上記で作成したサービスプリンシパルの $applicationId と $tenantId を設定。$clientSecret は安全な方法で取得・管理する(例: Azure Key Vault)。
計算量: API呼び出しのデータ量に依存。Select-Object -First 5 は表示のみの制限。
メモリ条件: 取得データ量に依存。大規模なデータの場合、ページネーション処理が必要。
運用監視
運用監視は、APIベースのコスト管理ソリューションの健全性と効率性を保つ上で不可欠です。
可観測性: Azure FunctionsやLogic Appsの実行ログをAzure Monitor Logsに収集し、成功/失敗、実行時間、API応答時間などを監視します。Application Insightsを統合することで、より詳細なテレメトリーデータを取得できます。
ログ: Cost Management APIからの応答や、データ処理中のエラーは、Azure Storage AccountやAzure Monitor Logsに記録します。これにより、問題発生時の原因究明が容易になります。
SLA: Azure FunctionsやLogic AppsのSLAはMicrosoftにより提供されています。APIの呼び出しに失敗した場合の再試行ロジックを実装し、データ取得の信頼性を高めます。
バックアップ/DR: Cost Management Exports機能でAzure Storageに定期的にエクスポートされるコストデータは、Storage Accountのレプリケーション機能(GRS/ZRS)を活用してバックアップと災害復旧(DR)戦略を確立します。APIで取得した独自の中間データも同様に管理します。
セキュリティ
アイデンティティと権限境界:
Entra ID: Azure Cost Management APIへのアクセスは、Azure Entra IDのサービスプリンシパルまたはマネージドIDを通じて行います。共有アカウントやユーザー認証情報の使用は避けるべきです。
ロールベースのアクセス制御 (RBAC): サービスプリンシパルには、
Cost Management Readerロールなど、最小限の権限のみを付与します。サブスクリプション全体ではなく、必要なリソースグループや管理グループにスコープを限定することで、権限の境界を明確にします。条件付きアクセス (CA): Entra IDの条件付きアクセスポリシーを適用することで、APIを呼び出すアプリケーションや環境に特定のセキュリティ要件(例: 特定のIPアドレス範囲からのアクセス、多要素認証の必須化)を課すことができます。
シークレット管理: サービスプリンシパルのクライアントシークレットは、Azure Key Vaultに安全に格納し、定期的にローテーションします。マネージドIDは資格情報管理が不要なため、推奨される認証方法です。
Azure Defender for Cloud: APIを呼び出すリソース(Azure Functionsなど)に対してAzure Defender for Cloudを有効にし、潜在的な脅威や脆弱性を検出・対応します。
コスト
Azure Cost Management APIの利用自体に直接的な費用は発生しませんが、APIを呼び出し、データを処理・保存するサービスにはコストが発生します。
Azure Functions/Logic Apps:
Functions消費プラン: APIの呼び出し回数や実行時間に応じて課金されるため、コストを抑えやすいです。
Logic Apps標準プラン: ステートフルなワークフローや大量の統合が必要な場合に適していますが、従量課金よりも高くなる可能性があります。
Azure Storage Account: エクスポートされたコストデータや中間データを格納する際に発生します。アクセス頻度に応じて適切なストレージ層(ホット、クール、アーカイブ)を選択し、コストを最適化します。
コスト最適化の具体的な活用:
リザーブドインスタンス (RI) / Azure Savings Plan: APIを通じて既存のRIやSavings Planの利用率を監視し、低利用率のRIやSavings Planを特定。さらに、将来のコミットメントが必要な場合にRIやSavings Planの購入を推奨するロジックを自動化できます。これにより、コミットメントベースの割引を最大化します。
リソーススケジューリング: APIで取得したリソースの利用状況データに基づき、営業時間外に利用されていないVMやDBなどを自動的に停止/スケールダウンするAzure Automation Runbookをトリガーします。
不要リソースの特定と削除: Cost Management APIから取得した詳細な使用状況データを用いて、数週間以上利用されていないディスク、IPアドレス、VMなどのリソースを特定し、その削除を推奨または自動化することで無駄なコストを削減します。
落とし穴
APIレート制限: 大量のデータを短期間に頻繁に要求すると、APIのレート制限に引っかかる可能性があります。特に履歴データの一括取得には、Cost Management Exportsの利用が推奨されます。
データ量とパフォーマンス: APIから直接取得できるデータ量には上限があります。月次で数GBを超えるような大規模なコストデータは、APIよりもエクスポート機能を利用し、Azure Storageから取得する方が効率的です。
データモデルの理解: Cost Management APIは複雑なデータモデルを持ちます。
Usage Details、Pricesheets、Reservationsなど、各APIが提供するデータの内容と構造を正確に理解しておく必要があります。認証情報の安全な管理: サービスプリンシパルのクライアントシークレットをコード内にハードコーディングしたり、安全でない場所に保存したりすることは避け、Azure Key Vaultのような専用のサービスを使用します。
データの一貫性: 過去の請求データは、割引適用や払い戻しなどにより修正されることがあります。APIから取得したデータが常に最新であることを確認し、必要に応じてデータ更新の頻度を調整する必要があります。
日付とタイムゾーン: APIはUTCで日付を扱うことが多いため、JST(日本標準時)への変換や、期間指定の際はタイムゾーンを意識した処理が必要です。
まとめ
Azure Cost Management APIは、Azureのコストを効率的に管理し、最適化するための強力な基盤を提供します。アーキテクチャの設計では、APIのレート制限やデータ量を考慮し、必要に応じてCost Management Exportsを併用することが重要です。Entra IDによる厳格なアクセス制御、最小権限の原則、およびKey Vaultによるシークレット管理はセキュリティの要です。また、Azure FunctionsやLogic Appsを活用した自動化、Azure Monitorによる運用監視は、安定したコスト管理システムを構築するために不可欠です。これらの活用術を適切に組み合わせることで、組織のクラウドコストガバナンスを次のレベルへと引き上げることが可能になります。

