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トピックを作成する
予算を設定する
-
「Budget Type」を「指定額」または「先月の利用額」のどちらかから選択する。「指定額」にした場合は「Target amount」に予算額を入力する。「次へ」ボタンをクリックする。
-
プロジェクトとPub/Sub トピックを選択する。今回は先ほど作成したトピックを入力する。「終了」ボタンをクリックする。
Slackの設定をする
Slackへ通知する方法はIncomming Webhookを使う方法やBotを使う方法がありますが、今回はBotを使います。
- 「api.slack.com」にアクセスする。
-
右上の「Your Apps」をクリックする。
-
「Create App」ボタンをクリックする。
-
「App Home」ページを開き、
App Display Name
の横にあるEdit
ボタンをクリックし、Display Name(Bot Name)
とDefault username
を入力する。
-
左のメニューから「OAuth & Permissions」に移動する。
-
「Scopes」メニューの「Select Permission Scopes」から「chat:write」を選択する。「Save Changes」ボタンをクリックする。
-
ページの一番上の「Install App to Workspace」ボタンをクリックする。
-
こちらを参考に、アプリを通知したいチャンネルと連携する。
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<a href="https://storage.googleapis.com/apps-gcp-tokyo-02.appspot.com/0002-08-11-15.53.48.png"><img src="https://lh3.googleusercontent.com/Xl4kx8Zb9cT8WrhXyHQ7piPKJ6FPYrU4ONMnUibgsJSl4z4bXxPibWfEWuYEXMLBSXc21gb4i7nD_MmF9urXfhdNL2jUPGJd=s300" alt="" width="300" height="300" class="aligncenter size-medium wp-image-11707" /></a>,
text=budget_notification_text)
requirement.txt
slackclient==1.3.0
コードをCloud Functionsにデプロイする
メニュー→コンピューティング→Cloud Functions
をクリックしてCloud Functionsのコンソールを開き、「関数を作成」をクリックする。
エディター画面が表示されるので、main.py
とrequirement.txt
を上記のコードにコピー&ペーストで置き換える。
デプロイをクリックする。
結果
まとめ
いかがでしたでしょうか。GCPの予算機能をうまく使いこなせれば安心してGCPを使い倒すことができますね。ここで紹介した方法は一例に過ぎません。アイデア次第で様々な使い方が可能です。ぜひ自分に合った使い方を探してみてください。