2020/12/04

Google Cloud FunctionによるCloud MonitoringからMattermostへの通知送信

はじめに

Serverlessは最近のソフトウェア開発コミュニティで最もホットなキーワードの1つです。Serverlessとは何でしょうか。その名称の通りにアプリを開発する際に、サーバーが必要ないことです。実は、ここの「必要ないこと」とは「気にしなくてもいい」という意味で、開発者がサーバーとデプロイプロセス等を調査、設計、設定せずに、コードをプッシュするだけでいいのです。その他はクラウドプロバイダーのServerlessサービスが対応します。現在、「AWS」、「Azure」、「Google Cloud」はServerlessサービスを提供しています。今日の記事では、Cloud Functionの概要を紹介し、このサービスで簡単なアプリケーションの作成を説明します。

Google Cloud Function

現在、GoogleはGoogle Cloud Run、App Engine、Cloud Functionの3つのServerlessサービスを提供しています。これら3つのサービスの違いについては以下の図(Googleによる提供)をご参照ください。

上記の3つのオプションでGcloud Functionは最も単純なオプションであり、デプロイ単位が関数でイベントを処理ことに適しています。簡単に言うと、関数を記述して、その関数がデプロイされ、GGCloud Functionsがその関数を実行してくれます。
現在、GCloud Functionは、関数を処理するためのGo、Node.JS、Pythonの3つのランタイムをサポートしています。コードの作成とデプロイは非常に簡単です。Google自体のHello Worldをサンプルとして参照できます。

まず、GoogleのCloud SDKをインストールし、GCloud Functionをテストできるようにプロジェクトを初期化する必要があります。これは当たり前に部分なので、ここで詳しく説明しません。

以下の内容を含むhelloworld.go ファイルが1つ入るhelloworldフォルダーを作成します。

HelloHTTP関数は、次のコマンドでGCloudに簡単にデプロイできます。

ここで、関数に選択されたランタイムはgo 1.13であり、関数のトリガーはHTTPになります。つまり、この関数は受信したHTTPリクエストを処理します。 関数をデプロイした後は以下のようにHTTPエンドポイントが1つ存在します。


このエンドポイントへリクエストを送信することでテストできます。


情報の送受信用のGoogle Cloud Function の使用

すでにGoogle Cloudを使用している場合は、Googleのシステム監視サービスであるCloud Monitoringを必ず使用する必要があります。このサービスは、システムステータスを監視し、CPU、メモリの合計使用量が特定のしきい値を超える時などに通知を作成します。ただし、現在、通知チャネルリンクはMattermostのWebhook(当社がホストして使う無料のスーパーチャットプログラム)はサポートしておらず、特定のチャネルのみをサポートしています。それで、Google Cloudを使っているWebhookを作成して、このWebhookでMattermostに投稿することにしました。
まず、MattermostでIncomming Webhookを作成します。

次に、別関数の作成を開始します。もう少しセキュリティを強くするためにparamトークンを追加してアクセス権限をチェックします。


Cloud Monitoringへのリクエスト解析

Cloud MonitoringからWebhookに送信するリクエストの形式は以下の通りです。

従って、データを解析するために上記と同様な構造体を定義する必要があります。

AlertFunc関数に戻ると、Cloud Monitoringから送信される解析リクエストも非常に簡単です。

Mattermostへのデータ送信

MattermostのWebhookにデータを送信するのも簡単です。
以下の形式のjsonデータでリクエストを送信すると、Mattermostは、このWebhook用に設定されたアカウントと設定に従ってメッセージを投稿します。

 

AlertFuncでデータを送信するコードは以下の通りです。

次に、必要な環境変数を格納するためにenv.yaml ファイルを以下のように作成します。


すると、Google Cloudに関数をデプロイできます(SDKをダウンロードし、プロジェクトを作成する必要があります)。

 

トリガーオプションがHTTPなので、関数が以下のアドレスにデプロイされます。

Cloud Monitoringでの設定と結果

Google Cloudの管理画面から、 Monitoring → Alert → Edit Notification Channel(https://console.cloud.google.com/monitoring/alerting/notifications)にアクセスし、デプロイした関数を使ってWebhook Notification Channelを作成できます。

アラートがある時、Mattermostは設定されたチャネルにテキストメッセージとしてアラートを以下のようにプッシュします。

まとめ

GoogleCloud Functionを使用して、データ送受信用のWebhookを簡単に作成できます。シンプルでステートレスなイベント処理の場合、Google Cloud Functionは合理的なソリューションであり、従来のデプロイオプションに比べて多くの利点があります。より複雑な処理の場合は、Google Cloud RunとApp Engineがより適切なServerlessオプションになります。