Lambda で Chatwork の新しいメッセージを Slack に通知してみる。

## <i class="fa fa-cube"></i> はじめに
さいきん何かと話題の Serverless に入門したいと思い。
とりあえず、何かやってみよう！ということで、Lambda で身近な課題を解決してみました。
全然関係ないですが。Lambdaを入力するとき、私は心のなかで「ラムバダ」と唱えています。

### <i class="fa fa-bolt"></i> 発明のおかん
業務では主にSlackを使用しているのですが、お客さんの中にはChatworkを常用されているところもあります。
できるだけ、使用するツールを少なくしたいというのと。マシンに優しくしたいということもあり。
できれば、全てのメッセージをSlackでやりたいなと思いました。
ですが。Chatworkへのメッセージの送信をSlackからするのはなかなか難しいかな。。。と思い。。。
Chatworkが更新されたら、通知を受け取って、そのときに初めてChatworkを開くような状態にしたいな（必要だな）と考えるようになりました。

### <i class="fa fa-question-circle" aria-hidden="true"></i> Lambdaにした経緯
こういった場合、主にifttt（[Discover IFTTT and Applets - IFTTT](https://ifttt.com/discover)）を使用しているのですが、どうもChatworkはiftttに対応されていないようで難しそうです。
APIも調べてみました([チャットワークAPIドキュメント](http://developer.chatwork.com/ja/))が、通知をしてくれるような実装はいまのところないようでした（Chatworkさん、今後の機能追加に期待しております）。
Zapier（[The best apps. Better together. - Zapier - Zapier](https://zapier.com/)）には対応しているようですが、Zapierの無料枠ではちょっと物足りなさそうでした。
そこで、候補に上がったのがLambdaです。
Lambdaを利用すれば、無料枠の範囲で収まりそうだったし、話題の技術ということもあって使ってみることにしました。

## <i class="fa fa-cube"></i> 主な構成

こんな感じ。

![cloudcraft.png](https://qiita-image-store.s3.amazonaws.com/0/21230/73a3c730-af86-c5cc-f6db-be7d558fec0c.png)
(この図いらんかな。。。ｗ）

LambdaでChatowrkのAPIを定期的にチェックして、新しいメッセージがあればSlackに通知します。

Chatwork の API で差分のみを取得してくれるという、ちょうど良さそうなのがあったため、こちらを使うことにしました（おそらくこういった用途を想定されている感じですね）。

> チャットのメッセージ一覧を取得。パラメータ未指定だと**前回取得分からの差分のみ**を返します。(最大100件まで取得)
> http://developer.chatwork.com/ja/endpoint_rooms.html#GET-rooms-room_id-messages

## <i class="fa fa-cube"></i> で、いきなり完成

で、いきなりじゃじゃーんと完成したコードを掲載しておきます。

[Gist: chatwork-to-slack.js](https://gist.github.com/toshima66/4c4df7302ae89f5f53935e4938f92332)
https://gist.github.com/toshima66/4c4df7302ae89f5f53935e4938f92332

時間があまりなかったため、いまいちな内容ですが。。
とりあえず、Token情報などを書き換えれば、すぐに動くものを作ってみました。

### <i class="fa fa-bolt"></i> ChatworkとSlackの準備
本題ではないため、すっ飛ばしますが。
実際に動かすには Chatworkのtokenと、Slackのweb hook urlが必要です。


##  <i class="fa fa-cube"></i> さっそく使ってみる

:one: Lambdaを新規作成
<img width="1440" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/21230/e9514e96-cea4-e309-4b14-50bb16ba6416.png">

:two: Blank Function を選択
<img width="1440" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/21230/fd6265e4-dfd8-d8f9-21ba-8cf4ef162c6b.png">

:three: Trigger に CloudWatch Events - Schedule を選択
<img width="980" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/21230/493126ee-f371-5b38-b62a-34f7c6597b3d.png">

:four: Schedule expression に rate(15 minutes) を選択
15分毎にLambdaが起動されるの意味なので、選択はお好みで。
<img width="934" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/21230/9261da21-eec3-3d2f-7c4f-9536d28274fb.png">

:five: 適当な名前をいれて、コードを先程のものに全て入れ替え
<img width="973" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/21230/7dde51da-7e88-f548-5a67-a3dd66889fcb.png">

:six: 下の方にいって、適当なRoleを選択（なかったら作る)、Timeout時間を30秒に変更
<img width="941" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/21230/6bba06b3-35b3-09db-9c22-9dd4ac8f3aed.png">

:seven: Next → Create
完成！
なのですが、実際には少し時間がかかるみたいです。

あとは、Functionを選択してTestしてみたりして楽しみましょう。

### <i class="fa fa-slack" aria-hidden="true"></i> 私のSlackに通知が来たところ
<img width="688" alt="Slack_-_6vox.png" src="https://qiita-image-store.s3.amazonaws.com/0/21230/74d4889b-c300-98e7-b900-236f1e60e61b.png">


## <i class="fa fa-cubes"></i> まとめ
簡単なコードを書くだけで、気軽にサーバーレスを楽しめますね！
Lambdaすごく便利です。
実際、Nodeの中身を記述するのは結構めんどくさかったりしますが。。
ちょっと遊んで体験してみるには十分かなと思いました。

本格的にやるときはこのあたりを使ってデプロイを自動化したり、テスト書いたりしていくといい感じになりそうです。

[Serverless - The Serverless Application Framework powered by AWS Lambda and API Gateway](https://serverless.com/)

もうちょっと。遊んでみようと思います。

## <i class="fa fa-space-shuttle"></i> 最後に。
Shinosaka.rb では、Rubyにかぎらずみんなでいろいろなものにチャレンジして（あそんで？）います。
最近はReactの話題が多めかな？ｗ

[Shinosaka.rb | Doorkeeper](https://shinosakarb.doorkeeper.jp/)

忘年会の席があと５つほど空いていますね！（2016/12/23現在）
本コミュニティのいわゆる本番というやつですねｗ

みなさんも、楽しい会にぜひご参加いただければと思います。