【How-to Guides】GCP Billing — 透過 Push Mail 或以 Slack 進行 billing alert notification

Kellen
12 min readOct 29, 2023

--

透過 GCP Billing 發送訊息到 Pub/Sub 後,在制定對應的 Cloud Funciton 去進行內部的處理,包括訊息推播、超支預算強制進行資源移除等動作

本次使用服務包含 Billing, Pub/Sub, Cloud Function & Third Party apps — Slack

使用Push Mail或Slack進行通知

沒有什麼比在月底收到任何類型的超支帳單更糟糕惹,雲端也一樣可能會更恐怖,因此此篇建立一個預算推播,最終目的是幫助管理雲端支出。早在 2018 年 GCP 推出相關的預算推播通知功能,讓基礎架構管理員可以時時刻刻緊盯預算,「在預算快要失控前,主動採取行動。」

ITHome:Google GCP推預算通知功能,用公雲也不怕消耗過量資源

為確保隨時可以掌握費用(其實也只能掌握到昨天的資訊 XD),可以選擇將通知傳送到您的電子郵件:

  • 郵件推播通知:當費用預算觸發時,GCP 可以透過電子郵件向您發送通知。
  • 結合訊息服務 Pub/Sub 搭配 Cloud Functions 驅動事件:發送到 Slack 進行推播通知,以此方式在 Slack 即時討論和採取必要行動。

預算提醒設定(Billing Alert Notification — Push Mail)

在 Web UI 從「帳單匯出功能」開始,即可設定透過 Push Mail 的方式來通知 Billing 的狀況,簡單三步驟, Push Mail 提醒預算開支。

Step1. 設定預算

Step1. 設定預算

Step2. 預算類型(Budget Type)

  • 指定金額(Specified amount):先設置一個固定金額,之後每月支出會比較這筆固定金額。
  • 與上月比較(Last month’s spend):根據上個月支出,作為每月比較的基準金額。
.Step2. 設定金額

Stpe3. 設定門檻水準

  • 實際(Actual)觸發:依賴實際的使用情況,當在預算實際累積超過費用設定的比重值時,實際費用發生規則將觸發通知。例如,如果您為 100 美元的預算設定了 50% 的實際支出警報,當您在預算支出達到 50 美元時,您將收到警報通知。
  • 預測(Forecasted)觸發:當系統預測的使用量超過門檻時,將觸發通知。例如,如果您設定了 100 美元的預算,並配置了120% 的費用,則當系統預測預測你的支出將超過 120 美元時,將收到警報通知。
Step3. 設定 Billing alert 的動作與通知
Step3. 設定 Billing alert 的動作與通知,亦有提供 Pub/Sub 在以非同步方式進行通知,若是 Push Mail 此選項可不需鉤選

Final.

Final. 設定完成畫面

實際收到的 Push Mail 通知

信件內容呈現

彙出預算明細至 Big Query

雖然 GCP 提供的 Dashboard 就滿好用,也可以 Group by Tags;如果真的是企業營運用途,且要進行完整的 FinOps 會發現 GCP 提供的 Dashboard 會稍嫌不足,此時就可以將費用的完整資料,包括 SKU 等細節都可以設定後並匯出至 Big Query,兩步驟即可搞定,進階管理或分析就得需要完整資料,

一旦在 BQ Dataset 中獲得了資訊,就可以對其運行有趣的查詢,如下Big Query SQL Code 參考

SELECT
labels.department AS department,
SUM(cost) AS cost
FROM
‘hello-workshop.billing.gcp_billing_export_v1_xxx‘
LEFT JOIN UNNEST(labels) AS labels
ON labels.department = “inno”
WHERE
project.id = “hello-workshop”
AND labels IS NOT NULL
AND DATE(_PARTITIONTIME) BETWEEN “2023-10-29”
AND “2023-10-30”
GROUP BY department

其他可能的展示,相比之下 GCP 提供的 Dashboard 在不同維度分析就十分受限,若有 100 人使用下拉選單查看 100 次且還有不同主題報表需求,就得花上更多的人力成本,架構一個主題明確且分門別類的主題一定會比較有效率。

像是資料分析部門就需要對 BigQuery 使用與費用資料進行分析,資料存取日誌是對 BigQuery 中執行的每個查詢及其掃描的總位元組數。這些日誌可用於追查昂貴或不甚合理的作業習慣。

Don’t Reinvent the Wheel — 作者也大方提供自己的範本供引用

範本聯結

Reference:Visualize GCP Billing using BigQuery and Data Studio

預算提醒設定(Billing Alert Notification — Slack)

