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 則留言:
您好,我依您的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."
張貼留言