👌

GCPで予算設定をしてcloud functionを使ってdiscordに通知する方法

2022/01/31に公開

はじめに

zennには初めての投稿になります。
この度GCPに入門して予算設定をし通知先をdiscordに設定したため備忘録として残しておきます。

予算設定

予算設定は下記のgoogle公式ドキュメントを参考に設定しました。

cloud functionからdiscordへの通知設定

予算設定はしましたがメールだけですと見逃してしまうかもしれないので普段使っているdiscordサーバに通知チャンネルを作ってwebhookにて通知することにしました。
参考サイトの情報を元に下記の設定にしました。

設定値

  • ランタイム:node.js 16
  • エントリポイント:alertBudget

index.js

※discordのwebhookURLはマスクしてます

const { IncomingWebhook } = require('@slack/webhook');
/**
 * Background Cloud Function to be triggered by Pub/Sub.
 *
 * @param {object} event The Cloud Functions event.
 * @param {object} context
 */
exports.alertBudget = async pubsubEvent => {
  const pubsubData = Buffer.from(pubsubEvent.data, 'base64').toString();
  console.log(`${pubsubData}`);

  const obj = JSON.parse(pubsubData);
  if (obj.costAmount > obj.budgetAmount) {
    const body = {
      "text": "[Warning]GCP予算を超過しました\n" + 
      `*現在の使用料金*:${obj.costAmount} ${obj.currencyCode}`
    };
    // discordに通知
    const webhook = new IncomingWebhook('https://discord.com/api/webhooks/xxxxxxxxxxxx/xxxxxxxxxxxxxx/slack');
    await webhook.send(body);
  } else {
    console.log(`${obj.costAmount}/${obj.budgetAmount}`);
  }  
  return 'Discord notification sent successfully';
}

package.json

{
  "name": "alert-budget-discord-http",
  "version": "0.0.1",
  "dependencies": {
    "@slack/webhook": "^6.1.0"
    }
}

動作確認

テストデータ

テストデータ(元データ)

{
    "budgetDisplayName": "name-of-budget",
    "alertThresholdExceeded": 1.0,
    "costAmount": 100.01,
    "costIntervalStart": "2019-01-01T00:00:00Z",
    "budgetAmount": 100.00,
    "budgetAmountType": "SPECIFIED_AMOUNT",
    "currencyCode": "USD"
}

これをBase64にして下記のデータをテストデータとして使用

テストデータ(base64)

{"data": "ew0KICAgICJidWRnZXREaXNwbGF5TmFtZSI6ICJuYW1lLW9mLWJ1ZGdldCIsDQogICAgImFsZXJ0VGhyZXNob2xkRXhjZWVkZWQiOiAxLjAsDQogICAgImNvc3RBbW91bnQiOiAxMDAuMDEsDQogICAgImNvc3RJbnRlcnZhbFN0YXJ0IjogIjIwMTktMDEtMDFUMDA6MDA6MDBaIiwNCiAgICAiYnVkZ2V0QW1vdW50IjogMTAwLjAwLA0KICAgICJidWRnZXRBbW91bnRUeXBlIjogIlNQRUNJRklFRF9BTU9VTlQiLA0KICAgICJjdXJyZW5jeUNvZGUiOiAiVVNEIg0KfQ=="}

テスト結果

テスト結果1
テスト結果2

通知オッケーです!
本日はここまで。

参考サイト

GitHubで編集を提案

Discussion