Rails
Heroku

heroku schedulerの使い方 herokuで簡単な処理を定期的に自動的に実行する

概要

以前書いた記事APIで複数通貨のレートを効率よく完全自動でデータベースに登録する方法! メンテナンスも簡単!で作成した、完全自動でレートを登録するコードをheroku上で1日に一回、自動的に実行したいと考えた。
railsで処理を定期的に実行する方法を調べてみると、cornなどのgemを使う方法も見つかったが、今回はherokuでの利用に限定されるが、最も簡単に実装できそうなheroku schedulerを使った実装を紹介する。

やり方は、以下の公式サイトを参考にした。
https://devcenter.heroku.com/articles/scheduler

事前準備

Heroku schedulerのadd-on自体は無料枠があり、無料で利用することができるが、アプリにadd-onを追加するためにはアカウントのverificationが必要であり、クレジットカードの登録が必要である。

やり方

1.実行したいタスクの作成

公式によるとrailsでは定期的に実行したい処理は、 lib/tasks/scheduler.rakeというファイルを作成して、そこに記述するのが一般的らしい。
公式に「これをコピーして書き替えろ」というコードのサンプルが載っているのでその通りにする。

サンプルコード

lib/tasks/scheduler.rake
desc "This task is called by the Heroku scheduler add-on"
task :update_feed => :environment do
  puts "Updating feed..."
  NewsFeed.update
  puts "done."
end

task :send_reminders => :environment do
  User.send_reminders
end

今回、私が作成したコード

lib/tasks/scheduler.rake
desc "This task is called by the Heroku scheduler add-on"
task :test_scheduler => :environment do
  puts "scheduler test"
  puts "it works."
end

task :update_rates => :environment do
  ENV["SSL_CERT_FILE"] = "app/controllers/cacert.pem"
    require 'open-uri'

    sources = ["USD","JPY","EUR","CNY", "KRW","THB", "VND", "SGD", "PHP"]
    currencies = sources.join(',')
    sources.each do |source|
        res = open('https://apilayer.net/api/live?access_key=アクセスキー&currencies=' + currencies + '&source=' + source + '&format=1')
        code, message = res.status # res.status => ["200", "OK"]
        if code == '200'
          result = ActiveSupport::JSON.decode res.read
          # resultを使ってなんやかんや処理をする
          @result = result['quotes'] #返ってきたjsonデータをrubyの配列に変換
          @result.each do |key, value|
            rate = Exchange.find_or_create_by(currency: key)
            rate.update(currency: key, rate: value)
          end
        else
          puts "Error!! #{code} #{message}"
        end
          puts @result
      end
end

rakeコマンドで実行できているかを確認するために文字列を出力する
test_schedulerというタスクも作った。

作成したら、コマンドラインラインから動作チェック

$rake test_scheduler

2. heroku schedulerのadd-onをアプリにインストール

herokuの自分のアカウントでheroku schedulerをインストールしたいアプリを開き、dashbordからconfigure Add-onsを開き、指示に従ってインストール。

3. jobの登録

dashbordのheroku schedulerをクリックしjobを登録し、時間などを設定する。

$rake test_scheduler

時間の設定はUTCで指定する点に注意。

これで終わり。

感想

Heroku schedulerの使い方を解説した記事はとても少なく、しかも、様々なgemを使用したやり方しか見つからなかった。
今回は公式サイトのやり方をそのまま行ったら、簡単に実装することができた。