ドラクエ部のくればやしです。HD-2D版のドラクエⅢが盛り上がっているので、めちゃめちゃやりたいのですが、スイッチが息子の手にあるのと、普段ゲームはほどほどにと言い聞かせている手前、なかなか手が出しづらい状況です😢
はじめに
わたしのチーム(サービス開発課)では、会議のツールにGoogle MeetとSlackのハドルを併用しています。メンバーは10名程度ですが、この時期はOJT期間のため新人さんの出入りがままあります。
カレンダーはGoogleカレンダーのため、Meetのときは招待しているメンバーで誰が不在なのかがMeetの画面ですぐに分かります(有給等で不在の予定の人もカレンダーに紐づいて分かるため)。
しかし、ハドルの場合は誰がいないのかがイマイチ分からず、「いない人は誰だろう?」という会話が度々発生していました。数名のMTGならすぐに把握可能ですが、わたしのチームの朝の定例MTGだと10名以上いる場合が多く、チームの総数と参加人数が合わない場合に、誰がいないのかを一目で判定するのが難しかったのです。
作ったもの
そこで、以下のような、ある時間のハドルに誰がいないのかを通知するBotを作ってみました。
有給等で不在の場合は、その日に連絡する運用になっているので、その連絡と突き合わせるとハドルに参加するべきメンバーが全員参加しているのかがすぐに分かります。
なかなか便利で、チームにも好評なようです😄(実際にはメンバーの名前が表示されます)
作り方
コード
ハドルにいないメンバーの取得にSlack のAPIを使いますが、ハドル向けのAPIは割と手薄で、「特定のチャンネルのハドルのメンバー一覧を取得する」といったAPIは無さそうでした。そこで、 users.profile.getAPIを用いて、参加対象のメンバーをProfileを取得し、ハドルのステータス( huddle_state
)が in_a_huddle
では無いメンバーを通知する、という方法を採ることにしました。
Rubyで書いてみると以下のようになります(一部抜粋)。クライアントライブラリにslack-ruby-clientを利用させて頂きました。
require "slack-ruby-client" user_list = { "UXXXXXXXX": "戦士", "UYYYYYYYY": "勇者", "UWWWWWW": "僧侶", "UZZZZZZZZ": "魔法使い", } not_huddle_member = user_list.filter_map do |user, name| state = client.users_profile_get(user: user)["profile"]["huddle_state"] name unless state == "in_a_huddle" end not_huddle_member # => ["戦士, "勇者""]
定期実行
出来たスクリプトを、定期実行するための仕組みに乗せる必要があります。最初はAWS LambdaとEventBridgeでの実現を考えましたが、前述のライブラリが依存しているライブラリでネイティブ拡張の実装をしているものがあり、それがOSの共有ライブラリを参照しているため、Lambdaで実行させるのはひと手間いりそうでした。
そこで、今回はEC2インスタンス上でスクリプトを実行し、実行時にインスタンスを都度起動するワークフローを当社のAWS運用自動化ツールCloud Automatorで構成することとしました。具体的には、タイマートリガーで定期実行を仕込み、以下の2アクションのジョブをジョブワークフローで順番に実行することとしました。
- EC2: インスタンスを起動
- EC2: インスタンスでコマンドを実行(前述のスクリプトを実行し、ハドルにいないメンバーを通知)
これにより、定時のMTGが始まったときに、誰がハドルにいないのかを一目で確認可能になります。
ちなみにCloud Automatorでは日本の祝日にも対応しているので、営業日のみ通知といったことが簡単なのも嬉しいところなのです😌
感想
今回、業務改善の取り組みの1つをご紹介しました。ちなみに、わたしのドラクエの推しモンスターはドラクエⅤに出てくるクックルーです😁(デザインがかっこいい&仲間にすると活躍してくれるから)
紅林輝(くればやしあきら)(サービス開発部) 記事一覧
サービス開発部所属。2015年にサーバーワークスにJOIN。クラウドインテグレーション部を経て、現在はCloud Automatorの開発に従事。ドラクエ部。推しナンバーはⅤ、推しモンスターはクックルー。