HerokuにはSchedulerっていうAddonがあって、それを使うと10分毎、1時間毎、1日毎という単位で好きなコマンドを動かすことができる。
ちょっとしたスクリプトを動かすためだけにサーバーを立てるのは面倒だから、そこをHerokuにしてしまおうという荒業を考えた。
Rackアプリケーションの作成
まず、Herokuのドキュメントを参考にしてほぼ最小限のRackアプリケーションを作る。
Deploying Rack-based Apps | Heroku Dev Center
# config.ru
run lambda { |env| [200, {'Content-Type'=>'text/plain'}, StringIO.new("Hello World!\n")] }
# Gemfile
source 'https://rubygems.org'
gem 'rack'
gem 'rake' # ← rakeタスクを使うので書いておく
このあと$ bundle install
を行ってGemfile.lock
を生成し、それらをローカルのGitリポジトリにコミットしておく。
Herokuアプリケーションの作成
Herokuの設定は済んでいるものとする。
$ heroku create myapp
などとしてアプリケーションを作成する。
あとは$ git push heroku master
としてソースコードをpushしてやればよい。Rackアプリケーションを検出してよしなにやってくれる。
heroku open
コマンドでアプリケーションページを開いてみると、Hello World!と表示されているのがわかると思う。
Rakeタスクを追加する
さて、ここが本来動かしたいスクリプトを書く場面になるが、シンプルにRakefileを作って直接スクリプトを書くことにする。
# Rakefile
task :hoge do
puts "hoge"
# do everything you want
end
例えば上のようなRakefileを作ったとする。ローカルの環境で$ rake hoge
とやると、標準出力にhoge
と表示されるはずだ。そしてこれをコミットしてherokuにデプロイする。
デプロイが終わったら次のコマンドを実行してみる。
$ heroku run rake hoge
hoge # <= output
hogeと表示されるはず。これでHerokuの環境でもRakeタスクを実行できるようになった。
スケジューラの導入
Heroku Schedulerについてはドキュメントや他の記事を見てもらったほうが早いのでここではざっと説明するだけにする。
Heroku Scheduler | Heroku Dev Center
まずコマンドラインからaddons:add
でスケジューラを使う旨を伝え、addons:open
で管理画面を開く。
$ heroku addons:add scheduler
$ heroku addons:open scheduler
初期画面はこんな感じになる。
左下のAdd Job...
から新規追加を行う。このとき、コマンドの部分を先ほどのRakeタスクと同じにすればOK。先ほどの例でとrake hoge
となる。
先ほどの例のようなputs
するだけのタスクでは何の意味もないが、例えば何かの更新を定期的にチェックして、特定の条件でメールを送るというようなことができるようになる。
Herokuの無料枠
Herokuでは750時間分の無料枠が用意されているが、Webサーバーとして24時間動いていることを考えると、24x31=744時間
の無料枠はあのHelloWorldに使われてしまっていることになる。
となると残りは6時間だが、この6時間はHerokuのコンソールを動かしたときやスケジューラを動かしたときに消費される。定期的に実行するタスクが重すぎるようだと無料枠を越えてしまい課金されるので注意が必要となる。
1日1回動かすタスクであれば、360分/31日=約10分程度のタスクであれば無料の範囲で収まると考えてよさそう。