這個架構是 GCP 本身官方推廣的方式,不過很可惜 GCP 操作文件只有提點方向沒有深入到作業細節及必要的說明,第三方軟體部份幾乎就以文字帶過,本篇提供在開發與設定要留意的細節:

共分以下四步驟即可完成

Step1. Pub/Sub 設定

  • 建立 Topic:替您的預算啟用 Pub/Sub Topic,作為預算通知端點

一旦與 Billing 作完聯結後,大約每 50 分鐘就會發布主題的事件,此事件將包含計費帳戶 ID、當前已達到的閾值限制、迄今為止發生的總費用,預設的長相如下。

Step2. 預算通知設定

這一步為將 Pub/Sub Topic 與預算作一個聯結

  • 啟用必要 API
  • 預算 ID
    可以在「帳戶管理」下的找到該預算的 ID
  • 選取 Cloud Pub/Sub 主題
在設定 Billing alert 的動作與通知,Pub/Sub 選取剛剛建立好的 Topic

Step3. Slack 設定

這一步主要就是要設定 Slack 訪問權限,可以按照 Slack Apps 新增作法,先建立新的 Slack 應用程式,然後給予必要的權限後,確保設置好 Slack 存取 Token ,因為稍後我們將需要它來配置從雲端 Cloud Function 到 Slack 的存取。

  • Workspace > Tools&Setting > Manage Apps
  • Build:建構一個應用程式

選好所在的 Workspace 並給 App 一個名稱吧!

Token 記得不要推上到 Git 了,可以使用一些防護的功能來保護

Permission 滿看使用狀況的,看要讓你的 Bot 有多大的權限去作事情

最後一步最常忘,有時會看到 { "ok": false, "error": "not_in_channel" }

要在所屬的 Channel 邀請剛剛創建的 Apps ~

測試看看是否正常,提供 Sample Code 測試

import logging
logging.basicConfig(level=logging.DEBUG)import os
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
slack_token = os.environ["SLACK_BOT_TOKEN"]
client = WebClient(token=slack_token)

try:
response = client.chat_postMessage(
channel="C0XXXXXX",
text="Hello from your app! :tada:"
)
except SlackApiError as e:
# You will get a SlackApiError if "ok" is False
assert e.response["error"] # str like 'invalid_auth', 'channel_not_found'

搞定

Step4. Cloud Function(1st gen)監聽訊息並發送通知至 Slack

這一步,我們將使用 Cloud Function 訂閱 Billing Alerts Cloud Pub/Sub 主題,若有接受到資料(可以進行邏輯整理)則在轉送至 Slack 的特定頻道。

  • Trigger: Cloud Pub/Sub
  • Topic: budget-notification
  • Source code: inline editor
  • Runtime: Python 3.8
  • Function to execute: notify_slack (Endpoint of the cloud function)

透過訂閱 Pub/Sub 主題來監聽通知,在 Cloud Function 選擇觸發條件為 Pub/Sub

觸發條件設定與服務帳戶權限(最小化權限)

權限提醒

應用程式:包括傳送給 Slack 的程式及套件依賴性的 requirements.txt

Examples of automated cost control responses

可以使用內建測試功能,也會順便發送給 Slack 喔!

沒問題後就佈署上去

完成此操作後,可以部署訂閱 Billing API 主題的 Google Cloud Function,將其設定為在產生預算提醒時(定期及超出門檻值提醒)接收預算提醒,並將其發佈到選擇的 Slack 目的地。

完成結果,記得使用 1st generation Cloud Function 喔!

也觀察一下,在訂閱方多了一個 GCF 的訂閱者

自動被取命:gcf-{CloudFunction}-{地區別}-{Topic}

觀察一下,PubSub 約 50 分就會發送一個 Billing Queue 出來,由 Cloud Function 去訂閱後實作 Slack 推播功能

總結

在雲端運算時代,費用控制至關重要的。透過設定 GCP 費用預算並利用Push Mail 或 Slack 進行通知,可以更好地管理費用,並將其保持在預算範圍內。下次,將在實作若達到門檻值後,我們將用強制性的手段,將資源作移除的動作,例如我們將違反承諾的預算超支用戶,依據先前的協意將會強制性移除燒錢的 GPU Computing Engine 或是直接 disable Billing Account 進一步達成預算控制的目的。

--

--

Kellen

Backend(Python)/K8s and Container eco-system/Technical&Product Manager/host Developer Experience/早期投入資料創新與 ETL 工作,近期研究 GCP/Azure/AWS 相關的解決方案的 implementation