Herokuにデプロイしたアプリを眠らせない方法

目次

HerokuのFree Dynoが眠ってしまう問題

HerokuのFree Dynoが、30分でスリープしてしまうので困っているという方は多いのではないでしょうか?

enebularで作ったNode-REDのフローは、HerokuのFree Dynoにデプロイするケースがとても多いと思います。しかし、HerokuのFree Dynoは30分間、Webトラフィックを受信しなければスリープしてしまう仕様になっています。

Herokuのドキュメントのdyno のスリープの項目には以下のように記載されています。

アプリに Free Web dyno があり、その dyno が 30 分間 Web トラフィックを受信しない場合、その dyno は​休眠状態​になります。

 

Node-REDのフローで定周期の処理を実行していても、Webトラフィックがなければスリープしてしまいます。また、スリープしたDynoにアクセスすると目を覚まして応答してくれますが、スリープしていないDynoからの応答と比べるとかなり反応が遅くなってしまいます。

この記事では、Free Dynoをできるだけ無料で、できるだけ眠らせずに使用する方法について考えてみたいと思います。

※ Free Dynoではなく、有料のDynoを使用すればスリープしてしまうことはありません。Free Dyno時間の管理などの手間暇も不要です(ついでにこの記事も不要です ;-P)

できるだけ無料枠で頑張る方法

この記事では、Free Dynoを眠らせずに使用する方法のアイデアを2つほど紹介します。Webトラフィックを発生させるためには、他にも色々な方法が考えられるので、工夫のしどころかもしれません。

  1. Node-REDでWebトラフィックを作る方法
    • Webトラフィックを受信すれば眠らないということなので、Node-REDのフローで強引にWebトラフィックを作り出す方法です
  2. 無料のスケジューラーを使う方法
    • Dynoを起動し続けるために、Add-onのスケジューラーを利用する方法です

Node-REDでWebトラフィックを作る方法

Webトラフィックを受信しないなら、Webトラフィックを自分で作ってしまえばいい!

ということで、Node-REDのフローのなかにWebトラフィックを発生させる機能をつけてみます。

下図のフローは、25分周期でGoogleのWebページ(http://google.com/)を取得するフローです。このフローを動作させておくと、30分以内に少なくとも1回はWebトラフィックが発生しますので、Dynoがスリープすることはなくなります。

簡単なフローですが、enebularのDiscoverに公開しました。興味のある方は、heroku-unsleep-blogを検索して、自分のプロジェクトにインポートしてみてください。

このフローは、本来のアプリケーションとは関係のないフローですので、タブを分けて置いておくと良いでしょう。

無料のスケジューラーを使う方法

Node-REDでWebトラフィックを作る方法では、アプリケーションに関係ないフローが必要で、ちょっと気持ち悪いですね。これを避けるために、無料のスケジューラーアドオン(Add-on)を使って、Free Dynoに周期的にアクセスする方法を考えます。この記事では、「Heroku Scheduler」というアドオンを使用します。

以下の手順を実施する前に、Heroku上にenebularで作成したNode-REDのアプリケーションをデプロイしておいてください。ここでは、仮にアプリケーションの名称を「enebular-unsleep-app」アプリとします。

Heroku Schedulerをインストールする

では、デプロイしたアプリケーションに、「Heroku Scheduler」をインストールしましょう。順を追ってインストール方法を説明します。

ダッシュボードからアドオン一覧画面を開く

まず、WebブラウザでHerokuのダッシュボードを開いて、対象のアプリケーションの “Resources” タブを開きます。

“Find more add-ons” ボタンをクリックします。Webブラウザに新しいタブが開いて、アドオンの一覧画面が表示されます。

“Heroku Scheduler” を検索する

アドオンの一覧の中から、”Heroku Scheduler” を検索します。画面の右上に検索窓(Search Elements)があります。”Heroku Scheduler”と入力して検索します。下図のように “Heroku Scheduler” が見つかるので、クリックします。

“Heroku Scheduler”をインストールする

下図のように “Heroku Scheduler” の画面が開きます。”Install Heroku Scheduler” ボタンをクリックします。

下図の画面が開きます。”Add-on plan”は、”Standard – Free” のまま変更の必要はありません。”App to provision to” に、インストール対象のアプリの名前(この記事の場合は “enebular-unsleep-app” )を入力します。

正しいアプリ名を入力すると、下図のように “Submit Order Form” ボタンが有効になります。”Submit Order Form” ボタンをクリックして、アドオンをインストールします。

Heroku SchedulerにJobを設定する

Heroku Schedulerのインストールができたら、Jobを設定します。

ダッシュボードからHeroku Schedulerの設定画面を開く

再びWebブラウザでHerokuのダッシュボードを開いて、対象のアプリケーションの “Resources” タブを開きます。
“Heroku Scheduler” をクリックして、設定画面を開いてください。

Webブラウザに新しいタブが開いて、下図のような画面が表示されます。

“Create Job” ボタンをクリックします。Jobの編集画面が開きます。

Jobを設定する

Jobを設定します。対象アプリケーションに周期的にWebトラフィックを発生させるために、JobにはHTTPのGETリクエスを送るcURLコマンドを実行させることにします。

Scheduleは、”Every 10 minutes” のままとします。Run Commandは、以下のコマンドを設定します。対象アプリのURLの確認方法は後述します。

curl https://(対象アプリのURL)

 

Run Commandの入力ができたら、”Save Job” ボタンをクリックしてJobを保存します。Jobの編集画面が閉じられて、下図のようにJobが登録されていることが確認できます。

これで、Heroku Schedulerが10分周期でcURLコマンドを実行してくれますので、Dynoがスリープしなくなります。

対象アプリのURLの確認方法

URLは、以下の手順で確認できます。

WebブラウザでHerokuのダッシュボードを開いて、対象のアプリケーションの “Settings” タブを開きます。

画面を下にスクロールさせていくと、”Domains” の項目にURLが記載されています。このURLを対象アプリのURLとして設定します。

注意事項

最後に、本記事の注意事項を記載しておきます。

HerokuアカウントのFree Dyno時間の制約

すべてのHerokuアカウントには、月ごとに550時間のFree Dyno時間が割り当てられています(クレジットカードで認証している場合にはさらに450時間追加されるそうです)。この記事のようにFree Dynoを眠らせずに使用すると、Free Dyno時間がどんどん消費されます(24時間x30日=720時間なので、170時間ほどオーバーしてしまいますね)。Free Dyno時間がなくなると、その月はもうFree Dynoが起動できなくなります。

この問題を避けるには、ずっと起動させ続けるのではなく、日中だけ(08:00 ~ 20:00とか)起動する、平日だけ起動する、といったスケジュールにして本当に必要な時間だけ動作するようにするとFree Dyno時間を節約できます。

Free Dyno時間の詳しい説明は、Herokuのドキュメントをご覧ください。

Heroku Schedulerの制約

Heroku Schedulerの使用にあたっての注意事項を列挙しておきます。詳しくは、Heroku Schedulerのドキュメントを参照してください。

クレジットカード登録について

Heroku Schedulerは、インストールのためにクレジットカードの登録が必要です。

Free Dyno時間の消費について

Heroku Schedulerの動作はOne-off DynoというDynoで実行され、Free Dyno時間を消費します。Free Dyno時間の消費時間には気をつけてください。

既知の問題

ドキュメントには既知の問題として、以下の問題が記載されています(意訳してます)。

  • まれにジョブがスキップされることがあります
  • まれにジョブが2回実行されることがあります

厳密に信頼性の高い動作が必要な場合は、上記の問題に気をつけて使用してください。