Herokuには「Heroku Scheduler」というスケジューラ(cron)機能があります。今回はこの機能を使って、Heroku上にデプロイしているRailsアプリケーションにスケジューラを設定してみました。基本的には、Heroku公式サイトの手順どおりに進めれば簡単に設定できます。
アドオンをインストールする
Heroku Schedulerを使うためには、スケジューラのアドオンをインストールする必要があります。以下コマンドで、アドオンをインストールします。
$ heroku addons:create scheduler:standard --app アプリ名 |
アドオン自体は無料なのですが、アドオンをインストールするためにはクレジットカードの登録が必要です。クレジットカードの登録をしていない場合、以下のエラーが出ます。
▸ Please verify your account to install this add-on plan (please enter a credit card) For more | |
▸ information, see https://devcenter.heroku.com/categories/billing Verify now at | |
▸ https://heroku.com/verify |
タスクを定義する
スケジューラで実行するタスクを定義します。lib/tasks/scheduler.rake
を作成し、その中にタスクを定義します。今回は、User
テーブルのレコードを全削除するタスクを作成します。タスク名は、delete_all_user_table
としました。
scheduler.rake
desc "This task is called by the Heroku scheduler add-on" | |
task :delete_all_user_table => :environment do | |
User.delete_all | |
end |
タスクを定義したあとは、ローカル環境でタスクの動作確認を行っておきましょう。delete_all_user_table
の箇所は定義したタスク名と置き換えてください。
$ rake delete_all_user_table |
動作確認まで完了すれば、忘れずHerokuにアプリケーションをデプロイしておきましょう。
Heroku上でタスクの動作確認を行う
以下コマンドで、Heroku上でタスクの動作確認を行います。ここでも、delete_all_user_table
の箇所は定義したタスク名と置き換えてください。
$ heroku run rake delete_all_user_table --app アプリ名 |
スケジューラを設定する
定義したタスクをスケジューラに登録します。以下コマンドで、Herokuのスケジューラの画面を開きます。
$ heroku addons:open scheduler |
「Add new job」を選択します。
ローカル環境でタスクの動作確認を行ったコマンドを入力し、スケジューラの設定を行います。今回は、毎日3時にタスクを実行する設定にしました。時刻のタイムゾーンはUTC形式(日本と9時間時差がある)なので注意です。
ここまでくれば設定は完了です。お疲れさまでしたー。
ログを確認する
以下コマンドで、スケジューラでタスクが実行されたことを確認します。きちんと実行されていますね。
$ heroku logs --app アプリ名 | |
2019-03-03T18:01:03.993968+00:00 heroku[scheduler.1429]: Starting process with command `bundle exec rake delete_all_user_table` | |
2019-03-03T18:01:04.719886+00:00 heroku[scheduler.1429]: State changed from starting to up | |
2019-03-03T18:01:08.257970+00:00 heroku[scheduler.1429]: State changed from up to complete | |
2019-03-03T18:01:08.186482+00:00 app[scheduler.1429]: D, [2019-03-03T18:01:08.140073 #4] DEBUG -- : SQL (3.0ms) DELETE FROM "users" | |
2019-03-03T18:01:08.242006+00:00 heroku[scheduler.1429]: Process exited with status 0 |
まとめ
Herokuでスケジューラ(cron)を設定する方法でした。Heroku Schedulerを使うと簡単に設定できるのでおすすめです。