こんにちは。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の設定画面になります。
関数名を設定します。
「失敗時に再試行する。」の挙動は検証していないので今回は外しました。
トピックはあらかじめ設定されています。
「保存」を押します。
8.コードの入力画面
関数の言語はnode.jsがデフォルトになっていますのでそのままnode.jsで実装したいと思います。
最初から受け取ったメッセージをconsole.logしているサンプルコードが入っていますが今回は特に消す必要もないのでここにslackへpost送信するコードを追加します。
9.以下のようにソースコードを書いたら「デプロイ」ボタンを押してデプロイします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/** * Triggered from a message on a Cloud Pub/Sub topic. * * @param {!Object} event Event payload. * @param {!Object} context Metadata for the event. */ const request = require('request'); exports.sendSlack = (event, context) => { const message = event.data ? Buffer.from(event.data, 'base64').toString() : 'Hello, World'; console.log(message); request({ url: 'https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxxxxxx', method: 'POST', headers: {'Content-Type': 'application/json' }, body: JSON.stringify({ text: 'event message from bigquery: ' + message }) }, (error, response, body) => { console.log(error, response, body) }); }; |
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の連携が完了します。
以上となります。
これで安心して運用ができるかと思います。
読んでいただきありがとうございました。