社内向け休日通知botを作った
社内で「朝出社したら誰もいなくて、そこで初めて祝日だったことに気づいた」という話を聞きました。なんということでしょうか。せめて前日には気づかせてあげたいと思い、祝日を通知するSlack Botを作成しました。
この記事は株式会社オプティマインドの社員による「Optimind Advent Calendar 2023」の6日目の記事です。
全体の構成
ざっくりと以下のような構成です。元データはGitHubへ手動アップロード&編集。Event BridgeでLambdaを定期実行してSlack Appから通知という流れです。
ちょっとこだわったのは、この手のシステムは頻繁に保守を行わないため内部構造や仕組みが忘れられがちであることから、あえてコード量を減らしたりシステムの自動化を省いたりしています。凝った設計や自動化などをしてしまうと、一部を触ったら意外な部分に影響があったとか、目的を達成するためにどこを触ればいいかわからないなどということにもなりかねないので、なるべく直感に沿うような設計・実装になればと考えました。また構築時の手間削減という意図も含んでいます。
祝日の取得
祝日の情報をどこからどう取得するかは重要です。1つの選択肢としてはみなさまおなじみのGoogleカレンダーがあります。以下のようにGoogleカレンダーのAPIで取得することができるようです。
しかし祝日は国が決めていますし、わざわざGoogleが整備したものを取得するよりも一次情報を取ってきたほうが気持ちいいですよね(?)。 また何よりAPIを叩く処理を書く手間の削減や、管理するコードをなるべく減らしたいという意図があります。
ということで国が公開している祝日一覧を探してみたらちゃんとありました。
HTMLでテーブルになっている他、「昭和30年(1955年)から令和6年(2024年)国民の祝日」がCSVで公開されています。最高ですね。
CSVでもいいのですが私は普段JSONでデータを扱うことが多いので今後のためにもJSONに直しておきたいです。しかしCSVからJSONの変換ツールを作ってそれを保守するのも面倒くさい。とはいえすべて手作業でJSONを作るのも面倒くさい。ということで面倒くさい単純作業を何も文句も言わずサクサクと作業してくれるあの御方にお願いしてみました。
すばらしいですね(間違いが無いかどうかを目視で確認する必要がありますが)。
もちろんCSVを渡してJSONに変換してもらうこともできますが、URLアクセスできるようになったChatGPTを試してみたかったという意図があり、今回はあえて上記の方法でやってみました(それにしても便利ですね)。
データ管理方法
実際は祝日だけではなく会社独自の休日(主に年末年始やお盆など)があるため、それも上記のデータに入れ込む必要があります。これはさすがにAPI化などされていないので、手で付け足すことにします。また祝日が急遽変わることなどもあるかもしれません。そこでデータの手修正を行うためにこのデータはGitHubで管理し変更履歴やPRでのレビューを行えるようにしました。GitHubは普段から慣れているのでこれくらいのフローがあっても保守の負荷はそこまで高くないかなという判断です。
また後述しますが、データの処理自体はAWS上で行うため、GitHubへPushしたらS3バケットへアップロードするGitHub Actionsを設定しました。
通知内容と処理
祝日情報が取れたので、あとはこれを元に好きに処理します。
もちろんVMの管理などは絶対したくないので、処理はAWS Lambdaで行うことにします。休日データはそこまで大きくなく、また1日1回の処理と低頻度であるため、データは実行のたびにS3からダウンロードするようにしています。
通知内容としては、祝日かどうかだけではなく土日と繋がって連休になった場合に次の出勤日を通知したいと思ったので、以下のような処理を組みました。
- 今日は祝日または土日である → 何も通知しない
- 明日から順に祝日でも土日でもない日になるまで1日ずつ辿る
- もし辿った中に祝日しかない(つまりただの土日) → 何も通知しない
- 明日からいつまで休みで、次の出勤日がいつかを通知
ここはコアロジックなので今後もいろいろ改善していけたらいいなと思っています。
通知方法
LambdaからSlack AppのWebhookで通知を行っています。詳細なSlack Appの構築方法については解説しませんが、単純にWebhook URLを発行してLambdaの環境変数に設定しているだけです。
公式ドキュメントはこちら。
以下でも大変わかりやすく説明されています。
まとめ
GitHub, AWS, Slackを使って、以下のように祝日や連休を知らせてくれるbotを作成しました。
これで、出社して初めて休日であることに気づくということは避けられるのではないでしょうか。
今回は長期かつ低頻度な保守となることを考え、あえてコーディングや自動化などを捨てることも意識してみました。また、そのために発生する面倒な作業はChatGPTにも助けてもらいました。保守を考えた設計はなかなか塩梅が難しいですが、実際どうなっていくか今後が楽しみです。
世界のラストワンマイルを最適化する、OPTIMINDのテックブログです。「どの車両が、どの訪問先を、どの順に、どういうルートで回ると最適か」というラストワンマイルの配車最適化サービス、Loogiaを展開しています。recruit.optimind.tech/
Discussion