GitHub+API Gateway+LambdaでSlackに通知を投げてみた

チーム開発でGitHubを使用していると、メンバーが増えるにつれてメール通知の量が多くなってしまいがちではないでしょうか。

あっそれ見落としてました!今から確認します!」みたいなやりとりをした経験もあるのではないでしょうか。

メールを頻繁にチェックしていれば良いですが、忙しいとそうも言っていられないのが現実です。

そこで、GitHub上で何かイベントが起きたらSlackに通知が来るような仕組み があるとなかなか良さそうです。

Slack用GitHubアプリを使用することでGitHub上のアクションをSlack通知することが簡単に出来るのですが、せっかくGitHubがwebhookを提供しているので、API GatewayとLambdaを使用したSlackへの通知をやってみようと思います。

構成図

GitHub上のイベントをAPI GatewayとLambdaを通してSlackに通知する構成を作ってみます。

やってみた

以下の様に進めていきます。

  1. Slackにwebhookアプリ追加
  2. Lambda関数の作成
  3. API GatewayでAPIの作成
  4. GitHubでwebhook設定

1. Slackにwebhookアプリ追加

Slackのサイドメニューの [+アプリを追加する] を押下し、検索画面で「Incoming Webhook」を探してインストールします。

インストール後、以下の様な設定画面が表示されるはずなので、メッセージを投稿したいチャンネルを選び、「Incoming Webhookインテグレーションの追加」を押下します。今回は、事前に作成しておいた「#webhook-test」チャンネルを選びます。

上記のボタン押下後、「Webhook URL」なるものが表示されました。これは後々使うのでメモっておきます。

slackの設定はここまでになります。

2. Lambda関数の作成

Lambdaのコンソール画面にて関数を作成していきます。

関数名は「github-webhook」、ランタイムは「Python 3.7」を選びます。

slackのwebhook URLに対してPOSTを行う以下の関数を作成します。

上記は、渡されたeventをそのままメッセージとしてslackに送信する関数です。

slackのwebhook URLに対してデータを送信するために、payloadパラメータに

  • channel ... 送信先のチャンネル
  • username ... slack上に表示されるユーザー名
  • text ... メッセージの本文

を持つJsonを指定します。アイコンの指定も可能です。

コンソール上では以下の様になります。作成後、[保存]を押下します。

作成したら、試しにこの関数をテストしてみます。

画面右上の [テスト] を押下すると、以下の様な画面が開くのでイベント名を入力して [作成] を押します。

イベント名は slackWebhookTest にしておきます。

作成したテストイベントを選択して[テスト] を押下します。無事成功したので、画面に成功したことを知らせる実行結果が表示されました。

slack上にも、テストイベントで設定したjsonがそのままメッセージとして表示されています。楽しくなってきました。

3. API GatewayでAPIの作成

Lambdaからslackにメッセージを送ることが出来る様になったので、API GatewayでAPIを作成していきます。

Amazon API Gateway のコンソール画面にて [APIの作成] を押下し、API名以外はデフォルトのまま作成します。

作成後、「リソース」画面にて [アクション] > [メソッドの作成]

GitHubからはPOSTでリクエストが飛んでくるので、POSTメソッドを選択して [✔︎] ボタンを押下します。

作成されたメソッドを選択するとセットアップ画面が表示されるので、先ほど作成したLambda関数を入力して保存。

「Lambda関数を呼び出す権限を与えようとしています」の様なポップアップが出たらこれも[OK]。

上記の操作後、この様な画面になりました。細かいことは考えずに、[テスト] をクリックしてみます。

リクエスト本文を入力する箇所がありますので、適当なJsonを入力して [テスト] してみます。

何事も無ければ、先ほど作成したLambda関数を通して、Slackに通知が行くはず。

Slackに通知が来ました!これで、API Gatewy -> Lambda -> Slack の連携まで確認することが出来ました。

連携が出来ていることが確認出来たので、GitHubからリクエストを投げる為にAPI Gatewayのエンドポイントを作っていきます。

リソースページに戻り、[アクション] > [APIのデプロイ] を選びます。

「APIのデプロイ」というポップアップが表示されるので、

  • デプロイされるステージ ... [新しいステージ]
  • ステージ名 ... dev

を入力して [デプロイ] を押下します。

すると、ステージエディターというページが表示され、上部にURLが表示されます。

これで、外部からでもこのAPIを呼び出せる様になったはずです。

試しに、このURLに対してPOSTしてみます。

Slackに通知が来ました!(同じJsonでリクエストしてしまったので分かり辛い。。。)

外からAPIを呼び出してSlackに通知を送ることが出来たので、API Gatewayの設定は終わりです。

4. GitHubでwebhook設定

ではいよいよGitHub上の設定をやっていきます。あまりやることないですが

GitHub上でリポジトリを開き、 [Settings] -> [Webhooks] を選択します。

右上にある [Add webhook] を押下すると以下画面が表示されるので、各項目を入力していきます。

  • Payload URL ... 上で作ったAPI Gatewayのエンドポイント
  • Content type ... application/json
  • Which events would you like to trigger this webhook? ... Let me select individual events.

「Which events would you like to trigger this webhook?」にて [Let me select individual events.] を選択するとどのイベントが発生した時にイベント通知をPOSTするか選ぶことが出来ます。結構色々あるので面白いです。

今回は

  • Issues
  • Issue comments

を選択しておきます。

入力したら、[Add webhook] を押下。

適当にissue作ってみます。

slackに通知が届きました!当たり前ですが、リクエスト内容を一切整形していないのですごいJsonが飛んできました。

中身をみてみると、"action":"opened" や "title":"make new issue!!" が確認出来るので、先ほど作成したissueに関する通知であることが確認できます。

晴れて、今回の目的である「GitHub上のイベントをAPI GatewayとLambda経由でSlackに通知する」が出来ました!

まとめ

やってみる前は「webhookって難しそう。。。。」「Slack通知?どうやるんだ。。。」「API GatewayとLambda連携???」みたいな気持ちでしたが、いざやってみるとそこまで難しいこともなくSlack通知を行うことが出来ました。

LambdaでJsonの中身を見て通知の内容を変えるとか、SNSを挟んでみたりとか、これをベースに色々面白そうなことが出来そうです。

Slack用のGitHubアプリじゃ何か物足りない。。。と思っている方は、是非自前のSlack通知を試してみてはいかがでしょうか。

以上、AWS事業本部の大前でした!