はじめに
Herokuで構築していたアプリケーションでバックグラウンドジョブを設定していた時にたまたまDynoの再起動タイミングと重なってしまい処理がコケてしまったので、それを防ぐ方法について書いておこうと思います。
Dynoのライフサイクルについてはこちらに少し記載があります。
アプリとシステム全体の健全性を維持するため 1 日に 1 回以上再起動されます(再起動の時点で残っているリクエストは、問題なく処理されます)。複数の dyno を実行するアプリの場合、各 dyno は異なる間隔で再起動されます。
dyno の再起動は Dyno Manager によって自動的かつ透過的に行われ、ログに記録されます。スケジュールにもとづく再起動だけでなく、新しいコードがリリースされたり、アドオンが変更されたり、設定変数が変更されたりした場合も dyno は自動的に再起動されます。また、手動で dyno を再起動することもできます。
buildpackの追加
Heroku CLIを拡張するbuildpackを追加します。
$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-cli -a アプリ名
CLI用認証トークンの設定
$ heroku authorizations:create
// 上記のコマンドで返却されたトークンを以下でアプリに設定する
$ heroku config:set HEROKU_API_KEY=トークン -a アプリ名
Heroku Schedulerアドオンを追加する
// アドオン追加
$ heroku addons:create scheduler:standard -a アプリ名
// アドオンのページを開く
$ heroku addons:open scheduler -a アプリ名
Heroku Schedulerの設定
例えば以下のような構成のDynoを毎日指定時刻に再起動させたいとする
アドオンページの 「Add Job」から新しいジョブを追加
すると以下のようなページが表示されるので、設定を行っていく
- どのタイミングか
- コマンド
- Dyno size
- Save
を設定する。
再起動を行うコマンドですが、アプリによって設定が異なる可能性があるので、以下は参考程度に
/app/.heroku/bin/heroku restart -a アプリ名 指定のDyno
となるので、webとworkerをで一つずつジョブを作成し、それぞれのコマンド設定の項目へ以下のように設定しました。
web dyno:
/app/.heroku/bin/heroku restart -a アプリ名 web.1
worker dyno:
/app/.heroku/bin/heroku restart -a アプリ名 worker.1
設定する時間がUTCとなっているので、その点に注意して再起動タイミングを設定してください。
以上となります。