1
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-25

概要

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

Lambdaで関数を作成

関数の作成

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

screencapture-ap-northeast-1-console-aws-amazon-lambda-home-2019-12-25-12_51_41.png
関数名には適当な名前を入力します。今回は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を作成
API Gateway.png
統合タイプをLambdaにして、先ほど作成した関数chatworkNotificationを指定します。
API名は適当な名前をつけてください。残りの作成ステップはデフォルトのままで作成します。

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

GithubのWebhookを設定

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

確認

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

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

参照

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1