Subscribed unsubscribe Subscribe Subscribe

Augmented Usamimi

it { is_expected.to be_blog.written_by(izumin5210) }

Slackの分報をesaの日報にするやつをDockerとArukasで雑に動かす

Docker Ruby

TL;DR

Introduction

Slackの分報をesa.ioに日報としてあげてくれるやつ書いた - 人権を得たいゴミ』にあるようなやつをもっと雑に使えるように実装した.

izumin5210/hitorigoto-reporter (GitHub / Docker Hub)

適当に環境変数渡してあげれば,cronで指定した時間(デフォルトだと23:50)に指定したchannelごとにその日の投稿を日報としてまとめてくれる(channelは複数指定可).

Preparation

esa.io のPersonal Access Token取得

設定画面から.権限はwriteだけあればいい. ちなみに,このAccess Tokenの持ち主 == 日報の投稿者になる.

f:id:izumin5210:20160607202227p:plain

SlackのAccess Token取得

Slack Web API | Slack』下部にTokenを生成するページヘのリンクがある.テスト用Tokenとあるけど,一応そのまま使える.

f:id:izumin5210:20160607202319p:plain

当然だけど,そのアカウントから見ることができるChannelしか扱えないので注意(権限無い場合にどうなるかは検証してない).

Deployment

自分でVPSとかサーバ持ってるなら適当にdocker-compose upしてあげればいい.ないならさくらインターネットさんのDockerホスティングサービス『Arukas』を利用すれば楽.

  • imageにizumin5210/hitorigoto-reporter:1.0を指定
  • 5つの環境変数を適切に設定
    • SLACK_TARGET_CHANNELSについてはセミコロンで区切ってあげれば複数選択可
    • ESA_REPORT_CATEGORYはそのままRubyTime#strftimeに投げ込まれるので,そこで使える記法はすべて利用可能
    • その他の変数は読んで字のごとく(SLACK_ACCESS_TOKEN, ESA_CURRENT_TEAM, ESA_REPORT_CATEGORY
  • PortはUDPに設定しておく
    • TCPにするとヘルスチェックが動くので,EXPOSEしてないと起動しなくなる

これだけでOK.

f:id:izumin5210:20160607202358p:plain

あとは放っておけば毎晩23:50に指定したchannelの投稿をまとめてesaに投稿してくれる. ちなみにこのcronの時間設定はdocker imageのbuild-argsで変更できる(逆に言うと,投稿時間を変えたければbuild-argsの値を変えて再buildしてdocker hubに自分でpushするしかない).

Implementation

Ruby script

slack-apiesaと両方の実装が揃っているRubyで書いた.tokenやその他設定値はすべて環境変数から読むようにした.これ以上特筆することはないけど,まあそこそこに丁寧に書いたので興味ある人は見てみて(?)

Docker image

雑にデプロイできるようにDocker imageも用意した.Alpine Linuxベースになっている(が,なぜか重い).ハマリポイントは以下2つ:

また,Docker hubからpullしてrunするだけで誰でも使えるように,環境変数は実行時に読むようにした(docker-compose.yml#L8-L13).

Conclusion

Arukasはしばらく無料使い放題なのでべんり. DockerコンテナをHerokuレベルで雑にホスティングできるところって現状ではArukasぐらいしか思いつかないので,10 USD/monthぐらいでいっぱいアプリ作れるプランとかあれば即契約する と思う. こういう雑なbotを雑にdeployしまくりたいので,もうちょっとスペック低いのが便利かなともちょっと思った(AWS Lambdaにいれるべきかもだけど,あれは完全にロックインされるし変な書き方しなきゃだし個人のおもちゃとして使うにはちょっと手間かかるイメージ).