giip
SES 商機登記
7分鐘閱讀

Azure 成本儀表板指南

介紹如何查看依伺服器(LSSN)收集的 Azure 訂閱成本,依服務或資源群組細分,並了解預估月底成本。

🚀 前往 Azure 成本頁面 →

📋 概述

Azure 成本儀表板顯示與所選伺服器(LSSN)關聯的 Azure 訂閱的成本狀況。它讀取成本收集器定期收集並儲存至 KVS 的最新快照(kFactor=azure_cost),並透過表格與長條圖將成本依服務或資源群組的占比視覺化。當統計期間為當月累計(MonthToDate)時,還會依目前的日均值計算出預估月底成本。

🤖 AI/API 快速開始

本節協助 AI 代理或指令碼從外部直接查詢並分析與本頁面相同的伺服器計算結果。頁面與公開 API 使用同一個共用查詢服務(正本預存程序),因此數值一致。

1. 準備事項

  • CSN:專案編號(例如 47)。
  • LSSN:伺服器編號。若不清楚,可用下面的伺服器清單 API 查詢,它會同時回傳預設伺服器(default_lssn)。
  • API Key:核發的密鑰。僅保存在環境變數(GIIP_API_KEY)中。

2. 驗證安全警告 (x-api-key)

  • 僅透過 x-api-key 請求標頭進行驗證。切勿把密鑰放入 URL 查詢字串或請求主體(會外洩到記錄檔/代理)。
  • 下面的範例不硬編碼任何密鑰,僅使用環境變數 GIIP_CSN / GIIP_LSSN / GIIP_API_KEY。

3. 呼叫順序 (azureCostServers → azureCost)

  1. 呼叫 azureCostServers 取得該 CSN 的伺服器清單與預設伺服器(default_lssn)。
  2. 以所需的 lssn(或 default_lssn)呼叫 azureCost 取得費用明細。

4. Base URL / Method

APIMethodURL
伺服器清單GEThttps://giipfaw.azurewebsites.net/api/azureCostServers?csn={csn}
費用明細GEThttps://giipfaw.azurewebsites.net/api/azureCost?csn={csn}&lssn={lssn}

5. Query / Header

位置名稱必填說明
querycsn必填專案編號(整數)
querylssn僅 azureCost 必填伺服器編號(整數)
headerx-api-key必填核發的密鑰

6. 成功回應範例 + 欄位說明

共用信封:{ "rstVal": 200, "message": "OK", "data": { ... } }

azureCostServers 的 data:

{
  "csn": 47,
  "default_lssn": 71197,
  "servers": [
    { "lssn": 71197, "hostname": "example-host", "has_azure_cost_snapshot": true, "latest_collected_at": "2026-09-02T22:26:36" }
  ]
}

azureCost 的 data:

{
  "csn": 47,
  "lssn": 71197,
  "source": { "kfactor": "azure_cost", "snapshot_id": 44344061, "collected_at": "2026-09-02T22:26:36" },
  "subscription": { "subscription_id": "<your-subscription-id>", "subscription_name": "<your-subscription>" },
  "period": { "type": "MonthToDate", "start_date": "2026-09-01", "end_date": "2026-09-02", "currency": "KRW", "is_month_to_date": true },
  "totals": { "pretax_cost": 87993.34, "forecast_month_end": 1319900.03 },
  "by_service": [
    { "name": "Azure App Service", "pretax_cost": 38703.06, "ratio_percent": 43.98, "forecast_month_end": 580545.83 }
  ],
  "by_resource_group": [
    { "name": "rg-example-prod", "pretax_cost": 54988.80, "ratio_percent": 62.49, "forecast_month_end": 824832.00, "mapped_csn": null }
  ]
}

欄位說明:

  • totals.pretax_cost:該期間的稅前總額。totals.forecast_month_end:月底預測(見 8)。
  • by_service[] / by_resource_group[]:已由伺服器依費用由大到小排序。ratio_percent 是佔總額的比例(%),forecast_month_end 是該項的月底預測。
  • by_resource_group[].mapped_csn:見 9。

7. 錯誤表 (HTTP / rstVal)

HTTPrstValmessage 範例原因
400400csn and lssn are required numeric query parameters缺少必填參數或格式錯誤
401401Missing x-api-key header缺少或無效的密鑰
403403Access denied無該 CSN 的存取權限
404404No cost data for this server伺服器不屬於該 CSN,或近 30 天無快照
429429Too Many Requests呼叫過多導致限流(見 10)
500500(內部錯誤訊息)伺服器錯誤 — 稍後重試

