Ponz Dev Log

ソース派のシステムエンジニアの開発日記

自分の勤怠状況を Kubernetes, Slack, Metabaseで可視化

システム構成はタイトル通りで、Slackから飛ばした出勤・退勤をKubernetesにデプロイしたアプリ経由でDBに登録して、 Metabaseから可視化したよって話。

タイトルだけ見ると、いや勤怠管理のアプリ使えよとなるかもしれない

やったことと

狙いとしては、Docker / Kubernetesがどれくらい使えそうか、メリットは何かをざっくり感じれればいいなと。 ついでに、勤怠報告に使えればなおよし。

全体的なフロー

  1. Kubernetesクラスターを作成して、Dockerコンテナ化したアプリをデプロイ
  2. SlackのSlashコマンドと(1)のアプリのHTTPエンドポイントを紐付け
  3. SlackにSlashコマンドで勤怠を入れる
  4. Kubernetes上のアプリ経由でMongoDBにレコードを登録
  5. Embulkで MongoDB → MySQL にデータ転送
  6. Metabaseから勤怠状況をグラフに落とし込む!

完成図

[Slackで勤怠をちょこちょこ入れて] f:id:accelerk:20180203192457p:plain

[Metabaseで結果をダッシュボードに出す] f:id:accelerk:20180203191728p:plain

うーん、激しい勤務実態が見えてしまいましたね。可視化した時点で休み時間入れるの忘れてたことに気がつきました。。。

大変だったとこ

フローごとに難所があったので、覚え書きとして。

Kubernetes

  • Docker コンテナのイメージさえできていれば、Deploymentは問題なくいける。

  • ServiceはLoad Balancerを選択しましたが、クラウドプロバイダーによってはデフォルトがHTTPになっています。HTTPSにしないといけないサービスの場合は注意が必要です。例として、SlackのMessage ButtonはHTTPSでないとボタンアクションの質問は出るものの、ボタンを押した後のRequestURLが叩かれません。

  • ただ、突然Podの再生成がスケジュールできなくなる事象に遭遇。これはKubernetesクラスターを動かしていたGoogle Cloud Platformの問題っぽい。

    • 解決策は リソースの自動拡張をONにすること。でないと突発的にリソースを食い始めた時に全て落ちる。
    • 調べていたら、もう一つ解決策はあったようですね。Servicesに SessonAffinity プロパティをを加える...ことらしい。

GCE services type LoadBalancer · Issue #18347 · kubernetes/kubernetes · GitHub

  • MongoDB も立てるはずだったけど、上記理由から不安があったので断念。本当は一緒のクラスター上に乗っている方がいいよ。
    • 結局DBaaSのmLab使って解決。サービス使えると楽でいいわ

mlab.com

Embulk

  • 言わずとしれたデータ転送ツール

github.com

  • MongoDBからデータを抽出した時に、カラムが分割されない問題がありましたがFilterで対応。
    • ここは別記事で紹介したい。。。

Metabase

  • セットアップから可視化までは相当楽でした。ここは昔の記事を参照いただければと。

ponzmild.hatenablog.com

  • このグラフや他の結果(週次の勤務時間合計とか)をSlackやメールで飛ばせるにはのMetabase自体にもSlackとメールでスケジュール連携する機能があるのでこっちをありがたく使う。ここは今後やってみたいですね。
  • FaaSで色んなものと連携させている人は、ZapierIFTTTでスケジュールorトリガーさせるのもいいかもしれません。