Herokuにデプロイしたアプリケーションは、 30分アクセスが無いとスリープしてしまうことは有名です。ただ、24時間寝ないようにすると無料枠がすぐ無くなりませんか?
寝かせない運用は無料枠の1000時間がすぐに無くなってしまう
調べると定期的に自身にHTTPリクエストを行って寝かせないようにするなどの対処法が見つかります。
ただ、 Herokuは無料枠の運用だと月間1000時間までしか利用できないという制限があります。
寝かせない運用の場合、寝かせないので
24時間x30日=720時間
ということで、 一つのアプリケーションだけで無料枠の7割をも使ってしまいます。
基本寝かせておいて、指定したタイミングで叩き起こす
もちろん、24時間稼働が前提のアプリケーションではこれは厳しいですが、バッチ処理や定期的に発言するBOT、RPAツールなど常時稼働ではなく1日のうちに数回動けば良いといった仕様のアプリケーションならば24時間稼働をさせなくても良いはずです。
Heroku Schedulerを利用
ここだけだと割と一般的です。Heroku SchedulerというHerokuアプリがスリープしてても指定時間にコマンドを実行してくれるツールです。
アプリケーション管理画面のResouces
> Add-ons
からHeroku Scherdulerを追加します。
指定時間に指定コマンドを実行できるので
curl https://アプリ名.herokuapp.com
などを指定して定期的にリクエストを出すのが通常です。
1回のHTTPリクエストでは起動してくれないケースがある
これはNode-RED(enebular)のデプロイのケースだけなのかもしれないですが、 1回のHTTPリクエストだけだとアプリケーションが起きるだけ、その次からのリクエストでやっと処理がされるという事象がありました。
ということで 2回HTTPリクエストを出すようにしてみます。
Sleep処理と2回のHTTPリクエスト
Heroku Schedulerで毎日指定時間に実行させようとすると、 最短実施時間間隔が30分になっており、ただ2回実行しただけでは30分経過してしまいまた寝てしまいます。
これをSleep処理を挟めつつ、HTTPリクエストを2回行うことで回避できました。
以下は 12:30に処理を実行したい例です。
- STEP1. 12:00の実行
$ sleep 30 && curl https://hogehoge.herokuapp.com/ping
1回目のリクエストの前に、 sleep 30
で30秒待機してから、HTTPリクエストを行っています。
- STEP2. 12:30の実行
$ curl https://hogehoge.herokuapp.com/ping
これは通常通りです。STEP1の実行が12時00分30秒頃~となるのでSTEP2の実行時にギリギリ30分は経ってなく、sleepしません。
このsleep処理入れなくてももしかしたら起こす処理で時間がかかってSTEP2までの間が30分未満の場合もあると思いますが、確実なものにするためにsleepを入れた方が安心だと思います。
こんな感じで実行したいタイミングの30分前に一度HTTPリクエストを行って、起こしておきます。
ちなみに、UTCになるのでマイナス9時間を指定すると日本時間になります。
日本時間の12:30に実行したければ、ここの設定はAM03:30ですね。
また、実際にはNode-REDでこんな感じでエンドポイントを用意してたりします。
まとめ: 2回のリクエストで叩き起こす
まとめるとこんな感じで2回のリクエストを出し、1回目を遅延実行させることで2回目のリクエストで確実に処理が行われます。
一回のリクエストでは起きない(厳密には起きるだけで何もしてくれない)ので、 2回のリクエストで叩き起こすといった感じですね。