8. 數值含意(稅前·貨幣·快照·collected_at·MonthToDate·預測)

  • 所有費用均為稅前(Pre-tax),貨幣為 period.currency。
  • 始終以最新的單筆快照為準(非即時)。採集時間為 source.collected_at。
  • 若 period.type 為 MonthToDate,則為本月 1 日至採集日的累計(is_month_to_date = true)。
  • forecast_month_end 僅在 MonthToDate 時計算。公式為 總額 × (當月總天數 ÷ 採集日),其他期間為 null。
  • 快照沒有原始的 period.start_date / end_date,因此依 collected_at 推導。

9. 依服務/依 RG 分析與 mapped_csn

  • by_service 是依 Azure 服務的費用,by_resource_group 是依資源群組的費用。
  • mapped_csn 是擁有(對應)該資源群組的 CSN,可能與請求的 CSN 不同(當該 RG 歸屬另一個專案時)。這是歸屬資訊而非隔離違規;未對應時為 null。

10. 429 重試

  • 為防止公開 API 被濫用,呼叫過多時可能回傳 429 Too Many Requests。若回應含 Retry-After 標頭(秒),等待相應時間後重試;否則使用指數退避(例如 1s → 2s → 4s)。

11. cURL 範例

# 僅使用環境變數,切勿把密鑰放入 URL/請求主體
export GIIP_CSN=47
export GIIP_LSSN=71197          # 不清楚時可省略,改用下面的 default_lssn
export GIIP_API_KEY=***your_key***

# 1) 伺服器清單 + 預設伺服器
curl -s "https://giipfaw.azurewebsites.net/api/azureCostServers?csn=${GIIP_CSN}" \
  -H "x-api-key: ${GIIP_API_KEY}"

# 2) 單伺服器費用明細
curl -s "https://giipfaw.azurewebsites.net/api/azureCost?csn=${GIIP_CSN}&lssn=${GIIP_LSSN}" \
  -H "x-api-key: ${GIIP_API_KEY}"

12. PowerShell 範例

$csn = $env:GIIP_CSN; $lssn = $env:GIIP_LSSN; $key = $env:GIIP_API_KEY
$h = @{ "x-api-key" = $key }
$base = "https://giipfaw.azurewebsites.net/api"

$servers = Invoke-RestMethod -Uri "$base/azureCostServers?csn=$csn" -Headers $h
$target = if ($lssn) { $lssn } else { $servers.data.default_lssn }

$cost = Invoke-RestMethod -Uri "$base/azureCost?csn=$csn&lssn=$target" -Headers $h
"稅前總額: $($cost.data.totals.pretax_cost) $($cost.data.period.currency)"
$cost.data.by_service | Select-Object -First 5 name, pretax_cost, ratio_percent

13. Python 範例(單檔:伺服器清單 → 預設 LSSN → 費用查詢 → 前 5)

import os, sys, time, json, urllib.request, urllib.error

BASE = "https://giipfaw.azurewebsites.net/api"
CSN = os.environ["GIIP_CSN"]
KEY = os.environ["GIIP_API_KEY"]
LSSN = os.environ.get("GIIP_LSSN")  # 若無則使用 default_lssn

def call(path):
    req = urllib.request.Request(f"{BASE}/{path}", headers={"x-api-key": KEY})
    for attempt in range(4):
        try:
            with urllib.request.urlopen(req, timeout=30) as r:
                return json.load(r)
        except urllib.error.HTTPError as e:
            if e.code == 429:  # 限流 → 等待 Retry-After 後重試
                time.sleep(int(e.headers.get("Retry-After", 2 ** attempt)))
                continue
            sys.exit(f"HTTP {e.code}: {e.read().decode()}")
    sys.exit("429 重試超限")

servers = call(f"azureCostServers?csn={CSN}")
lssn = LSSN or servers["data"]["default_lssn"]
cost = call(f"azureCost?csn={CSN}&lssn={lssn}")["data"]

cur = cost["period"]["currency"]
print(f"稅前總額: {cost['totals']['pretax_cost']} {cur} "
      f"(月底預測 {cost['totals']['forecast_month_end']})")
print("前 5 服務:")
for s in cost["by_service"][:5]:
    print(f"  {s['name']}: {s['pretax_cost']} ({s['ratio_percent']:.1f}%)")
print("前 5 資源群組:")
for g in cost["by_resource_group"][:5]:
    print(f"  {g['name']}: {g['pretax_cost']} ({g['ratio_percent']:.1f}%) mapped_csn={g['mapped_csn']}")

14. 執行順序(5 步)

  1. 設定環境變數:GIIP_CSN、GIIP_API_KEY(可選 GIIP_LSSN)。
  2. 呼叫 azureCostServers → 確認 default_lssn。
  3. 呼叫 azureCost → 取得 data。
  4. 用 totals / by_service / by_resource_group 分析總額與靠前的項。
  5. 4xx/5xx 依錯誤表處理,429 用 Retry-After 重試。

