column

コラム

GCPのコスト情報をTeamsで通知する方法

はじめに

こんにちは。BTCクラウドCoEの長塚です。

今回は日次でTeamsの専用チャネルにGCPのコスト情報を通知するアプリケーションの作成方法について説明します。

弊社社内で運用しているGCPプロジェクトのコスト情報を管理するため、GCPリソース毎の利用料金の合計とリソースすべての利用料金の合計をTeamsに通知するアプリケーションを作成しました。

GCPのサービスを組み合わせることで素早く簡単に上記アプリケーションを実装することができます。

また、GCPのコストをTeamsに連携する実装方法について意外とネット上に情報が少なかったため少しでも参考になれば幸いです。

 

アーキテクチャ

今回実装するアプリケーションのアーキテクチャと処理の流れは以下の通りです。

アーキテクチャ図

 

処理の流れ

① Cloud Billing データを BigQuery にエクスポートする

② BigQueryのスケジュールクエリをPub/Subトピックにパブリッシュする

③ Pub/SubトピックをトリガーにCloud Functionsを起動する

④ Cloud FunctionsからBigQueryのコストデータを取得する

⑤ Cloud FunctionsからTeamsのチャネルにメッセージを投稿する

 

実装手順

ここからは、①~⑤の処理の流れに沿って、コスト連携アプリケーションの実装手順を説明します。

前提条件

以下事項を満たしていることがアプリケーションの実装を行う上での前提条件となります。

・GCPアカウントを持っていること

 GCPを利用するためには、Googleアカウントが必要です。Googleアカウントを持っていない場合は、Googleアカウントの作成ページに移動し、Googleアカウントを取得してください。

・GCPプロジェクトを持っていること

 GCPで利用する全てのリソースはプロジェクトに紐付けされます。GCPプロジェクトが無い場合はプロジェクトの作成と管理から作成してください。

・請求先アカウントを持っていること

 プロジェクト内のリソースの利用料金は、請求先アカウントに課金されます。請請求先アカウントを持っていない場合はセルフサービスの Cloud 請求先アカウントの作成、変更、閉鎖から作成してください。

 

① Cloud Billing データを BigQuery にエクスポートする

まず、対象プロジェクトのBilling画面で「課金データのエクスポート」設定を行います。

必要情報を入力し「データセットを作成」をクリックします。

 

エクスポート設定が完了すると、BigQuery画面の対象プロジェクト配下にエクスポートしたデータセットが作成されます。なお、スキーマは自動で構成されます。

 

② BigQueryのスケジュールクエリをPub/Subトピックにパブリッシュする

Push型のPub/Subトピックを新規作成します。

トピック作成後のトピック一覧画面は以下の通りです。

 

続いて、①で作成したBigQueryのコスト情報データセットに対してスケジュールクエリを作成します。

そして、作成したPub/Subトピックをスケジュールクエリ実行結果の通知先として設定します。

 

③ Pub/SubトピックをトリガーにCloud Functionsを起動する

Pub/Subトピック画面に遷移し、Pub/SubからトリガーするCloud Functionsを新規作成します。

Cloud Functionsの作成が完了すると、一覧画面に以下のように表示されます。

作成したCloud Functionsにースコード(index.js、package.json)をデプロイします。

デプロイ方法は複数の方法から任意で選択できます。

キャプチャはブラウザのインラインエディタを選択していますが、Zipファイルのアップロード、gcloud SDKからコマンド実行等でもデプロイ可能です。

今回利用しているソースコードはGithubのこちらのリポジトリで公開していますので、ご興味のある方はご利用ください。

 

④ Cloud FunctionsからBigQueryのコストデータを取得する

Cloud Functionsで実行されるプログラム(index.js)によってBigQueryからコストデータの取得を行います。

※キャプチャのソースコードはこちら

プログラムの処理は概ね以下の通りになっています。

1.Node.jsのBigQueryクライアントライブラリを利用してBigQueryクライアントを取得する

2.BigQueryのコスト情報テーブルから必要なデータを取得するクエリを作成する

3.2.のクエリを実行しコスト情報を取得する

 

⑤ Cloud FunctionsからTeamsのチャネルにメッセージを投稿する

Teamsで通知を行いたいチャネルの設定画面からIncoming Webhookを作成しURLを取得します。

まず、Teamsの対象チャネルを右クリックし「コネクタ」をクリックします。

続いて、「Incoming Webhook」の「構成」をクリックします。

次に、Incoming Webhookの任意の名前を入力し、画像ファイルをアップロードします。

そして「作成」をクリックします。

作成が完了すると、Incoming WebhookのリンクURLが作成されるのでコピーボタンをクリックします。

コピーしたURLはCloud Functionsのソースコードに利用します。(デプロイ前に取得して反映するようにして下さい)

Cloud FunctionsからTeamsの対象チャネルにメッセージを投稿するソースコード(index.js)は以下の通りです。

※キャプチャのソースコードはこちら

プログラムの処理は概ね以下の通りになっています。

1.④で取得したBigQueryのデータを成形する

2.Teamsの対象チャネルに投稿するメッセージを作成する

3.Node.jsのIncoming Webhookのクライアントライブラリを利用してTeamsの対象チャネルにメッセージを投稿する

 

①~⑤までの実装が完了すると、以下のようにBigQueryのクエリが定期実行され、Pub/Subトピックを介してCloud Functionsが起動しメッセージがTeamsのチャネルに投稿されます。

BigQueryスケジュールクエリの実行

 

Cloud Functionsの起動

 

Teams対象チャネルへのメッセージの投稿

 

まとめ

GCPのサービスを利用して少ない手順で素早くコスト情報連携のアプリケーションを実装することができました。

これによりサービス利用料を毎日コンソール上で確認したりレポートを作成する手間を減らすことができます。

 

また、最近は社内コミュニケーションツールとしてTeamsを利用する企業が増えてきていると感じますし、中にはGCPの利用を検討している方もいらっしゃるかもしれません。

GCPを触ってみたいけど何から手を付けたら良いか迷っている方は、もしご興味がありましたら今回のチュートリアルを試してみてはいかがでしょうか。

 

今回は以上になります。

最後までお付き合いいただきありがとうございました!

 

参考

(公式) BigQuery への課金データのエクスポートで GCP 利用コストを管理

(公式)Node.jsでの依存関係の指定

 package.jsonをCloud Functionsにアップロードすることで外部モジュールの使用が可能です。

(公式)ローカルマシンからデプロイする

 ローカル環境からGCP上にCloud Functionsの資源をデプロイする方法です。

(公式)Functions Framework

 今回は利用していませんがローカルでCloud Functionsを実行できるエミュレータがあるようです。

Cloud Pub/Sub + Node.jsのローカル開発環境の構築

 今回は利用していませんがローカルでPub/Subを実行できるエミュレータがあるようです。

 

RECOMMEND

おすすめ記事一覧