PIYO - Tech & Life -

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

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

RELATED

REPLエディタ Light Tableを試す

Facebookでこんなのが流れてたので思わずインストールしてしまったテキストエディタ。 エンジニアライズ - 【開発意欲を刺激するエディタの紹介】 http://www.lighttable.com/… LightTableはプログラマを中心に新たに注目されて

RailsのRakeタスクが定義される順番

Railsで使うRakeタスクは大きくわけて3種類あり、普通はこの順番で定義されることになっている。 gemのタスク アプリケーション固有のタスク Railsのタスク まずソースコードを読んでみた。 Rakefile # Rakefile require File.expand_path('../config/application',

Rubyで標準出力を文字列で乗っ取る

この間書いたこの記事のコードがDRYじゃないので少し修正した。 GrapeのAPIのエンドポイントをrake routes的に出力する - ぴよログやりたかったのは記事タイトルの通りで、Grapeで定義したA