製品コラム

セイテクエンジニアのブログ  製品コラム  Azure(従量課金制)の使用コスト監視-BOM for Windows活用例

 

 

Azure(従量課金制)の使用コスト監視-BOM for Windows活用例

2024年12月06日配信
2025年04月25日更新
執筆者:セイ・テクノロジーズ エバンジェリスト

 「BOM for Windows Ver.8.0 SR1」(以下、BOM)の「カスタム監視」を使用すると、ローカルのサーバー監視を超えて、クラウド上のリソースを監視することもできます。今回は、従量課金制でAzureを利用している場合(Visual Studioサブスクリプションを含む)に、最も気になるであろう、Azureの使用コストを監視する方法を紹介します。

 

Azure REST APIを使用して課金情報を取得する

 

 「かつて山市良と呼ばれたおじさんのブログ」の以下の回では、Azure REST APIを使用して、Azureの各種リソースの情報を取得する方法が紹介されています。Azure REST APIを使用するメリットは、「サービスプリンシパル」による「非対話型認証」が可能であること、そしてAzure PowerShellやAzure CLIといったクライアント側コンポーネントなしで、PowerShellやcurlから直接的に情報を取得できることです。

Azure&Entra IDスクリプト大作戦(3)|かつて山市良と呼ばれたおじさんのブログ

 

 従量課金制(Pay as you go《PAYG》)のAuzreユーザーは、以下の「Consumption Usage Details API(UsageDetails API)」を使用して、使用コストを取得することができます。


従量課金制サブスクリプションのコスト詳細を取得する|Azure(Microsoft Learn)

 なお、上記ドキュメントで説明されているUsageDetails APIは、従量課金制のAzureユーザー、および一定のAzureクレジット枠が提供されるVisual Studioサブスクリプションでのみ利用できます。EA(Enterprise Agreement)およびMCA(Microsoft顧客契約)のAzureユーザーでは使用できないことに注意してください。これらの契約者は、「Generate Cost Details Report API」を使用する必要があります。今回紹介するUsageDetails APIは将来的に廃止が予定されており、その際にはGenerate Cost Details Report APIに統合されることになるようです。

Generate Cost Details Report API を使ってみよう|Japan Azure 課金 サブスクリプション サポート ブログ(Microsoft)

 以下のPowerShellスクリプト「get-azbillingcost.ps1」は、UsageDetails APIを使用してAzureの現在の請求期間のこれまでの使用コストを返すように作成されています。スクリプトの最初の5行で、請求期間の開始日、サービスプリンシパルのアプリケーション(クライアント)ID、クライアントシークレットの値、サブスクリプションID、テナントIDを定義しておくことで、現在の請求期間の開始日からスクリプト実行日時までの実際の使用コストを取得することができます。現在の請求期間の開始日(毎月同じ)は、Azureポータルの「サブスクリプション」ブレードの「概要」で確認することができます(画面1、画面2)。

[get-azbillingcost.ps1]プレーンテキストで表示

$bullingPeriodStartDay = "06" #請求期間の開始日(dd)
$clientid = "アプリケーション(クライアント)ID"
$clientsecret = "クライアントシークレットの値"
$subscriptionid = "サブスクリプションID"
$tenantid = "テナントID"

$resource = "https://management.azure.com/"
$tokenendpoint = "https://login.microsoftonline.com/$tenantid/oauth2/token"
$body = @{
    grant_type    = "client_credentials"
    resource      = $resource
    client_id     = $clientid
    client_secret = $clientsecret
}
$tokenresponse = Invoke-RestMethod -Method Post -Uri $tokenendpoint -Body $body -ContentType "application/x-www-form-urlencoded"
$accesstoken = $tokenresponse.access_token

$headers = @{
    'Authorization' = "Bearer $accesstoken"
    'Content-Type'  = 'application/json'
}

