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

# 概要
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/8e5c1293-7a1d-d0de-6a67-f014e49d9f20.png)
関数名には適当な名前を入力します。今回は`chatworkNotification`にしておきます。
関数に使う言語は、使ってる人が多そうだったためNode.jsにしました。

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

```js: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'`になりますが、他にもタスク追加なども可能なので、[チャットワークのドキュメント](http://developer.chatwork.com/ja/endpoint_rooms.html)を確認しながら、やりたいことに合わせてみてください。

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

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

# API Gateway
Amazon API Gateway > API > APIを作成
![API Gateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/92b04aeb-1781-23b1-d167-adf6cfe19caa.png)
統合タイプをLambdaにして、先ほど作成した関数`chatworkNotification`を指定します。
API名は適当な名前をつけてください。残りの作成ステップはデフォルトのままで作成します。

![API Gateway (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/2f28b976-09ab-bd5c-453c-5d27970ff8b1.png)
APIを作成するとエンドポイントURLが作成されるので、のちにWebhookの設定の際には、このURLにアクセスするように設定します。

# GithubのWebhookを設定
対象Repository > Settings > Webhooks > Add webhook
![Add webhook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/42fc9ea7-1913-04e7-4711-738b471c4ccf.png)
Payload URLは、先ほど作成されたURLにLambda関数が紐づいたパスを指定します。
ex.) https://xxx.execute-api.ap-northeast-1.amazonaws.com/chatworkNotification
今回はissueに対するコメントだけを拾いたいのでトリガーはIssue commentsを選択します。

# 確認
一通りの設定は終了です。
あとはissueにコメントを追加してみてチャットワークに通知が飛んでくれば完了です。
![_チャットワーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/b86cc1b8-7bc3-ca58-1db4-a0927447cf04.png)

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




# 参照
* [GitHub のメンションを Slack へ通知する](https://qiita.com/hkusu/items/a899e51bdd260ab908d7)
* [AWSのLambdaの動作をHelloWorldで理解する](https://qiita.com/zaburo/items/d31c1cb2055143991dfb)
* [[Sy] ChatWork に通知を送る（ Web API + Node.js )](https://utano.jp/entry/2018/02/js-lib-chatwork/)
* [LambdaからChatworkにメッセージを投稿](https://qiita.com/tenbo07/items/5c7da35c7d0984b5350a)