🔍 主要組成部分

1. 服務 / 資源群組 分頁

頁面頂部的兩個分頁可將同一資料在依服務與依資源群組兩種視角之間切換。點擊分頁時不會重新載入整個頁面,僅更新網址列中的 ?view= 值(service 或 rg),因此可直接分享特定視角的連結。

2. 伺服器(LSSN)選擇

指定要查看成本的目標伺服器。

  • 下拉選單: 屬於目前專案(csn)的伺服器清單以 主機名 (LSSN) 的形式填入。
  • 直接輸入: 若伺服器不在清單中或您已知道 LSSN,可在右側輸入框中直接輸入編號並點擊 [查詢] 或按 Enter 查詢。

確定 LSSN 後,會自動查詢最新成本資料。

3. 摘要卡片

在查詢結果上方以卡片形式顯示關鍵指標。

  • 總成本: 該期間的稅前合計(total_pretax_cost)以及貨幣、期間(period)。當月累計時顯示為 MonthToDate。
  • 月底預估: 僅在 MonthToDate 期間時出現,依目前日均值 × 當月總天數計算。
  • 訂閱: 訂閱名稱(subscription_name)與訂閱 ID(subscription_id)。
  • 收集時間: 資料收集的時間(collected_at)以及查詢的 LSSN。

4. 逐項成本表

依目前分頁,依服務或依資源群組從高到低列出成本。

  • #: 排名
  • 服務 / 資源群組: 項目名稱
  • 成本: 該項目的稅前成本
  • 月底預估: 僅在 MonthToDate 時顯示,將整體預估比率套用於該項目的值
  • 占比: 相對於總成本的比例,以長條與百分比顯示

5. 為資源群組指定 CSN(專案)· 對應 RG 篩選

在資源群組分頁中,可直接在每個資源群組列指定專案(CSN)。

  • 指定方式: 在該列的 [指定 CSN] 下拉選單中選擇專案並點擊 [套用],該資源群組即對應到所選 CSN(內部儲存至 tCsnAzureRg)。之後會反映在該 CSN 視角的 Azure 費用檢視(對應 RG 篩選與小計)中。
  • 重新指定 / 解除: 將已對應到其他 CSN 的 RG 改到別的專案時,舊對應會自動清理,維持 1 RG = 1 CSN。選擇 (未指定) 並套用即可解除對應。
  • 僅顯示對應 RG: 若目前專案(CSN)有一個以上對應 RG,將出現 「僅顯示 CSN 對應 RG」 開關;開啟後會將目前伺服器的資源群組篩選為已對應 RG 並顯示對應小計。無對應時顯示全部 RG(非破壞性回退)。
  • 此內嵌指定與專用管理頁面 Azure 資源群組管理 共用同一對應資料。包含訂閱 ID、備註的精細管理請使用管理頁面。

🛠️ 使用技巧

  • 切換視角: 使用服務分頁查看哪些 Azure 服務成本最高,使用資源群組分頁查看哪些群組最大。
  • 分享連結: 由於 ?view= 與 ?lssn= 的值會反映在網址列中,可直接分享特定伺服器與視角。
  • 運用預估: 只有存在當月累計資料時才會計算預估成本。可用於及早發現成本驟增。

💡 注意事項

  • 顯示的所有成本均以**稅前(Pre-tax)**為準。
  • 儀表板始終顯示最近收集的單筆快照。數值以收集時間為準,並非即時值。
  • 若沒有資料,會顯示提示訊息。通常表示該伺服器的成本收集器尚未執行,或沒有已儲存的快照。

疑難排解

症狀原因解決方法
顯示「無資料」該 LSSN 沒有已收集的 azure_cost 快照確認目標伺服器上的 Azure 成本收集器已執行並儲存資料。
伺服器下拉選單為空未選擇專案(csn),或清單載入失敗選擇專案後重新開啟頁面,或在右側輸入框中直接輸入 LSSN。
月底預估卡片/欄位不顯示期間不是 MonthToDate預估僅從當月累計資料推導。期間不同時屬正常現象。
資源群組分頁為空快照中沒有 by_resource_group 資料確認收集器是否也收集資源群組層級的成本。
[指定 CSN] 下拉選單不顯示可選專案清單載入失敗(無所屬/網路)確認是否屬於某個專案並重新連線。對應 RG 篩選與查詢仍正常。
[套用] 後對應未生效對目標專案(CSN)無權限或 API 失敗確認該 CSN 權限,若反覆出現請聯絡管理員。
查詢時出現錯誤訊息網路錯誤或 API 回應失敗稍後重試 [查詢],若持續出現請聯絡管理員。

版本: 1.1 最後更新: 2026-07-24 原始檔案: giipv3/public/help/azure-cost.zh-TW.md