Mengirim notifikasi ke Slack

Dokumen ini menjelaskan cara mengirim notifikasi anggaran ke Slack.

Anggaran biasanya dikonfigurasi untuk mengirim notifikasi email. Namun, email tidak selalu menjadi cara terbaik untuk mendapatkan informasi terbaru tentang biaya cloud Anda, terutama jika anggaran Anda sangat penting dan sensitif terhadap waktu. Dengan notifikasi terprogram, Anda dapat meneruskan pesan anggaran ke media lain, seperti Slack.

Sebelum memulai

Sebelum memulai, Anda harus menyelesaikan tugas berikut:

  1. Mengaktifkan Cloud Billing API
  2. Buat Anggaran
  3. Menyiapkan notifikasi anggaran terprogram

Menyiapkan saluran dan izin Slack

Langkah pertama adalah membuat ruang kerja Slack Anda dan token pengguna bot yang digunakan untuk memanggil Slack API. Token API dapat dikelola di https://api.slack.com/apps. Untuk petunjuk mendetail, lihat Pengguna Bot di situs Slack.

Mengonfigurasi notifikasi Slack.

Menyiapkan fungsi Cloud Run

  1. Selesaikan langkah-langkah di Membuat fungsi Cloud Run. Pastikan Jenis pemicu ditetapkan ke topik Pub/Sub yang sama dengan yang akan digunakan anggaran Anda.

  2. Tambahkan dependensi berikut:

    Node.js

    Salin kode berikut ke package.json Anda:

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

    Salin kode berikut ke requirements.txt Anda:

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

  3. Salin kode berikut ke fungsi Cloud Run Anda untuk memposting notifikasi anggaran ke saluran chat Slack menggunakan Slack API:

    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. Pastikan parameter postMessage Slack API berikut disetel dengan benar:

    • Token akses OAuth Pengguna Bot
    • Nama saluran

Menguji fungsi

Untuk memastikan fungsi Anda berfungsi seperti yang diharapkan, ikuti langkah-langkah di Menguji fungsi Cloud Run.

Jika berhasil, pesan akan muncul di Slack.

Langkah berikutnya

Tinjau contoh notifikasi terprogram lainnya untuk mempelajari cara melakukan hal berikut: