ぴよログ

↓に移転したのでこっちは更新されません、多分。

1日に数回起動するようなスクリプトをHerokuで動かす荒業

移転しました →

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分程度のタスクであれば無料の範囲で収まると考えてよさそう。

広告を非表示にする