目的
個人開発のRailsアプリで、1日1回メール配信を行うバッチ処理を作る必要があり、調べて実装した時の備忘録です。
メール配信はsidekiqで非同期処理させており、開発環境ではsidekiq-schedularで24時間周期で起動させていました。
しかし、本番環境で利用しているHeroku(無料枠)では、30分でWebサーバがIdleになるため、うまく動作しませんでした。このため本番環境ではHerokuのアドオン(Heroku-schedular)を使った構成にしています。
スモールスタート等でRails+Heroku構成を選択される方は多いと思いますので、参考になれば幸いです。
開発環境
- Rails 6.0.3.3
- Heroku FreeDyno
手順
手順はシンプルです。1はRails、2と3はHeroku側で行います。順を追って説明します。
- 実行したいタスクをrakeファイルに書く
- Heroku-schedularをアドオンする
- Heroku-schedularにスケジューラを設定する
1. 実行したいタスクをrakeファイルに書く
/lib/tasksの下にrakeファイルを作成してタスクを記述します。
rakeタスクの詳細についてはこちら
desc "This task is called by the Heroku scheduler add-on"
task :task_name ,[:arg_1] => :environment do
# 処理を書く
end
:task_nameはタスクの名前です。タスクを実行する時に使います。:arg_1は引数で必要な場合はこの様に記載します。タスク内でDBにクエリを投げる時には=> :environment
も記載します。
rakeファイルを作成したら、consoleからrakeコマンドで動作確認します。
rake task_name
2. Heroku-schedularをアドオンする
HerokuコンソールのResourcesタブから、Add-onsメニューでHeroku Schedularを検索します。Heroku Schedularを選ぶとプランを選択画面がポップアップされます。Plan nameが「standard-free」になっていると思いますが、そのまま変えずにSubmit order formを押すとアドオンされます。
3. Heroku-schedularにスケジューラを設定する
アドオンが完了すると、HerokuコンソールのOverviewにあるInstalled add-onsにHeroku Schedularが追加されているので、選択すると、スケジューラ設定画面に遷移します。Add jobで新しいジョブスケジューリングを設定できます。Run Commandのところに定期実行するコマンド(rake task_name)を記載します。実行時間はUTCなので注意してください。
以上