エンジニア的お遊びをしてみた!(Pythonとサーバーレスのお話)

kitchen's car
kitchen car
kitchen's food
kitchen food

自己紹介

こんにちは!estieでソフトウェアエンジニアをしています えりりん です。
現在はソフトウェアエンジニアという肩書で何でもしていますが、どちらかと言うとサーバーサイド側が得意な人間です。
これまで、C#、Ruby on Rails、Pythonなどを使って仕事してきました。

概要

さて、今回はPythonとサーバーレスのお話をしようと思います!
ソフトウェアエンジニアであるという点と、弊社の「エンジニア成長タイム」を活かして、皆のランチ体験を快適にする取り組みを勝手に行いました。

(エンジニア成長タイムについてはこちらの記事をご覧ください) inside.estie.co.jp

ランチ体験を快適にするとは?

弊社オフィスがある東京大学の敷地内には ネオ屋台村 が出店しています。
いろいろなお店が週替り、曜日ごとに、敷地内を周っています。
出店場所を把握するための資料がこちら↓

kitchen_car_menu
kitchen_car_menu
kitchen_car_calender
kitchen_car_calender

「この表の見方を理解するのが意外と難しい」という声が社内で上がっていました。
そこで!これを元に毎日のランチメニューをSlackに流したら、この表を見なくても良くなるのではないかと考えました。

何をしたか

上記カレンダーの中で今日はどこに当てはまるのかというのを算出する関数を作りました。
そのソースコードはこちら。
https://github.com/ericgpks/kitchen_car/blob/main/main.py

上記カレンダーからわかるとおり、5週間ごとに同じ組み合わせが回ってきます。
Pythonの datetime 型には isocalendar() という日付から年・週番号・曜日を返す関数が存在しています。
これを利用して、今日が年内の何週目なのか、何曜日なのかを取得しています。ここの実装です。

今日を取得
today = datetime.now(JST)

今日をISO暦で取得
weeknumber = today.isocalendar()

5パターンしかないため、今日の週番号を5で割った余りを取得
this_week_number = weeknumber[1] % 5

今日の曜日を取得
this_day_number = weeknumber[2]

1枚目のメニュー表を辞書オブジェクトで定義しておいて、

groupA = ["ビストロカルロス(ビーフステーキライス、ハーブチキンライス)", "Comida Latina(タコライス)", "PINOS(グリルチキン丼、ビーフステーキ丼)", "てふてふ(ムーデン、てふてふ)", "グリーンスペイン(パエリアランチBOX)"]
groupB = ["Jule's spices(甘辛丼、ナシゴレン)", "ROCKET CHICKEN(ロケットチキン)", "フレーミングノラ(ガパオライス、グリーンカレー)", "エジプトめしコシャリ屋さん(コシャリ)", "オリーブ亭(オムライス)"]
groupC = ["Caffe Latte(イタリアご飯4種盛り)", "Dudes(テリヤキチキン丼、デミチキ)", "ミラーン(南インドカレー各種)", "パパガヤデリ(ファラフェル、シュニッツェル)", "栄屋(横手やきそば)"]
groupD = ["Mr.Chicken(シンガポールチキンライス)", "TOKYO PAELLA(週替りパエリア)", "MOCHIKO chicken factory(モチコチキン)", "デリキムチ(プルコギ、タッカルビ、カルビクッパ)", "NAOCAFE(スパム丼、男前ハワイ丼)"]
groupE = ["火の鳥食堂(ハヤシライス)", "GRILL TOKYO(ローストビーフ、グリルチキン)", "カリフォルニアカフェ フラワーズ(ケイジャンチキン、BBQライス)", "CHERIE(ハイチ料理)", "+Spice(インドカレー(ナン/ライス))"]

groupを週番号から特定、曜日番号とメニュー表を対比させています。
これで、各場所のお店が特定でき、Slackに流したい文字列ができました🎉

text = "\n".join([places[i] + groups[i][this_day_number - 1] for i in range(5)])

Slackに通知する方法は、公式ドキュメントを見ながら設定しました。

これで、ローカルから関数を実行すると指定したWorkSpaceの指定したChannelに流れます。

kitchen_car_local
kitchen_car_local

やった!!
これで表を見る必要はなくなりました。

しかし、毎日ローカルから関数を実行するのは辛い!関数の実行も自動化したい!
と思ったので、AWSのLambdaを使って関数を実行するようにしました。

まさにやりたいことと一致していたので、この記事を参考にさせていただきました。
https://qiita.com/yokoc1322/items/553ad147b82277b2beca
この記事にたどり着くまで、Lambdaから特定のURL(今回で言えばSlackのWebhookのURL)に対してデータをPOSTする方法がわからずに苦労しました💦

Lambdaの関数からTEST実行でSlackに流れるようになりました!

kitchen_car_lambda
kitchen_car_lambda

さあ!最後のひと押しです。
平日の11:25にこの関数を実行してほしいのでトリガーを追加します。

lambda_trigger
lambda_trigger

タイムゾーンがUTCなので−9時間してCronで設定します。

cron_schedule
cron_schedule

これで意図した時間に流れるようになりました🎉🎉

kitchen_car_scheduled
kitchen_car_scheduled

まとめ

関数を書くところまでは比較的順調にできました。
そこから、Lambda経由でSlackに投げるところの実装で少し時間がかかりましたが、弊社エンジニアチームが毎週火曜日に行っている「エンジニア成長タイム」を使って実現することができました! Lambdaを使ったことはあっても、APIから叩かれる関数しか作ったことがなく、EventBridgeを設定した関数を作ったのが初めてだったので楽しかったです。

今回使った技術はPythonでしたが、弊社ではRailsエンジニアを大募集しています!!
ぜひ一緒にお仕事しましょう!
詳細は以下をご覧いただき、お気軽にご連絡ください 。 お待ちしております♪
herp.careers