web cron サービスの代替えとして AppFog を使ってみる (Ruby編)

前回より cron っぽくするべく、今度は Ruby でやってみる。

基本的には公式のドキュメントに解説があるのだけど、

Task-scheduling

私のような Ruby 素人にはよくワカランし忘れそうなので備忘録。

実行コード

今回も「5分おきに特定のURLにアクセス」にチャレンジ。

実行スクリプト名 [app.rb]

require 'rubygems'
require 'rufus/scheduler'
require 'net/http'

scheduler = Rufus::Scheduler.new

scheduler.every '5m' do
	Net::HTTP.get('HOGE.com', '/hoge.php')
end

scheduler.join

Ruby の入門サイトあたりを見ればなんとなく理解できる。

たぶん、必要なライブラリを読み込んで、

require 'rubygems'
require 'rufus/scheduler'
require 'net/http'

スケジューラーのオブジェクトを作成して、

scheduler = Rufus::Scheduler.new

スケジュールを設定して、

scheduler.every '5m' do
	Net::HTTP.get('HOGE.com', '/hoge.php')
end

開始。

scheduler.join

てな感じかな?

cron っぽく書くことも可能。

scheduler.cron '*/5 * * * *' do

さらにはタイムゾーンも指定できるそうな。(たぶん)

scheduler.cron '15 6 1 * * Asia/Tokyo' do

(例:日本時間で毎月1日6時15分に実行)

依存関係

実行ファイルはできたものの、これをデプロイしただけでは動かない。
パッケージ管理(RubyGems)を使っているので依存関係を何とかせにゃならんらしい。

全然詳しくない分野なので、やったコトだけさらっと書いておこうw

まず、上の app.rb と同じディレクトリに Gemfile という名前のファイルを作る。(拡張子なし)
内容はテキストで次の通り。

[Gemfile]

source "http://rubygems.org"

gem "rufus-scheduler"

次に Ruby を使える環境(Windows の場合は [Ruby コマンドプロンプトを開く])から RubyGems 管理用のツール(?) Bundler をインストール。

gem install bundler

つづいて Gemfile があるディレクトリで

bundle install

とコマンドを打つ。

すると rufus-schedler と依存関係にある tzinfo がインストールされ、同時に Gemfile.lock というファイルが作成される。

[Gemfile.lock]

GEM
  remote: http://rubygems.org/
  specs:
    rufus-scheduler (3.0.8)
      tzinfo
    thread_safe (0.3.4)
    tzinfo (1.2.1)
      thread_safe (~> 0.1)

PLATFORMS
  x86-mingw32

DEPENDENCIES
  rufus-scheduler

ちなみに AppFog のサーバーは ubuntu っぽいので、

PLATFORMS
  ruby

とかにした方がいいのかもしれない。どっちでも動いたけどw

で、結局デプロイすべきファイルは次の3つです。

  • app.rb
  • Gemfile
  • Gemfile.lock

app 作成&デプロイ

あとは AppFog のアプリを作成して実際にデプロイするだけ。

app の名称を「cron_test_02」としてやってみる。

af push cron_test_02

対話形式で進む。

Would you like to deploy from the current directory? [Yn]:
Detected a Standalone Application, is this correct? [Yn]:
1: clr20
2: clr40
3: java
4: node04
5: node06
6: node08
7: node10
8: php
9: python2
10: ruby18
11: ruby192
12: ruby193
Select Runtime [ruby18]: 12
Selected ruby193
Start Command: ruby app.rb
1: CLC - Santa Clara
2: AWS US East - Virginia
3: AWS EU West - Ireland
4: AWS Asia SE - Singapore
Select Infrastructure: 4
Application Deployed URL [None]:
Memory reservation (128M, 256M, 512M, 1G, 2G) [128M]:
How many instances? [1]:
Create services to bind to 'cron_test_02'? [yN]:
Would you like to save this configuration? [yN]:
Creating Application: OK
Uploading Application:
  Checking for available resources: OK
  Packing application: OK
  Uploading (1K): OK
Push Status: OK

Staging Application 'cron_test_02': OK

Starting Application 'cron_test_02': OK

色つきの部分がデフォルト以外を設定した箇所で、内容は PHP の時と大体同じ。

何故かスタンドアロンにしてくれるのでそのままデフォルトでw

Detected a Standalone Application, is this correct? [Yn]:

Ruby 1.9 以降で RubyGems が標準ライブラリになってるらしいので「12」にしてみた。

Select Runtime [ruby18]: 12

開始コマンドは上で作成した app.ry を ruby で実行。

Start Command: ruby app.rb

インフラは前回と同じくシンガポール。(どこでも良い)

Select Infrastructure: 4

完了後、記述ミス等がなければ勝手に動いてます。

これで PHP の時のように実行処理時間分ズレるようなコトはないはず。

でもやっぱり面倒ですね~

今のところ一番簡単な cron の代替えは Google Apps Script のトリガーかもしれない・・・

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク