將通知傳送至 Slack

本文說明如何將預算通知傳送至 Slack。

預算通常會設定為傳送電子郵件通知。不過,如果想要隨時掌握雲端費用的最新消息,電子郵件並非最佳的方式,尤其當您特別看重預算又易受時間影響時,更是如此。透過程式輔助通知,您可以將預算訊息轉寄至其他媒介,例如 Slack

事前準備

開始之前,請務必完成下列工作:

  1. 啟用 Cloud Billing API
  2. 設定預算
  3. 設定程式輔助預算通知

設定 Slack 頻道和權限

第一步是建立 Slack 工作區,以及用於呼叫 Slack API 的機器人使用者憑證。您可以在 https://api.slack.com/apps 管理 API 權杖。 如需詳細操作說明,請參閱 Slack 網站上的「機器人使用者」。

設定 Slack 通知。

設定 Cloud Run 函式

  1. 完成「建立 Cloud Run 函式」一文中的步驟。確認「觸發條件類型」設為預算使用的相同 Pub/Sub 主題。

  2. 新增下列相依項目:

    Node.js

    將下列內容複製到 package.json

    {
      "name": "cloud-functions-billing",
      "private": "true",
      "version": "0.0.1",
      "description": "Examples of integrating Cloud Functions with billing",
      "main": "index.js",
      "engines": {
        "node": ">=16.0.0"
      },
      "scripts": {
        "compute-test": "c8 mocha -p -j 2 test/periodic.test.js --timeout=600000",
        "test": "c8 mocha -p -j 2 test/index.test.js --timeout=5000 --exit"
      },
      "author": "Ace Nassri <anassri@google.com>",
      "license": "Apache-2.0",
      "dependencies": {
        "@google-cloud/billing": "^4.0.0",
        "@google-cloud/compute": "^4.0.0",
        "google-auth-library": "^9.0.0",
        "googleapis": "^143.0.0",
        "slack": "^11.0.1"
      },
      "devDependencies": {
        "@google-cloud/functions-framework": "^3.0.0",
        "c8": "^10.0.0",
        "gaxios": "^6.0.0",
        "mocha": "^10.0.0",
        "promise-retry": "^2.0.0",
        "proxyquire": "^2.1.0",
        "sinon": "^18.0.0",
        "wait-port": "^1.0.4"
      }
    }
    

    Python

    將下列內容複製到 requirements.txt

    slackclient==2.9.4
    google-api-python-client==2.131.0
    

  3. 將下列程式碼複製到 Cloud Run 函式,使用 Slack API 將預算通知張貼至 Slack 即時通訊頻道:

    Node.js

    const slack = require('slack');
    
    // TODO(developer) replace these with your own values
    const BOT_ACCESS_TOKEN =
      process.env.BOT_ACCESS_TOKEN || 'xxxx-111111111111-abcdefghidklmnopq';
    const CHANNEL = process.env.SLACK_CHANNEL || 'general';
    
    exports.notifySlack = async pubsubEvent => {
      const pubsubAttrs = pubsubEvent.attributes;
      const pubsubData = Buffer.from(pubsubEvent.data, 'base64').toString();
      const budgetNotificationText = `${JSON.stringify(
        pubsubAttrs
      )}, ${pubsubData}`;
    
      await slack.chat.postMessage({
        token: BOT_ACCESS_TOKEN,
        channel: CHANNEL,
        text: budgetNotificationText,
      });
    
      return 'Slack notification sent successfully';
    };

    Python

    import base64
    import json
    import os
    import slack
    from slack.errors import SlackApiError
    # See https://api.slack.com/docs/token-types#bot for more info
    BOT_ACCESS_TOKEN = "xxxx-111111111111-abcdefghidklmnopq"
    CHANNEL = "C0XXXXXX"
    
    slack_client = slack.WebClient(token=BOT_ACCESS_TOKEN)
    
    
    def notify_slack(data, context):
        pubsub_message = data
    
        # For more information, see
        # https://cloud.google.com/billing/docs/how-to/budgets-programmatic-notifications#notification_format
        try:
            notification_attr = json.dumps(pubsub_message["attributes"])
        except KeyError:
            notification_attr = "No attributes passed in"
    
        try:
            notification_data = base64.b64decode(data["data"]).decode("utf-8")
        except KeyError:
            notification_data = "No data passed in"
    
        # This is just a quick dump of the budget data (or an empty string)
        # You can modify and format the message to meet your needs
        budget_notification_text = f"{notification_attr}, {notification_data}"
    
        try:
            slack_client.api_call(
                "chat.postMessage",
                json={"channel": CHANNEL, "text": budget_notification_text},
            )
        except SlackApiError:
            print("Error posting to Slack")
    
    

  4. 確認下列 Slack API postMessage 參數設定正確無誤:

    • 機器人使用者 OAuth 存取憑證
    • 頻道名稱

測試函式

如要確保函式正常運作,請按照「測試 Cloud Run 函式」一文中的步驟操作。

如果成功,Slack 中會顯示訊息。

後續步驟

請參閱其他程式輔助通知範例,瞭解如何執行下列操作: