クラウド同上

GCPプロジェクトの予算を設定し予算をオーバーしたらSlackに通知する方法

Author
sekine
Lv:29 Exp:81433

My favorite language: Python / Golang

GCPを運用する上で一番気になるのはやはりコストではないでしょうか。「自分は今どれくらいの額を使っているんだろう」とか「使いすぎてしまわないだろうか」と不安になる方はたくさんいると思います。

GCPではプロジェクトごとに予算を設定することができます。予算を設定すると、利用料が予算額を超えた場合に通知を送ることができます。通知を受け取るアプリケーションを作ることで、例えば「予算の90%を超えたらSlackに通知」したり、「予算を100%超えたら課金を無効にする」などのアクションを自動化することができます。

本稿ではCloud Pub/SubとCloud Functions(GCF)を使って「予算をオーバーしたらSlackに通知する」方法をご紹介したいと思います。

こんな場合に便利!

  • 組織でGCPを使っていて、決められた予算内でGCPを運用しなければならない
  • 趣味でGCP運用しているけど、利用料を使い過ぎないか不安

どうやって動いているの?

①: GCPの予算機能が指定したPub/Subトピックにイベントをパブリッシュする

②: Pub/SubトリガーのGCF関数がイベントを検知して起動する

③: Slackの指定チャンネルにメッセージを送信する

GCFは月あたり最初の200万回までの呼び出しは無料。PubSubも最初の10GBは無料なので実質無料で運用できます。

設定手順

Pub/Subトピックを作成する

  1. Cloud Consoleにログインし、ナビゲーションメニューから「Pub/Sub」を開く。

  2. 「トピックを作成」ボタンをクリックする。

  3. 名前を入力し「トピックを作成」ボタンをクリックする。

予算を設定する

  1. ナビゲーションメニューから「お支払い」を開く。

  2. (複数の請求先アカウントがある場合)「リンクされた請求先アカウントに移動」をクリックする。

  3. サイドメニューから「予算とアラート」を開く。

  4. 「予算を作成」ボタンをクリックする。

  5. 予算の名前を入力して対象となるプロジェクトを選択する。「次へ」ボタンをクリックする。

  6. 「Budget Type」を「指定額」または「先月の利用額」のどちらかから選択する。「指定額」にした場合は「Target amount」に予算額を入力する。「次へ」ボタンをクリックする。

  7. アラートのしきい値を設定する。「予算の割合」と「金額」の2種類のしきい値が設定できる。しきい値は複数設定できる。

  8. 「Pub/Subトピックをこの予算に接続する」のチェックボックスをONにする。

  9. プロジェクトとPub/Sub トピックを選択する。今回は先ほど作成したトピックを入力する。「終了」ボタンをクリックする。

Slackの設定をする

Slackへ通知する方法はIncomming Webhookを使う方法やBotを使う方法がありますが、今回はBotを使います。

  1. 「api.slack.com」にアクセスする。

  2. 右上の「Your Apps」をクリックする。

  3. 「Create New App」をクリックする。

  4. 「App Name」にアプリ名を入力する。

  5. 「Development Slack Workspace」でアプリをインストールするワークスペースを選択する。

  6. 「Create App」ボタンをクリックする。

  7. 「App Home」ページを開き、App Display Nameの横にあるEditボタンをクリックし、Display Name(Bot Name)Default usernameを入力する。

  8. 左のメニューから「OAuth & Permissions」に移動する。

  9. 「Scopes」メニューの「Select Permission Scopes」から「chat:write」を選択する。「Save Changes」ボタンをクリックする。

  10. ページの一番上の「Install App to Workspace」ボタンをクリックする。

  11. 「インストール」ボタンをクリックする。

  12. 「OAuth Access Token」をコピーする。

Cloud Functionsにコードをデプロイする

Pub/Subトピックにパブリッシュされたイベントをトリガーに実行するCloud Functions関数のコードを書いていきます。以下のサンプルコードでは、PythonのSlackクライアントを使い、指定したチャンネルにメッセージを送信します。イベントに含まれるデータ(予算額や利用額)は関数の引数から取得できます。

main.py

from slackclient import SlackClient
import json
import base64

# 先ほどコピーしたSlackのAccessToken
BOT_ACCESS_TOKEN = 'xoxp-oooo-oooo-oooo-oooo'

# 通知を送信するチャンネルID
CHANNEL_ID = 'GLGDBMLRX'

slack_client = SlackClient(BOT_ACCESS_TOKEN)


def notify_slack(data, context):
    pubsub_message = data

    notification_attrs = json.dumps(pubsub_message['attributes'])
    notification_data = base64.b64decode(data['data']).decode('utf-8')
    data_json = json.loads(notification_data)
    cost_amount = data_json['costAmount']
    budget_amount = data_json['budgetAmount']
    currency_code = data_json['currencyCode']

    budget_notification_text = f'予算: {budget_amount} {currency_code} 利用額: {cost_amount} {currency_code}'

    slack_client.api_call(
        'chat.postMessage',
        channel=CHANNEL_ID,
        text=budget_notification_text)

requirement.txt

slackclient==1.3.0

コードをCloud Functionsにデプロイする

メニュー→コンピューティング→Cloud FunctionsをクリックしてCloud Functionsのコンソールを開き、「関数を作成」をクリックする。

次の画像の①〜④を行ってから、「次へ」をクリックする。

エディター画面が表示されるので、main.pyrequirement.txtを上記のコードにコピー&ペーストで置き換える。

デプロイをクリックする。

結果

Slackに通知が届くようになりました。

まとめ

いかがでしたでしょうか。GCPの予算機能をうまく使いこなせれば安心してGCPを使い倒すことができますね。ここで紹介した方法は一例に過ぎません。アイデア次第で様々な使い方が可能です。ぜひ自分に合った使い方を探してみてください。

参考リンク