Envie notificações para o Slack

Este documento explica como enviar notificações de orçamento para o Slack.

Os orçamentos são normalmente configurados para enviar notificações por email. No entanto, o email nem sempre é a melhor forma de se manter a par dos seus custos na nuvem, especialmente se o seu orçamento for crítico e sensível ao tempo. Com as notificações programáticas, pode encaminhar as suas mensagens de orçamento para outros meios, como o Slack.

Antes de começar

Antes de começar, tem de concluir as seguintes tarefas:

  1. Ative a API Cloud Billing
  2. Crie um orçamento
  3. Configure notificações de orçamento programático

Configure um canal do Slack e autorizações

O primeiro passo é criar o seu espaço de trabalho do Slack e os tokens de utilizador do bot que são usados para chamar a API Slack. Pode gerir os tokens de API em https://api.slack.com/apps. Para obter instruções detalhadas, consulte o artigo Utilizadores de bots no site do Slack.

Configure as notificações do Slack.

Configure uma função do Cloud Run

  1. Conclua os passos em Crie uma função do Cloud Run. Certifique-se de que o Tipo de acionador está definido para o mesmo tópico do Pub/Sub que o seu orçamento vai usar.

  2. Adicione as seguintes dependências:

    Node.js

    Copie o seguinte para o seu 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

    Copie o seguinte para o seu requirements.txt:

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

  3. Copie o seguinte código para a sua função do Cloud Run para publicar notificações de orçamento num canal de chat do Slack através da 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. Certifique-se de que os seguintes parâmetros postMessage da API Slack estão definidos corretamente:

    • Chave de acesso OAuth do utilizador do bot
    • Nome do canal

Teste a sua função

Para garantir que a sua função funciona como esperado, siga os passos em Testar uma função do Cloud Run.

Se for bem-sucedida, é apresentada uma mensagem no Slack.

O que se segue?

Reveja outros exemplos de notificações programáticas para saber como fazer o seguinte: