※この記事は「AltPlus Advent Calendar 2016」の11日目の記事です。
こんにちわ、 id:thashimotoです。
社内共通で使用できる メッセージ通知用のbotをchatworkで設定しようとしたのですが
chatworkでは、アカウント毎にAPIトークンが発行されるため
APIトークンを社内で公開してしまうと、bot用アカウントの入っているチャットルームの情報へは
アクセスができてしまうので、それを回避するため下記要件で設定したときのログになります。
- 監査用ログ取得、実行できるAPIの制限(メッセージ通知のみ)、chatworkAPIトークンを展開しない
設定中、引っかかったところなどを書きたいと思います。
構成
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"
感想
- 今回、仕組みが簡単だったためサーバを設置したくなかったので
データストア含めて、サーバレス的な形で設定できて運用もあまり手間がかからないので便利そうでした。 - 今後もグルー的な対応で問題ない場合は、運用が楽なのでこういった形で対応していければと思いました。