コンテンツに移動
デベロッパー

お気に入りの通信チャネルへの予算通知の送信

2021年4月19日
https://storage.googleapis.com/gweb-cloudblog-publish/images/cost_optimization.max-2600x2600.jpg
Google Cloud Japan Team

※この投稿は米国時間 2021 年 4 月 6 日に、Google Cloud blog に投稿されたものの抄訳です。

要約 - 予算アラートメールが届くのを待つ代わりに、プログラムによる予算通知を使って、Slack をはじめとするお気に入りの通信チャネル(およびコーディングが可能なあらゆるもの)に予算の最新情報を送信できます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Screen_Shot_2021-04-05_at_8.43.17_AM.max-700.max-700x700.png
FinOps ライフサイクルの通知フェーズに適合する、予算関連の可視性オプションが数多くあります

前回の投稿では、プログラムによる予算通知と、いくつかの情報を表示するシンプルな例について紹介しました。予算通知にはコードで対応できるため、サードパーティの統合も含めてさまざまな可能性を探ることができます。

Slack は多くのチームで採用されているコミュニケーション プラットフォームであるため、予算情報を送信して予算のステータスをチームに通知するうえで理想的な候補と言えます。本投稿では、Slack に予算通知を送信する手順についてご説明します。

免責事項: 今回ご紹介する手順は執筆時点で動作したものであり、その後 Slack 側で変更が行われている可能性があります。

Slack の設定

今回は以下のような通知を作成します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Screen_Shot_2021-04-05_at_8.44.55_AM.max-600.max-600x600.png
この予算ではまだしきい値に達していないため、コストと予測のしきい値は定義されていません。そのため、これらのパラメータはメッセージに含まれません。

こちらは、さまざまな予算通知情報を表示する bot(gcp_cost_management_bot)が投稿したメッセージです。行わなければならない作業の量は前回の投稿に比べるとそれほど多くありませんが、最初に Slack bot を設定する必要があります。

(Cloud Monitoring のものではなく)Slack のアカウントとワークスペースがまだない場合は作成する必要があります。作成方法はこちらのリンクに記載されています。作成が完了したら、https://api.slack.com/apps にアクセスします。まずは新しいアプリを作成しましょう。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Screen_Shot_2021-04-05_at_8.46.12_AM.max-800.max-800x800.png
「Budget Alert Bot」や「Budget Defender Superhero」など、何でも好きな名前を設定してください

アプリを作成した後は、bot にさまざまな設定を加えることができますが、OAuth トークンとチャネルという、bot を動作させるのに必要な 2 つの重要な情報があります。

OAuth トークンを取得するには、[OAuth & Permissions] というメニュー オプションを見つけます。このオプションに移動したら、[Bot Token Scopes] というセクションを見つけて [Add an OAuth Scope] をクリックします。メッセージを送信する必要があるスコープの名前は「chat:write」であるため、これを入力して追加します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Screen_Shot_2021-04-05_at_8.46.24_AM.max-800.max-800x800.png

bot を使ってさまざまなことを実行できますが、私はシンプルな設定にしておくのが好みです

次に、画面を上にスクロールして [Install App to Workspace] を探します。bot によるメッセージの投稿を許可する権限画面が表示されます。この操作が完了すると、後で必要になる OAuth アクセス トークンが表示されるので、コピーしてメモしておいてください。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Screen_Shot_2021-04-05_at_8.46.36_AM.max-900.max-900x900.png
てっきり、私が用意した OAuth トークンが提供されると思いませんでしたか?

