星期日, 7月 19, 2020

GCP Billing export with Big Query 小記

GCP Billing export with Big Query 小記


今天要來寫將 GCP 的費用匯出到 Big Query 進行查詢


費用的概念, 在雲端與地端其實是很不一樣的

  • 地端

    • 前期需要投入一定量的資本額, 按照購入的設備規格, 決定日後服務的種類與規模

    • 後期費用爲固定維護費用與折舊, 依照業務改變決定是否購入新硬體. 後期費用對使用率感覺相對不明顯.

  • 雲端

    • 前期不需要投入資本額, 服務的種類或是規模隨服務量產生變化, 可採隨用即付或是等服務穩定之後使用 RI 方式或是其他方式節費

    • 後期費用因使用率會馬上感受到費用的變化

 

如果在專案的數量沒有很多的狀況下, 專案的費用是可以經由 portal 上的 Billing -- > Report 手動查詢, 或是等帳單來臨的時候來進行觀察.  可是如同剛剛描述的, 如果等到帳單出帳的時候, 再來進行檢討, 可能為時已晚.


手動查詢費用在專案少的時候可以人工來處理, 但是等到專案慢慢越來越多, 卻會佔掉很多時間.

所以另外一個好的方式就是將 billing 匯出到 Big Query 來查詢與分析


參考官方的文件


首先要建立專案與 Big Query Dataset


為了核算清楚, 會建議新建一個專案, 然後產生一個 Big Query 的 Dataset 來獨立管理

  • 因為帳單的資料沒辦法跨 Billing Account, 所以如果有多個 Billing Account 就要建立多個專案與 Big Query Dataset 來處理

  • 如果是透過 Partner, 那就要請 Partner 那邊有 Billing Account Administrator 角色的人幫忙進行匯出


建立的方式很簡單, 建立完新專案之後, 到 Big Query 介面, 選取左下角的專案名稱

點選 CREATE DATASET



輸入 Dataset 名稱

點選 Create dataset




第二個步驟就是將 Cloud Billing 導出到 Big Query


首先執行的人必須要有 Billing Account Administrator 角色

在 Portal 上面選取 Billing

點選 Billing export

點選 BIGQUERY EXPORT 分頁

選取剛剛建立的專案與 dataset

點選 SAVE


  • 設定完成之後大概一到兩天就會看到開始有費用的資料匯入到 dataset 裡面了



等到匯集一段時間的費用, 就可以開始來進行查詢與分析了

在查詢之前, 建議是先觀察一下有那些 Schema 可以使用

可以在 Big Query 介面, 點選 專案 -- > 點選 Dataset -- > 點選匯出的 table ( gcp_billing_export_v1XXXXXXXX ) 來觀察 



接下來就可以在 Query editor 的地方輸入查詢的語法來進行查詢了

以下進行兩個範例


========================================================


  -- 針對特定專案, 特定月份, 個別服務的費用, 不區分地區

SELECT

  invoice.month,

  project.name,

  service.description,

  SUM(cost) AS total_cost,

  -- ROUND() 手動調整成小數點後兩位

  ROUND(SUM(cost) + SUM(IFNULL((

        SELECT

          -- c.amount 是下面 credits 的加總

          SUM(c.amount)

        FROM

          -- credits 是優惠點數或是折扣, 使用 UNNEST 逐條列出, 定義為 c

          UNNEST(credits) c),

        0)),2) AS cost_after_credits

FROM

  -- 這邊接要分析的 專案名稱.資料庫名稱.資料表名稱

  `YOUR_PROJECT.YOUR_DATASET.gcp_billing_export_v1_XXXXX_YYYYY_ZZZZZ`

WHERE

  invoice.month = "202006"

  AND project.name = "maxtest2020"

GROUP BY

  invoice.month,

  project.name,

  service.description

ORDER BY

  cost_after_credits DESC ;


  • 上面 FROM 請換成 自己的專案.自己的DATASET.TABLE名稱

  • invoice.month 就輸入要查詢的月份

  • project.name 就輸入要查詢的專案


輸入查詢的語法後, 可以看一下語法是否正確

另外一個重點是, 查詢的資料大小, 因為這個也是關乎費用 :P



得到的結果範例如下




========================================================


  -- 取特定日期區間, 個別專案的總費用

SELECT

  project.name,

  SUM(cost) AS total_cost,

  -- 這邊使用 round() 取到小數點 2 位數, 之後可以考慮乘上匯率

  -- cost 要使用 sum 來進行加總

  ROUND(SUM(cost) + SUM(IFNULL((

        SELECT

          -- c.amount 是下面 credits 的加總

          SUM(c.amount)

        FROM

          -- credits 是優惠點數或是折扣, 使用 UNNEST 逐條列出, 定義為 c

          UNNEST(credits) c),

          -- 這邊的0 是 IFNULL 就為 0, 2 是ROUND() 取到小數點兩位數

        0)),2) AS cost_after_credits

FROM

  -- 這邊接要分析的 專案名稱.資料庫名稱.資料表名稱

  `YOUR_PROJECT.YOUR_DATASET.gcp_billing_export_v1_XXXXX_YYYYY_ZZZZZ`

WHERE

  -- 這邊過濾時間區間落在 2020-06-21 到 2020-06-24 之間

  DATE(_partitiontime) BETWEEN "2020-06-21"

  AND "2020-06-24"

  -- 用專案來進行 GROUP BY

GROUP BY

  project.name

ORDER BY

  cost_after_credits DESC ;


  • 上面 FROM 請換成 自己的專案.自己的DATASET.TABLE名稱

  • DATE(_partitiontime) BETWEEN 就輸入要查詢的區間


得到的結果範例如下




========================================================


Notes:

  • 如果要匯出 Data Studio 發現權限不足

    • 要先開啟 Data Studio 並接受相關規範再進行匯出


這樣又多了一個方便的分析工具, 不用手動來進行查詢了 (撒花)

~ enjoy it



Reference:

1 則留言:

Mosquito's love story 提到...

您好,我依您的SOP 去做billging data export, 但我從2023/1/19 轉過去,但到今天還是1/21 還是"There is no data to display." 不知您有沒有遇過,或我還需要做什麼動作!? Thanks your help.

my query script:
SELECT * FROM `delta-coast-xxxxxx.delta_Coastxxxxx_20230119.gcp_billing_export_resource_v1_018BF7_xxxxx_xxxxxx`


Result:
"There is no data to display."