Ruby on JetsというRubyのサーバーレス専用のフレームワークのJob機能を使ってゴミ出しの情報を通知してくれるslack botを作ってみました。
仕様
私の住んでいる地域のゴミ出し情報は以下のようになっているので、以下の曜日の6:30にslackに通知する仕様にします。
実装する
事前にAWS CLIの以下の権限を持ったユーザーで設定する必要があります。 Minimal Deploy IAM Policy - Jets Ruby Serverless Framework
jetsのプロジェクトを作成する
job機能に特化したJetsプロジェクトを作成します。 jets new - Jets Ruby Serverless Framework
$ jets new lifestyle_notify --mode job
Slack APIの設定をする
gem "slack-ruby-client"
$ bundle install
Slackでアプリを作成してSlack API Tokenを作成できれば準備はOKです。
環境変数を設定する.
SLACK_API_TOKEN=(取得したAPI Token)
Env Files - Jets Ruby Serverless Framework
Job機能を実装する
新たにファイルを作成して実装していきます。 ドキュメントを参考にJobを追加します。 ドキュメントに書いてあるようにrate式とcron式が使えるので、 cronに通知したい日時をしていきます。ここで注意ですが、Lambda上では9時間のUTCなので時差を考慮する必要があります。 Jobs - Jets Ruby Serverless Framework
class GomiJob < ApplicationJob class_timeout 60 Slack.configure do |config| # APIトークンを設定 config.token = ENV["SLACK_API_TOKEN"] end #ゴミ出しの情報を送信する #燃やさないゴミ cron "30 21 ? * SUN#2 *" def moenai_notify_2 text = "今日は燃やさないゴミの日です" send_message(text) end #燃やさないゴミ cron "30 21 ? * SUN#4 *" def moenai_notify_4 text = "今日は燃やさないゴミの日です" send_message(text) end #燃えるゴミ cron "30 21 ? * MON,WED,FRI *" def moeru_notify text = "今日は燃やすゴミの日です" send_message(text) end #資源ゴミ cron "30 21 ? * THU *" def shigen_notify text = "今日は資源ゴミの日です" send_message(text) end private def send_message(text) client = Slack::Web::Client.new client.auth_test client.chat_postMessage(channel: "#lifestyle", text: text, as_user: true) end end
デプロイ
$ JETS_ENV=development jets deploy
コマンド一発でデプロイできます。
ハマったこと
Cronに形式通りに曜日などを指定したがエラーになる。
ドキュメントにガッツリ書いてありましたが、これで1日溶かしました。下記の通り、?
を含めないといけないというルールがあります。
cron 式の日フィールドと曜日フィールドを同時に指定することはできません。一方のフィールドに値 (または *) を指定する場合、もう一方のフィールドで ? (疑問符) を使用する必要があります。
投げ銭していただける方は以下のボタンからよろしくお願いいたします。