Githubのisuueのコメント時に、Lambdaを使ってチャットワークに通知されるようにしてみた


概要

Github Webhook -> AWS API Gateway -> Lambda -> Chatwork
という構成で、チャットワークにgithubからコメントがあったことを通知できるようにします。
Chatwork APIが使用可能な前提になっています。

Lambdaで関数を作成

関数の作成

AWS Lambda > 関数 > 関数の作成 から関数を作成します。


関数名には適当な名前を入力します。今回はchatworkNotificationにしておきます。
関数に使う言語は、使ってる人が多そうだったためNode.jsにしました。

関数コード

今回はコードエントリタイプをコードをインラインで編集にして、aws上でコードを追加します。

index.js
const https = require('https');
const host = 'api.chatwork.com';
const TOKEN = process.env['CHATWORK_TOKEN'];
const ROOM_ID = process.env['ROOM_ID'];
const path = '/v2/rooms/' + ROOM_ID +'/messages';

exports.handler = function(event) {
  const content = JSON.parse(event.body);
  const messageBody = content.comment.body;

  if (messageBody.match('@account') && content.action === 'created') {

    const issueTitle = content.issue.title;
    const issueUrl = content.issue.html_url;
    const postData = 'body=[To:{account_id}] ○○さん\n' + issueTitle + 'にコメントが追加されました。\n' + issueUrl;

    var options = {
      host: host,
      path: path,
      port: 443,
      method: 'POST',
      headers: {
        'X-ChatWorkToken': TOKEN,
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };

    let req = https.request(options, (res) => {
      console.log('status code : ' + res.statusCode);
      res.setEncoding('utf8');
      res.on('data', (d) => {
        console.log(d)
      });
    });

    req.on('error', (e) => {
      console.error(e);
    });

    req.write(postData);
    req.end();

  }
};

HTTPSモジュール

今回はnode.jsの標準モジュールのhttpsを呼び出して使っています。(他のモジュールを準備するのが面倒だったため)

環境変数

  • CHATWORK_TOKEN:チャットワークのAPI設定>API Tokenから確認できます
  • ROOM_ID: チャットワークで通知したい先のルームID

今回はチャットワークへのメッセージ追加になるのでパスは/v2/rooms/' + ROOM_ID +'/messages'になりますが、他にもタスク追加なども可能なので、チャットワークのドキュメントを確認しながら、やりたいことに合わせてみてください。

通知される条件を設定

ifの条件としてmessageBody.match('@account')を入れてるのは、特定のユーザーをメンションした時だけ通知するようにしたかったためです。
content.action === 'created'は、コメントの編集時は通知したくなかったため、新規コメントのみに限定しました。
github webhookのjsonの構造はドキュメントに載っているので、通知メッセージに記載したい内容に合わせてデータを取得するようにしてください。

チャットワークのメンション設定

チャットワークで通知される際に、TOをつけたかったため通知メッセージに[To:{account_id}] ○○さんをそのまま記載しました。

API Gateway

Amazon API Gateway > API > APIを作成

統合タイプをLambdaにして、先ほど作成した関数chatworkNotificationを指定します。
API名は適当な名前をつけてください。残りの作成ステップはデフォルトのままで作成します。


APIを作成するとエンドポイントURLが作成されるので、のちにWebhookの設定の際には、このURLにアクセスするように設定します。

GithubのWebhookを設定

対象Repository > Settings > Webhooks > Add webhook

Payload URLは、先ほど作成されたURLにLambda関数が紐づいたパスを指定します。
ex.) https://xxx.execute-api.ap-northeast-1.amazonaws.com/chatworkNotification
今回はissueに対するコメントだけを拾いたいのでトリガーはIssue commentsを選択します。

確認

一通りの設定は終了です。
あとはissueにコメントを追加してみてチャットワークに通知が飛んでくれば完了です。

まとめてみると結構簡単にできますね。(私は結構時間かかりましたが、、)
slackに通知を飛ばす記事はいっぱいありましたが、チャットワークに通知する記事が少なく感じたのでまとめてみました。

参照