iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 9
1

影片版本 :


發現關於 Azure CLI 查詢、計算成本花費的網路中文文章好像沒有人寫,可能是2017年5月才推出的原因,所以筆者提供個人方式給讀者參考

關於成本花費情況,可以說是老闆最在乎的事情 (省錢應該,多花受罰,淚~)
Azure Portal 網頁版的成本分析功能其實已經做很好,能解大部分的需求,但有時需要客製或是準確定位意外花費情況,這時候可以使用 Azure CLI : az consumption usage ,其優點有 :

  1. 靈活動態查詢功能
  2. 能取得細部的資訊,精準定位浪費服務
  3. 可以取得 ID 值跟其他資料做 JOIN 關聯查詢

首先使用 az consumption usage -h 查看支援的功能,因為是preview 版本所以目前只支持 list 查詢功能。

sa@DESKTOP-WEI:~$ az consumption usage list - [tab][tab]
--billing-period-name            --query                          -h
--debug                          --query-examples                 -m
--end-date                       --start-date                     -o
--help                           --subscription                   -p
--include-additional-properties  --top                            -s
--include-meter-details          --verbose                        -t
--only-show-errors               -a
--output                         -e

這邊提供筆者會使用功能 :

  1. 支援JMESPath的 --query
  2. --subscription 查詢指定的訂閱
  3. --include-meter-details -m 可以顯示明細資料
  4. --start-date -s--end-date -e 篩選日期。

舉例 :

$ az consumption usage list

Azure 會返回JSON陣列 UsageDetail 資料

[
  {
    "accountName": null,
    "billableQuantity": "None",
    "billingPeriodId": "/subscriptions/c905f1a3-b790-47cb-98f5-eb7b89d7d768/providers/Microsoft.Billing/billingPeriods/202010",
    "consumedService": "Microsoft.Network",
    "costCenter": null,
    "currency": "USD",
    "departmentName": null,
    "id": "/subscriptions/c905f1a3-b790-47cb-98f5-eb7b89d7d768/providers/Microsoft.Billing/billingPeriods/202010/providers/Microsoft.Consumption/usageDetails/85b8a5ed-ccf7-1870-4ad2-dadd26be9f30",
    "instanceId": "/subscriptions/c905f1a3-b790-47cb-98f5-eb7b89d7d768/resourceGroups/demo/providers/Microsoft.Network/publicIPAddresses/demoVMPublicIP",
    "instanceLocation": "AP Southeast",
    "instanceName": "demoVMPublicIP",
    "invoiceId": null,
    "isEstimated": true,
    "meterId": "ae56b367-2708-4454-a3d9-2be7b2364ea1",
    "name": "85b8a5ed-ccf7-1870-4ad2-dadd26be9f30",
    "pretaxCost": "0",
    "product": "",
    "subscriptionGuid": "C905F1A3-B790-47CB-98F5-EB7B89D7D768",
    "subscriptionName": "Free Trial",
    "tags": null,
    "type": "Microsoft.Consumption/usageDetails",
    "usageEnd": "2020-09-30T23:59:59Z",
    "usageQuantity": "8.6966666666000005392334060161374509334564208984375",
    "usageStart": "2020-09-30T00:00:00Z"
  }
]

加上 -m 顯示,會多出 meterDetails 屬性,可以知道藉由 meterCategory 知道屬於哪種服務類型

  "meterDetails": {
    "meterCategory": "Virtual Network",
    "meterLocation": "AP Southeast",
    "meterName": "Dynamic Public IP - Free",
    "meterSubCategory": "IP Addresses",
    "pretaxStandardRate": "None",
    "serviceName": "Virtual Network",
    "serviceTier": "IP Addresses",
    "totalIncludedQuantity": "None",
    "unit": ""
  }

接著處理太多資料、屬性的問題,像是筆者測試到目前才幾天,已經有204項明細
所以需要使用 --query 挑選出我們所要的資料。

az consumption usage list --query "[] | length(@)"

image

例子1 : 列出明細和需要欄位 : 名稱、服務類型、稅前費用、日期

az consumption usage list -m --query "[0].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),date:usageStart}" 

image

例子2 : 查詢10/2當天花費最高的前5名資源
邏輯 :

  • 因為JMESPath只有sort_by正序沒有倒序,所以使用 sort_by()[-5:]取得正序倒數5筆資料模擬倒序功能
  • pretaxCost 預設是字串類型,需要使用to_number(@)轉型成數字
# 推薦使用 -s -e 篩選日期
az consumption usage list -m -s "2020-10-02" -e "2020-10-02" --query "sort_by([],&pretaxCost.to_number(@))[-5:].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart}" -o table

# 除非不行再使用 JMESPath 篩選日期
az consumption usage list -m --query "[?usageStart=='2020-10-02T00:00:00Z'] | sort_by([],&pretaxCost.to_number(@))[-5:].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart}" -o table

image

例子3 : 篩選 app service 的花費明細並按照日期消費金額排序

az consumption usage list -m --query "[?meterDetails.meterCategory == 'Azure App Service'].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart} | sort_by([],&pretaxCost.to_number(@))" -o table

image

例子4 : 篩選 app service 的花費總和

az consumption usage list -m --query "[?meterDetails.meterCategory == 'Azure App Service'].pretaxCost.to_number(@) | sum([]) "

image

例子5 : 總稅前花費成本

az consumption usage list -m --query "[].pretaxCost.to_number(@) | sum([])"

image

例子6 : 篩選掉 0 元花費資料
注意 : 要記得使用 "'" 否則系統會認不得返回以下錯誤訊息 :

ArgumentParseError: argument --query: invalid jmespath_type value: '[?pretaxCost.to_number(@) > ].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart} | sort_by([],&pretaxCost)'
az consumption usage list -m --query "[?pretaxCost.to_number(@) > \`0\`].{name:instanceName,ser:consumedService,cat:meterDetails.meterCategory,pretaxCost:pretaxCost.to_number(@),sDate:usageStart} | sort_by([],&pretaxCost)" -o table

注意 :
假如沒有指定 -s 跟 -e 日期,目前測試預設會過濾15 天以內資料
舉例 : 2020-10-08 查詢只會帶出 2020-09-20 ~ 2020-10-05 的資料


上一篇
Azure CLI + PowerShell + JMESPath 動態查詢 - 進一步強化靈活性
下一篇
Azure Docker - Container Registry (ACR) - 基本
系列文
深入 Azure 雲端服務30

尚未有邦友留言

立即登入留言