Enviar notificaciones a Slack

En este documento se explica cómo enviar notificaciones de presupuesto a Slack.

Los presupuestos se suelen configurar para enviar notificaciones por correo electrónico. Sin embargo, el correo electrónico no siempre es la mejor forma de estar al día de los costes de la nube, sobre todo si tu presupuesto es fundamental y requiere una respuesta rápida. Con las notificaciones programáticas, puedes reenviar tus mensajes de presupuesto a otros medios, como Slack.

Antes de empezar

Antes de empezar, debes completar las siguientes tareas:

  1. Habilita la API Cloud Billing
  2. Crear un presupuesto
  3. Configurar notificaciones de presupuesto programáticas

Configurar un canal de Slack y sus permisos

El primer paso es crear tu espacio de trabajo de Slack y los tokens de usuario bot que se usan para llamar a la API de Slack. Los tokens de API se pueden gestionar en https://api.slack.com/apps. Para obtener instrucciones detalladas, consulta la sección Usuarios de bots del sitio de Slack.

Configura las notificaciones de Slack.

Configurar una función de Cloud Run

  1. Completa los pasos que se indican en Crear una función de Cloud Run. Asegúrate de que el Tipo de activador sea el mismo tema de Pub/Sub que usará tu presupuesto.

  2. Añade las siguientes dependencias:

    Node.js

    Copia lo siguiente en tu 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

    Copia lo siguiente en tu requirements.txt:

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

  3. Copia el siguiente código en tu función de Cloud Run para publicar notificaciones de presupuesto en un canal de chat de Slack mediante la API de 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. Asegúrate de que los siguientes parámetros de postMessage de la API de Slack estén configurados correctamente:

    • Token de acceso OAuth de usuario bot
    • Nombre del canal

Probar la función

Para asegurarte de que tu función funciona correctamente, sigue los pasos que se indican en Probar una función de Cloud Run.

Si se completa correctamente, aparecerá un mensaje en Slack.

Siguientes pasos

Consulta otros ejemplos de notificaciones programáticas para saber cómo hacer lo siguiente: