こちらの記事は弊社技術ブログに掲載していた内容となります。一部を除き、投稿当時の情報となりますので、紹介内容の最新情報については別途公式情報等をご参照下さい。

こんにちは。クラウドエース編集部です。

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. 左のメニューから「OAuth & Permissions」に移動する。
  8. 「Scopes」メニューの「Select Permission Scopes」から「Send messages as XXX(アプリ名)」を選択する。「Save Changes」ボタンをクリックする。
  9. ページの一番上の「Install App to Workspace」ボタンをクリックする。
  10. 「インストール」ボタンをクリックする。
  11. 「OAuth Access Token」をコピーする。

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

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

コードを作成する(以下はPython3のサンプルコード)

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)

「requirements.txt」を作成する

slackclient==1.3.0

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

TOPIC_NAMEに先ほど作成したPub/Subトピックを入力する。

gcloud functions deploy notify_slack --runtime python37 --trigger-resource TOPIC_NAME --trigger-event providers/cloud.pubsub/eventTypes/topic.publish

結果

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

まとめ

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

参考リンク

合わせて読みたい