Herokuの無料dynoを起動させ続けるのにAdvanced Schedulerが便利だった

# はじめに

この記事はHerokuのスケジューラーアドオンである[Advanced Scheduler](https://elements.heroku.com/addons/advanced-scheduler)についての記事です。

# 背景

[**Heroku**](https://jp.heroku.com/)で*free dyno*を使うとウェブアプリケーションを無料で公開することができて、趣味での開発やプロトタイプの確認にはとても便利ですよね。

ところが、このfree dynoは何も動作しない状態が30分以上続くと**sleep状態**になってしまうという仕様になっています。
このsleep状態を解消するために、定期的にタスクを実行する[Heroku Scheduler](https://elements.heroku.com/addons/scheduler)がこれまで使われていたようなのですが、今回[***Advanced Scheduler***](https://app.advancedscheduler.io/)というものがあるのを知りました。[^1]

使ってみると細かな時間設定が組めて、以前のスケジューラーよりも便利だったので紹介と導入手順をここに記しておこうと思います。

[^1]: add-on一覧をみていたら目に入った

# Advanced Schedulerの特徴は？
アドオンの紹介文に書いてた内容を箇条書きで抄訳します。

* Herokuアプリケーションにおける次世代標準のスケジューラー
* より優れた柔軟性
    * **cron式**に対応していて、とても柔軟にタスク周期を設定できる。
    * 「毎月15日で水曜の00:00に」実行するような複雑なタスク周期も可能。
* 設定不要のモニタリング
    * デフォルトでタスクの実行を監視してくれていて、タスクが失敗したときには素早く通知を送ってくれる。
* シームレスな統合
    * 起動中のアプリで動くどんなコマンドでも実行できる。アプリと同じdyno環境で実行できる。
* 法人向けレベルの信頼性
    * 実行時遅延を最小にするよう設計されている。
    * また、実行が失敗したときになんども実行する。 
* 比類なき使いやすさ
    * 簡単に使える**cron式エディター**があるので初心者でも玄人でも扱えます。

社内のちょっとしたツールなどでは、平日だけ起動したいこともあると思うので、そういうニーズにはぴったりですね！

# 使い方
次にこの項目ではインストールと設定方法を紹介していきます。

## アドオンをインストール
まずは稼働中のアプリにアドオンをインストールしましょう。

* アプリのダッシュボード->リソースから、`Find more add-ons`をクリック。

|![install1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/ba5ff830-b3ff-7a50-5f32-81dec3e89b24.png)|
|:-:|

* アドオン一覧から`advanced scheduler`を探してインストール。Dynoカテゴリーにあります。

|![install2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/0e1f93c2-4f93-5e97-2730-834328efe741.png)|
|:-:|

* `Install advanced scheduler`をクリック

|![install3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/218b0e90-fb7e-deda-7cb2-74df56a36763.png)|
|:-:|

## プランを選び、目的のappにプロビジョンする

|![install4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/336d81ff-7771-4f63-10ce-37e3cbb85f19.png)|
|:-:|

* 今回は無料枠でいきたいので、`Add-on Plan`をHobbyにします。
* `App to provision to`では、導入したいapp名を入力し、指定します。
* `Provision add-on` をクリックします。

すると、アプリのダッシュボードのリソース画面にリダイレクトされますので、
`Advanced Scheduler` 
をクリックすることで、[アドオンの設定画面](https://app.advancedscheduler.io/)に移動します。

## タスクを指定する

いよいよ実行するタスクを設定していきましょう。

|![install5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/56f60dd4-6e79-b92b-50c5-e836b159ac0d.png)|
|:-:|

* `Create First Trigger`をクリックします。

その後、設定項目が現れます。完成形はこのような形になります。

|![install7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/32227d75-2859-fe82-349e-e89e39ea31c1.png)|
|:-:|


### Name
タスクに名前をつけます。今回は`Awake app`にしておきました。
### Command
今回はsleep状態を起こすためのタスクなので、単純にcurlでgetしてきましょう。

```:起動用タスク
curl http://アプリ名.herokuapp.com/
```
### Timezone
有料プラン版の機能のようですがタイムゾーンを設定できます。[^2]

[^2]: 東京の時間は `UTC +9` なので、タイムゾーンがUTCの時は、cron式の`hour`は__-9__して記述する。

### State
このタスクの有効状態、無効状態を選択できます。
### Type
* Reccurring (再帰的に実行する)
* One-off (一度だけ実行する)

### Schedule
スケジュールヘルパーを使って典型的なスケジュールを設定するか、cron式を設定するかを選べます。

[Use Editor](https://crontab.guru/)を開いて、適切に設定した後に、コピペしましょう。
下記の例は、平日の10時から18時の間、00分と20分と40分にトリガーするような設定になっています。
__追記:なお、無料プランの場合ではタイムゾーンがUTCに固定されるため、東京標準時に合わせるためには`hour`指定を-9した値で設定してください。__

|![Screenshot from 2020-02-13 10-29-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/cab2564e-409d-8f34-de0e-d46d13de3441.png)|
|:-:|

* 最後に`Save`すると、`Scheduled Task`に設定されている内容が表示されるかと思います！

|![complete1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/b95010a9-2af6-c9e5-249c-94bfafe7fed4.png)|
|:-:|

これでタスク設定が完了です。以上の設定でアプリが起動し続けるようになったかと思います！
お疲れさまでした。

# おわりに
この記事は以上になります。何かわかりにくいところや間違えているところがありましたらコメントください。

### 参考リンク
公式ドキュメント: https://devcenter.heroku.com/articles/advanced-scheduler

### ほしい物リスト
もしこの記事が役に立ったのであれば、本や食料を買っていただけるととても嬉しいです。[https://www.amazon.jp/hz/wishlist/ls/1P644LOPKXCLP?ref_=wl_share](https://www.amazon.jp/hz/wishlist/ls/1P644LOPKXCLP?ref_=wl_share)

### Twitter
[https://twitter.com/kawadumax](https://twitter.com/kawadumax)