Cloud Pub/SubでBigQueryの「スケジュールされたクエリ」の結果をSlack通知する

こんにちは。GMOアドマーケティングのH.Tと申します。
目新しいネタではないのですが、Cloud Pub/SubでBigQueryの「スケジュールされたクエリ」の結果をSlack通知してみたのでご紹介いたします。

きっかけ

BigQueryの「スケジュールされたクエリ」が便利で使っています。
「スケジュールされたクエリ」はクエリ失敗時の通知オプションとしてメールかPub/Subから選べるのですが、システム通知をSlackで受け取りたいのでCloud Pub/Sub→Slack通知の連携を試してみました。

システム連携概要

以下図のとおり、BigQuery→Cloud Pub/Sub→Cloud Functions→Slackという形で連携します。

設定の流れ

1.まず、受け取りたいslackのwebhook urlを用意しておきます。
(slack側の準備は本記事では割愛させていただきます。)

2.BigQueryの「スケジュールされたクエリ」のPub/Sub設定項目を確認。
以下のとおり、Pub/Subのトピック名を入力する欄があるのでこれからPub/SubとCloud Funcitonsの設定をしていきます。

3.Cloud Pub/Subサービスを有効にして「トピックを作成」ボタンを押します。

4.「トピック ID」に適切な名前を入力します。「デフォルトのサブスクリプションを追加する。」のチェックは今回は不要なので外します。

5.トピックが作成できたら詳細画面に入ります。詳細画面から「CLOUD 関数をトリガー」ボタンを押します。

6.Cloud Functionsの設定画面になります。
関数名を設定します。
「失敗時に再試行する。」の挙動は検証していないので今回は外しました。
トピックはあらかじめ設定されています。
「保存」を押します。

7.「次へ」ボタンを押してコードの入力画面へ移動します。

8.コードの入力画面
関数の言語はnode.jsがデフォルトになっていますのでそのままnode.jsで実装したいと思います。
最初から受け取ったメッセージをconsole.logしているサンプルコードが入っていますが今回は特に消す必要もないのでここにslackへpost送信するコードを追加します。

9.以下のようにソースコードを書いたら「デプロイ」ボタンを押してデプロイします。

10.デプロイが完了して関数の一覧に「sendSlack」という関数ができています。

11.それでは関数のテストをしてみたいと思います。
まず右端の「操作」から「関数をテスト」ボタンを押します。

12.関数の詳細画面に移動するのでさらに下の「関数をテストする」ボタンを押します。

13.問題なくいけば「出力」に「完了」という表示が出てSlack通知が来るはずです。

14.Slackがきました。
テストなのでイベントの内容ではなく「Hello, World」の文字列が渡ってきています。

15.ここまででCloud Pub/Sub→Cloud Functionsの設定ができたので次にBigQueryから通知するトピックを設定します。
Cloud Pub/Subのトピック一覧画面に移動し、トピック名をコピーしておきます。

16.BigQueryで「スケジュールされたクエリ」を作っていきます。
BigQueryのクエリエディタで定期実行したいSQLを書いたら「スケジュールされたクエリを新規作成」ボタンを押します。

17.「スケジュールされたクエリ」の通知オプションを設定します。
「15.」でコピーしておいたトピック名を通知オプションの「Cloud Pub/Sub トピック」に入力して「スケジュール」ボタンを押せばBigQueryとCloud Pub/Subの連携が完了します。

以上となります。
これで安心して運用ができるかと思います。

読んでいただきありがとうございました。