オルトプラスエンジニアの日常をお伝えします!

lambda + kintone で chatwork へメッセージのみ送信できるようにしてログを残す

※この記事は「AltPlus Advent Calendar 2016」の11日目の記事です。


こんにちわ、オルトプラスではインフラ周りの対応をしている id:thashimotoです。

社内共通で使用できる メッセージ通知用のbotをchatworkで設定しようとしたのですがchatworkでは、アカウント毎にAPIトークンが発行されるため
APIトークンを社内で公開してしまうと、bot用アカウントの入っているチャットルームの情報へはアクセスができてしまうので、それを回避するため下記要件で設定したときのログになります。

  • 監査用ログ取得、実行できるAPIの制限(メッセージ通知のみ)、chatworkAPIトークンを展開しない

設定中、引っかかったところなどを書きたいと思います。

構成

  • APIGateway
  • lambda
  • kintone
  • f:id:thashimoto:20161209172757p:plain

APIGateway

  • chatworkのAPIトークンをそのまま配布してしまうと、chatworkのAPIがすべて使用できてしまうため今回は、メッセージ通知のみできればよかったので、 APIGatewayの APIキーを使用して認証の対応を行いました。
  • 本文マッピングテンプレートは下記の形で設定、始め仕組みを理解していなかったためこの辺りの lambda側での受け取り方で引っかかっていました。
# Content-Type : application/json
{
"room_id" : $input.json('$.room_id'),
"body" : $input.json('$.body'),
"sourceIp" : "$context.identity.sourceIp"
}
  • lambda側値受け取り
option = "body="+str(event['body'])
room_id = str(event['room_id'])
sourceIp = str(event['sourceIp'])

lambda

  • 言語は pythonを使用したのですが 使ったことがなく curlの使いかたがすぐはわからなかったのですが最終的に pycurlが使えたので下記のように対応(今回はファイルアップは行わず webページ上で設定していました)
import pycurl
# chatwork post
c = pycurl.Curl()
c.setopt(pycurl.URL, chatwork_url)
c.setopt(pycurl.HTTPHEADER, ['X-ChatWorkToken: '+CHATWORK_TOKEN+''])
c.setopt(pycurl.POST, 1)

c.setopt(pycurl.POSTFIELDS, post_text)
c.perform()
  • lambda上で botの語尾を付けたのですが文字化けしていたので url_encodeしたものを文字連結する形で対応しました。

kintone

  • データストアとして使用
  • 特にひっかかったところはありませんでした。
  • 簡単に集計してグラフ表示までできるので便利でした。

curlで実行

curl -H "Content-Type: application/json" -H "x-api-key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -X POST -d '{ "body": "body test","room_id": "1111111111111"}' "apigateway endpoint url"

感想

  • 今回、仕組みが簡単だったためサーバを設置したくなかったのでデータストア含めて、サーバレス的な形で設定できて運用もあまり手間がかからないので便利そうでした。
  • 今後もグルー的な対応で問題ない場合は、運用が楽なのでこういった形で対応していければと思いました。