何かやってみるブログ

興味をもったこと、趣味のこと、技術について色々書きます。

Ruby on Jetsを使ってゴミ出しの情報を通知してくれるSlack Botを作ってみた

Ruby on JetsというRubyのサーバーレス専用のフレームワークのJob機能を使ってゴミ出しの情報を通知してくれるslack botを作ってみました。

仕様

私の住んでいる地域のゴミ出し情報は以下のようになっているので、以下の曜日の6:30にslackに通知する仕様にします。

f:id:s-takaya1027:20200823142435p:plain

実装する

事前に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 式の日フィールドと曜日フィールドを同時に指定することはできません。一方のフィールドに値 (または *) を指定する場合、もう一方のフィールドで ? (疑問符) を使用する必要があります。

docs.aws.amazon.com