中野智文のブログ

データ・マエショリストのメモ

Cloud FunctionsとPubSubを使ってGCPの予算アラートをslackに通知

背景

GCPの予算アラートをslackに通知したいが、GCPの予算のアラートに無駄金を使わないために、GCPのサーバレスの機能を使って実現したい。

手順

  • PubSub を作ろう
  • Slack で通知のためのWeb Hook を作ろう
  • Cloud Functionsで関数を作ろう
  • GCPのお支払いで設定をしよう

PubSub

ただ名前を作るだけ。GCPに閉じているのでAPIキーなどは必要なし。

Slack で Web Hook

次のページを参考にして作る。

get.slack.help

Cloud Functions

トリガーは前述の pubsub で作ったトピックに設定にする。

基本的にはここを、

Cloud Pub/Sub Tutorial  |  Cloud Functions Documentation  |  Google Cloud

しかし、内容的(slack通知など)にはここを参照

www.topgate.co.jp

const { IncomingWebhook } = require("@slack/client");

/**
 * Background Cloud Function to be triggered by Pub/Sub.
 *
 * @param {object} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */
exports.helloPubSub = (event, callback) => {
  const pubsubMessage = event.data;
  const name = pubsubMessage.data ? Buffer.from(pubsubMessage.data, 'base64').toString() : '{}';
  const data = JSON.parse( name );

  if (typeof data.costAmount === "undefined"  || typeof data.budgetAmount === "undefined" ||
      data.costAmount <= data.budgetAmount ) {
    callback();
  } else {
    
    const body = {
      attachments: [{
        text: `Price: ${name}!`,
      }]
    };
    const webhook = new IncomingWebhook('https://hooks.slack.com/services/XXXXXXX');
    webhook.send(body, (err, res) => {
      if (err) { console.error(err); }
      if (res) { console.log(res); }
      callback();
    });
  }
};

GCP でお支払い設定

次を参考に www.topgate.co.jp

pubsub のトピックに紐づける。

注意点

  • 1日ごとの累計などは分からないので、突発的に利用料が増えた場合のアラートなどには向いていない。
  • 予算超過の関係なしに通知は1時間ごとに来るのだが、そのあたりの話はどこにも書いていない。いろいろ悩ましい。
  • 見ての通り、関数内で予算を超過したかを判断する必要がある。
  • テストは jsonbase64エンコードしたものを送る必要がある。