Google Cloud Functions を使ってサクッと Slack 通知をカスタマイズする

tanabee
google-cloud-jp
Published in
5 min readJun 9, 2019

--

はじめに

Slack は多くの連携アプリケーションがありますが、そのまま連携すると情報が溢れすぎてフィルタリングしたかったり、より効果的な通知をしたいなど、Slack 通知をカスタマイズしたくなるときがあります。そのような場合、サービス側の Web hooks と Google Cloud Functions を使って Slack 通知をカスタマイズするのがおすすめです。

今回その一例をご紹介します。

例: GitHub の特定のラベルが付いた issue 登録時に Slack 通知する

今回は GitHub の特定のラベルが付いた issue の登録時だけ Slack に issue の内容を通知してみます。バグレポートのラベルがついている issue のみを Slack に通知するために作りました。Slack の GitHub 連携機能ではここまで細かいカスタマイズはできません。

手順

以下の手順で進めます。

  1. Slack の Incoming Webhooks を設定する
  2. Cloud Functions を実装・デプロイする
  3. GitHub の Webhooks を設定する

1. Slack の Incoming Webhooks を設定する

まず Slack に通知されるための受け口を用意します。Incoming Webhooks で通知先のチャンネルを指定して登録します。生成された Webhooks 用の URL を次の手順で使用します。

2. Cloud Functions を実装・デプロイする

Cloud Functions で Webhooks の中継部分を実装します。

以下 30 行ほどで書けます。フィルタリング部分やメッセージ生成部分を書き換えれば他のフィルタ条件を適用したり、メッセージのカスタマイズも可能です。

const request = require('request');

exports.notifyGithubIssueToSlack = (req, res) => {
// フィルタリング部分
if (
req.body.action !== "open" ||
req.body.issue.labels[0].name !== ""// ラベル名を代入
) return res.send(200);
// メッセージ生成
const message = makeMessage(req.body);

// Slack 通知部分
request.post({
uri: "",// Slack の Webhooks URL を代入
headers: { 'Content-type': 'application/json' },
json: { 'text': message }
}, function(err, res, body) {
res.send(200);
console.log(err, res, body);
});
};
// メッセージ生成部分
function makeMessage(body) {
return [
body.issue.user.login + ' さんから新しい調査依頼がありました。',
'```',
body.issue.title,
body.issue.body,
'```',
body.issue.html_url,
].join('\n');
}

実際のコードは GitHub にまとめています。

実装できたら、公式ドキュメントを参考に Cloud Functions にデプロイします。デプロイできたら Cloud Console の Cloud Functions の詳細を開いて URL を控えます。

3. GitHub の Webhooks を設定する

最後に GitHub の Webhooks に 2 で生成された URL を設定をします。登録したいリポジトリを開いて Settings > Webhooks > Add webhook を選択して進めれば OK です。

まとめ

Cloud Functions を使って短いコードで Slack 連携を改善できました。今回は GitHub と連携しましたが、 Slack と連携したいサービスに Webhooks の機能があれば同じように実装できます。コード量も少なく実装できるので色々と試してみてください。

他の例だと diff という Node.js ライブラリを使って PivotalTracker というツールの description の差分を通知するスクリプトを作りました。こちらも GitHub にコードを全文上げていますので参考にしてください。

--

--

tanabee
google-cloud-jp

Vice President, RPG TEC. Google Developers Expert / Licensed Scrum Master / Website: https://tanabee.github.io