【How-to Guides】GCP Billing — 透過 Push Mail 或以 Slack 進行 billing alert notification
透過 GCP Billing 發送訊息到 Pub/Sub 後,在制定對應的 Cloud Funciton 去進行內部的處理,包括訊息推播、超支預算強制進行資源移除等動作
使用Push Mail或Slack進行通知
沒有什麼比在月底收到任何類型的超支帳單更糟糕惹,雲端也一樣可能會更恐怖,因此此篇建立一個預算推播,最終目的是幫助管理雲端支出。早在 2018 年 GCP 推出相關的預算推播通知功能,讓基礎架構管理員可以時時刻刻緊盯預算,「在預算快要失控前,主動採取行動。」
為確保隨時可以掌握費用(其實也只能掌握到昨天的資訊 XD),可以選擇將通知傳送到您的電子郵件:
- 郵件推播通知:當費用預算觸發時,GCP 可以透過電子郵件向您發送通知。
- 結合訊息服務 Pub/Sub 搭配 Cloud Functions 驅動事件:發送到 Slack 進行推播通知,以此方式在 Slack 即時討論和採取必要行動。
預算提醒設定(Billing Alert Notification — Push Mail)
在 Web UI 從「帳單匯出功能」開始,即可設定透過 Push Mail 的方式來通知 Billing 的狀況,簡單三步驟, Push Mail 提醒預算開支。
Step1. 設定預算
Step2. 預算類型(Budget Type)
- 指定金額(Specified amount):先設置一個固定金額,之後每月支出會比較這筆固定金額。
- 與上月比較(Last month’s spend):根據上個月支出,作為每月比較的基準金額。
Stpe3. 設定門檻水準
- 實際(Actual)觸發:依賴實際的使用情況,當在預算實際累積超過費用設定的比重值時,實際費用發生規則將觸發通知。例如,如果您為 100 美元的預算設定了 50% 的實際支出警報,當您在預算支出達到 50 美元時,您將收到警報通知。
- 預測(Forecasted)觸發:當系統預測的使用量超過門檻時,將觸發通知。例如,如果您設定了 100 美元的預算,並配置了120% 的費用,則當系統預測預測你的支出將超過 120 美元時,將收到警報通知。
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 主題
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" }
測試看看是否正常,提供 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
可以使用內建測試功能,也會順便發送給 Slack 喔!
沒問題後就佈署上去
完成此操作後,可以部署訂閱 Billing API 主題的 Google Cloud Function,將其設定為在產生預算提醒時(定期及超出門檻值提醒)接收預算提醒,並將其發佈到選擇的 Slack 目的地。
也觀察一下,在訂閱方多了一個 GCF 的訂閱者
觀察一下,PubSub 約 50 分就會發送一個 Billing Queue 出來,由 Cloud Function 去訂閱後實作 Slack 推播功能
總結
在雲端運算時代,費用控制至關重要的。透過設定 GCP 費用預算並利用Push Mail 或 Slack 進行通知,可以更好地管理費用,並將其保持在預算範圍內。下次,將在實作若達到門檻值後,我們將用強制性的手段,將資源作移除的動作,例如我們將違反承諾的預算超支用戶,依據先前的協意將會強制性移除燒錢的 GPU Computing Engine 或是直接 disable Billing Account 進一步達成預算控制的目的。