Benachrichtigungen an Slack senden

In diesem Dokument wird erläutert, wie Budgetbenachrichtigungen an Slack gesendet werden.

Budgets sind in der Regel so konfiguriert, dass E-Mail-Benachrichtigungen gesendet werden. E-Mails sind jedoch nicht immer die beste Methode, um hinsichtlich der Cloud-Kosten auf dem Laufenden zu bleiben, insbesondere wenn ein bestimmtes Budget unbedingt eingehalten werden muss und zeitkritisch ist. Mit programmatischen Benachrichtigungen können Sie Budgetnachrichten an andere Medien wie Slack weiterleiten.

Hinweise

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  1. Cloud Billing API aktivieren
  2. Budget erstellen
  3. Programmatische Budgetbenachrichtigungen einrichten

Slack-Kanal und Berechtigungen einrichten

Der erste Schritt besteht darin, den Slack-Arbeitsbereich und die Bot-Nutzertokens zu erstellen, die zum Aufrufen der Slack API verwendet werden. API-Tokens können unter https://api.slack.com/apps verwaltet werden. Weitere Informationen finden Sie unter Bot Users auf der Slack-Website.

Slack-Benachrichtigungen konfigurieren

Cloud Run-Funktion einrichten

  1. Führen Sie die Schritte unter Cloud Run-Funktion erstellen aus. Achten Sie darauf, dass der Triggertyp auf dasselbe Pub/Sub-Thema gesetzt ist, das vom Budget verwendet wird.

  2. Fügen Sie die folgenden Abhängigkeiten hinzu:

    Node.js

    Kopieren Sie Folgendes in Ihre package.json-Datei:

    {
      "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

    Kopieren Sie Folgendes in Ihre requirements.txt-Datei:

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

  3. Kopieren Sie den folgenden Code in Ihre Cloud Run-Funktion, um Budgetbenachrichtigungen mithilfe der Slack API in einem Slack-Chat-Kanal zu posten:

    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. Prüfen Sie, ob die folgenden postMessage-Parameter für Slack API korrekt festgelegt sind:

    • OAuth-Zugriffstoken des Bot-Nutzers
    • Name des Kanals

Funktion testen

Führen Sie die Schritte unter Cloud Run-Funktionen testen aus, um sicherzustellen, dass Ihre Funktion wie erwartet funktioniert.

Bei Erfolg wird eine Nachricht in Slack angezeigt.

Nächste Schritte

In anderen Beispielen für programmatische Benachrichtigungen erfahren Sie, wie Sie Folgendes tun: