Slackの分報をesaの日報にするやつをDockerとArukasで雑に動かす
TL;DR
- Slackの分報をesaの日報にするやつつくったよ
- izumin5210/hitorigoto-reporter (GitHub / Docker Hub)
- ちゃんと環境変数セットしてArukasでホスティングすれば誰でも簡単に利用できるよ
Introduction
『Slackの分報をesa.ioに日報としてあげてくれるやつ書いた - 人権を得たいゴミ』にあるようなやつをもっと雑に使えるように実装した.
izumin5210/hitorigoto-reporter (GitHub / Docker Hub)
適当に環境変数渡してあげれば,cronで指定した時間(デフォルトだと23:50)に指定したchannelごとにその日の投稿を日報としてまとめてくれる(channelは複数指定可).
Preparation
esa.io のPersonal Access Token取得
設定画面から.権限はwrite
だけあればいい.
ちなみに,このAccess Tokenの持ち主 == 日報の投稿者になる.
SlackのAccess Token取得
『Slack Web API | Slack』下部にTokenを生成するページヘのリンクがある.テスト用Tokenとあるけど,一応そのまま使える.
当然だけど,そのアカウントから見ることができるChannelしか扱えないので注意(権限無い場合にどうなるかは検証してない).
Deployment
自分でVPSとかサーバ持ってるなら適当にdocker-compose up
してあげればいい.ないならさくらインターネットさんのDockerホスティングサービス『Arukas』を利用すれば楽.
- imageにizumin5210/hitorigoto-reporter:1.0を指定
- 5つの環境変数を適切に設定
SLACK_TARGET_CHANNELS
についてはセミコロンで区切ってあげれば複数選択可ESA_REPORT_CATEGORY
はそのままRubyのTime#strftime
に投げ込まれるので,そこで使える記法はすべて利用可能- その他の変数は読んで字のごとく(
SLACK_ACCESS_TOKEN
,ESA_CURRENT_TEAM
,ESA_REPORT_CATEGORY
)
- PortはUDPに設定しておく
- TCPにするとヘルスチェックが動くので,EXPOSEしてないと起動しなくなる
これだけでOK.
あとは放っておけば毎晩23:50に指定したchannelの投稿をまとめてesaに投稿してくれる. ちなみにこのcronの時間設定はdocker imageのbuild-argsで変更できる(逆に言うと,投稿時間を変えたければbuild-argsの値を変えて再buildしてdocker hubに自分でpushするしかない).
Implementation
Ruby script
slack-apiとesaと両方の実装が揃っているRubyで書いた.tokenやその他設定値はすべて環境変数から読むようにした.これ以上特筆することはないけど,まあそこそこに丁寧に書いたので興味ある人は見てみて(?)
Docker image
雑にデプロイできるようにDocker imageも用意した.Alpine Linuxベースになっている(が,なぜか重い).ハマリポイントは以下2つ:
- slack-apiがfaye-websocketを利用するため,eventmachineが依存関係に入り込みnative extensionまわりの対応が必須
- Building EventMachine · eventmachine/eventmachine Wiki
- 今回は検索クエリ投げるだけなので,Slackまわりは自前で書いたほうが楽だったかもしれない
- Rubyスクリプトをcronから叩くときのgemまわりのパス問題
- docker build時にいい感じにシェルスクリプトに書き出しておく(Dockerfile#L20)
また,Docker hubからpullしてrunするだけで誰でも使えるように,環境変数は実行時に読むようにした(docker-compose.yml#L8-L13).
Conclusion
Arukasはしばらく無料使い放題なのでべんり. DockerコンテナをHerokuレベルで雑にホスティングできるところって現状ではArukasぐらいしか思いつかないので,10 USD/monthぐらいでいっぱいアプリ作れるプランとかあれば即契約する と思う. こういう雑なbotを雑にdeployしまくりたいので,もうちょっとスペック低いのが便利かなともちょっと思った(AWS Lambdaにいれるべきかもだけど,あれは完全にロックインされるし変な書き方しなきゃだし個人のおもちゃとして使うにはちょっと手間かかるイメージ).