$bullingPeriodToday = (get-date -format "dd")
if ([int]$bullingPeriodToday -ge [int]$bullingPeriodStartDay) {
  $bullingPeriodCurrentStart = (Get-Date -format "yyyy-MM-$bullingPeriodStartDay")
  $bullingPeriod = (Get-Date((get-date).AddDays(30)) -format "yyyyMM")
} else {
  $bullingPeriodCurrentStart = (Get-Date((get-date).AddDays(30)) -format "yyyy-MM-$bullingPeriodStartDay")
  $bullingPeriod = (get-date -format "yyyyMM")
}
$dateEnd = Get-Date
$dateEnd = (Get-Date).ToString("s")
$dateStart = $bullingPeriodCurrentStart + "T00:00:00.0000000Z"

$requesturi = "https://management.azure.com/subscriptions/$subscriptionid/providers/Microsoft.Billing/billingPeriods/$bullingPeriod/providers/Microsoft.Consumption/usageDetails?api-version=2019-01-01&$filter=properties/usageStart ge '$dateStart' and properties/usageEnd le '$dateEnd'"

$ret = (Invoke-RestMethod -Uri $requesturi -Headers $headers -Method Get)
$usageCost = $ret.value.properties.pretaxCost|measure-object -Sum
$usageCost = [Math]::Round($usageCost.Sum)
Write-Output $usageCost

 

画面1

画面1 請求期間の開始日(dd)をサービスプリンシパルの情報とともにスクリプト内に記述する

 

画面2
画面2 スクリプトを実行すると、現在の請求期間の開始日からスクリプト実行日時までに使用されたコストが返ってくる

 

 サービスプリンシパルの作成方法や、アクセストークンの取得、Azure REST APIからの情報取得については詳しく説明しません。「かつて山市良と呼ばれていたおじさんのブログ」の記事を参考にしてください。このスクリプトでは、現在の日時を取得し、現在の請求期間開始日時スクリプト実行日時を取得し、それをフィルターとした次のようなGET要求URLを生成して、要求を送信します(現在の請求期間の開始日が2024-11-12の場合)。

https://management.azure.com/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/providers/Microsoft.Billing/billingPeriods/202412/providers/Microsoft.Consumption/usageDetails?api-version=2019-01-01&$filter=properties/usageStart ge '2024-11-12T00:00:00.0000000Z' and properties/usageEnd le '<スクリプト実行時の日時>'

 Invoke-RestMethodに返ってきたコスト合計計算前の情報は、「サブスクリプション」ブレードの「コスト管理|コスト分析」で、現在の請求期間を選択して「Download」をクリックして取得したCSVやExcelデータと同じものです(予測値を除く)。つまり、Invoke-RestMethodで取得した「pretaxCost」の合計値、ダウンロードしたデータの「Cost」列の合計値、Azureポータルの「実際のコスト」は同じになります(画面3)。PowerShellスクリプト「get-azbillingcost.ps1」では、「pretaxCost」の合計値を計算し、四捨五入して整数値を返します。

 

画面3
画面3 Azureポータル、およびAzureポータルからダウンロードしたデータと同じ使用コストの情報を、Azure REST APIで取得している

 

BOMにカスタム監視を作成する

 

 このPowerShellスクリプト「get-azbillingcost.ps1」を、BOMがインストールされているサーバーの任意の場所にコピーし、「powershell.exe」の引数として実行する「カスタム監視」を作成して定期的に実行するようにすれば、使用コストが極端に増加した場合に注意や警告を発生させることができます(画面4、画面5)。注意や警告のしきい値は、利用環境に合わせて調整してください。例えば、Visual Studioサブスクリプションの場合は、毎月の無料クレジット枠(22,500円)の5割を超えたら注意、8割を超えたら警告などです。

 なお、使用コストは数百以上の詳細データの合計であるため、実行には時間がかかります。タイムアウトしないように、「カスタム監視」プロパティの「拡張設定」タブにある「タイムアウト時間」を調整してください。また、画面ではテストのために60分ごとに実行させていますが、半日ごと、あるいは1日ごとの実行で監視には十分でしょう。

 

画面4
画面4 PowerShellスクリプト「get-azbillingcost.ps1」を定期的に実行するカスタム監視を作成する

 

画面5
画面5 BOMで監視することで、Azureポータルを毎日確認しなくても、使用コストの急激な増加を見逃すことがない

blog_column_subscribe

blog_column_comment

最新記事