はじめに
Azure社内検証環境の利用料金が結構な金額になってしまっているのに気づきました。
リソースを作り直す手間を考えるとついつい放置してしまいますが、リソースを作り直す時間コストと利用料金を比較すれば、一旦削除した方が安く済む可能性もあります。
Azure Portalの「コスト管理」から詳細なコストの内訳が確認できますが、当月の利用料金を把握したいだけの場合、度々Azure Portalにログインするのは面倒です。
今回、RunbookとLogic Appsの勉強も兼ねて、リソースグループ単位のAzureコストをTeamsで自動通知できる仕組みを作ってみました。
以下の画像のような出力を目指します。
本稿では前編としてRunbookについて記載します。
処理の概要
- Runbook(PowerShell)を実行し、リソースグループ単位の利用料金を取得します。
- HTTPリクエストにより、RunbookからLogic Appsに利用料金を送信します。
- Logic AppsでTeamsのコネクタを使用し、利用料金をTeamsのチャットに送信します。
Runbookの作成
Automationアカウントの作成
まずはAutomationアカウントを作成します。
パラメータはほぼ既定値としたので、手順は省略します。
以下は備考です。
・認証のためにシステム割り当てのマネージドIDを設定しました。
・マネージドIDには共同作成者ロールを付与しました。
Runbookの作成
作成したAutomationアカウントに、以下のRunbookを作成します。
Runbookの種類 | PowerShell |
ランタイムバージョン | 5.1 |
スケジュールの設定
平日の朝9時にスケジュールを設定します。
変数の設定
Automationアカウントの[変数]にて、以下の変数を追加します。
LogicAppsUri | Logic AppsのURIです。RunbookからHTTPリクエストを送信する際に使用します。 (URIの確認方法は後編に記載します) |
ResourceGroupName | Azure利用料金を取得する対象のリソースグループ名です。 |
SubscriptionID | 対象のリソースグループが存在するサブスクリプションのIDです。 |
Runbookで実行する処理
以下の処理を実行します。
パラメータ設定
Get-AutomationVariableコマンドを使用してAutomationアカウントに設定した変数を読み込みます。
$SubscriptionID = Get-AutomationVariable -Name "SubscriptionID"
$RGName = Get-AutomationVariable -Name "ResourceGroupName"
$LogicAppsUrl = Get-AutomationVariable -Name "LogicAppsUrl"
Azureログイン
マネージドIDの資格情報を使用してAzureにログインし、サブスクリプションを選択します。
Connect-AzAccount -Identity
Set-AzContext -SubscriptionId $SubscriptionID
Azure利用料金取得
1行目でリソースグループの利用情報を取得します。
2行目で利用情報から月次の利用料金のみを抽出し、合計を計算した後、小数点以下を四捨五入します。
$UsageDetail = Get-AzConsumptionUsageDetail -ResourceGroup $RGName
$Cost = [Math]::Round($($UsageDetail.PretaxCost | Measure -Sum).Sum, [MidpointRounding]::AwayFromZero).ToString("#,#")
HTTP要求の送信
JSON形式の変数にリソースグループ名と利用料金を格納した後、Logic AppsのURIにHTTPリクエストを送信します。
$Body = @{
resourcegroup = $RGName
cost = $Cost
}
Invoke-RestMethod -Uri $LogicAppsUrl -Body $Body
おわりに
RunbookからLogic AppsにAzure利用料金を送信できるようになりました。
後編では、Logic AppsでTeamsに通知するワークフローを作成します。