OAuth トークンを安全に保存したら、あとはメッセージ送信先のチャネルを用意するだけです。私は「budget-alerts」というチャネル(# は含めません)を使用しましたが、初めての場合は既存のものよりも新しいチャネルを使用することをおすすめします。

注: お使いのチャネルに移動してコマンドを実行し、メッセージを投稿してほしいチャネルに bot を招待します。指定した名前に基づいて bot 名を更新します。

読み込んでいます...

クラウドでの操作

これでトークンとチャネルの準備は完了です。Google Cloud Console に戻って新しい Google Cloud Functions の関数を作成しましょう。Pub/Sub では 1 つのトピックに対して複数のサブスクライバーが許可されているため、前回の投稿の手順に沿って作業を進めている場合は、ロガー bot をそのままにしておいても、シャットダウンしてもどちらでも構いません。「budget-notification-slack」などの名前を付けて同じ Pub/Sub トピックを選択します。関数の作成方法を再度確認する場合は、前回の投稿をご覧ください。

ここでも Python 3.7 を使用しますが、今回はコードを変更します。デフォルトでは、左側に main.py と requirements.txt という 2 つのファイルがあります。ここでは Python の詳細について触れませんが、requirements.txt をクリックして以下のコード行を追加してください。

読み込んでいます...

次の画像を参考にしてください。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Screen_Shot_2021-04-05_at_8.46.51_AM.max-900.max-900x900.png
Google Cloud Functions によって多数の依存関係が自動的に処理されますが、Slack は手動で追加する必要があります。

その後、main.py をクリックして以下のコードを使用します(またはこちらから取得してください)。

読み込んでいます...

コードはそれほど複雑ではありませんが、重要な部分をいくつか詳しく見ていきましょう。

読み込んでいます...

注: コードのこの部分を更新しておかないと正常に動作しません。

インポートが完了したら、さきほど安全に保存した値を使ってこれら 2 つの行を更新する必要があります。どちらの文字列も変更する必要があります。どちらの値をどこで使用するかは明確かと思います。CHANNEL 変数にはチャネルの名前(「budget-alerts」など)かチャネル ID(C0123456789 など)を使用できます。また、bot アクセス トークンを使って Slack クライアントを設定します。

読み込んでいます...

こちらは「notify_slack」という関数の先頭部分です。2 番目の行では、Pub/Sub が予算から取得したメッセージとして渡されたデータを取得します。

注: 関数のエントリ ポイントを、「hello_pubsub」から呼び出す実際の関数である「notify_slack」に変更する必要があります。エントリ ポイントを変更しないと正常に動作しません。

読み込んでいます...

前回の投稿では、Pub/Sub が予算から取得するメッセージとサブスクライバーに送信するものについて取り上げましたが、実際は、残念ながら前回の説明よりも複雑なのです。実際のメッセージ全文は、属性とデータという 2 つの部分で構成されています。詳細についてはこちらで確認できますが、基本的には属性(JSON)とデータ(Base64 エンコード)を取得して重要なデータで使用します。

読み込んでいます...

この行は、属性とデータの両方から値を取得して文字列に取り込むためのものです。確かにやや複雑ですが、今回はこちらを出発点とします。

読み込んでいます...

最後に、こちらのコードでチャネルと実際のメッセージを指定して Slack にメッセージを投稿します。こちらはきわめてシンプルなコードです。

これで必要なコードの準備は完了です。さきほどご説明したとおり、bot トークン、チャネル名、関数のエントリ ポイントを変更してから関数をデプロイしてください。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Screen_Shot_2021-04-05_at_8.47.12_AM.max-800.max-800x800.png
関数のデプロイにはしばらく時間がかかることもあるため、お茶でも飲んで待ちましょう

関数のデプロイが完了したら、それをテストしてみましょう。

通知で確認

ロガー関数をテストしたときと同じように、Pub/Sub を使ってテスト メッセージを送信するか、予算通知が届くまで待ちます。私は忍耐力があまりないので、テスト メッセージを送信してみましょう。Pub/Sub ページにアクセスし、トピックをクリックしてから [メッセージのパブリッシュ] をクリックします。前回と同じテスト本文を使用できます。

読み込んでいます...

属性をいくつか追加して、実際の通知がどのようになるかを見ることもできます。請求先アカウントの ID と予算の ID という 2 つの重要な属性があり、いずれも一意です。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Screen_Shot_2021-04-05_at_8.0399017807980356.max-900x900_Tz9swt4.png

皆様の予想どおり、これらは私の実際の一意の ID ではありません

メッセージを送信し、Slack チャネルをクリックすると以下のような画面が表示されるはずです。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Screen_Shot_2021-04-05_at_8.47.33_AM.max-800.max-800x800.png
さきほど送信したテストデータが表示されました

まとめ

ご覧のとおり、テスト メッセージが届き、データが bot からメッセージに送信されました。もちろん、しばらく待てば、本物のデータが含まれる実際の予算通知メッセージが表示されて Slack に投稿されます。

この投稿の冒頭(今回は投稿が長いのでスクロールが大変です)でお見せした最初の画像とは bot メッセージの内容が異なっているはずです。これは、コードを更新することでオブジェクト全体をダンプ出力する以上のことができ、ご自分に最適なデータと形式に合わせてメッセージの形式を設定できるからです。今回の投稿は長くなりましたので詳しい手順の説明は割愛しますが、ぜひご自身で練習してみてください。こちらのドキュメントでもさまざまなサンプルを紹介していますので、ご参照ください。

-Google Cloud デベロッパー アドボケイト Mark Mirchandani

投稿先