GCP Billing export with Big Query 小記
今天要來寫將 GCP 的費用匯出到 Big Query 進行查詢
費用的概念, 在雲端與地端其實是很不一樣的
地端
前期需要投入一定量的資本額, 按照購入的設備規格, 決定日後服務的種類與規模
後期費用爲固定維護費用與折舊, 依照業務改變決定是否購入新硬體. 後期費用對使用率感覺相對不明顯.
雲端
如果在專案的數量沒有很多的狀況下, 專案的費用是可以經由 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

等到匯集一段時間的費用, 就可以開始來進行查詢與分析了
在查詢之前, 建議是先觀察一下有那些 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 ;
輸入查詢的語法後, 可以看一下語法是否正確
另外一個重點是, 查詢的資料大小, 因為這個也是關乎費用 :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 ;
得到的結果範例如下

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