Rakeの設定
Rakeのタスクはrailsコマンドでlib/tasks以下に生成される。
$ rails generate task loader
create lib/tasks/loader.rake
とりあえずこんな感じで作って。
namespace :loader do
desc "Load Data Files"
task :test => :environment do
puts "test"
end
end
実行できる。
$ rake loader:test
test
RSpecもこんな感じで書けました。generatorはないっぽいけどspec/tasks以下とかに置けばよいのでは。
require 'spec_helper'
require 'rake'
MyApp::Application.load_tasks
describe 'Rake Test' do
it 'run test' do
Rake::Task['test'].invoke('arg')
end
end
S3へのアクセス
RubyからS3の利用はAmazonのドキュメント(AWS SDK for Ruby)を見ながら設定したら思いのほか簡単にできました。 S3のアクセス情報はHerokuのConfigに突っ込んで環境変数として使います(Configuration and Config Vars)。ローカルから走らせる場合には環境変数に設定するかRakeコマンドに引数として渡す事もできます。
$ heroku config:set S3_KEY=xxx S3_SECRET=yyy S3_BUCKET=zzz
Adding config vars and restarting app... done, v21
S3_BUCKET => zzz
S3_KEY => xxx
S3_SECRET => yyy
まぁ、以下のようにrailsのconfigに置いちゃっても良いみたいだけど。ちなみにこれは接続に失敗した時に表示されるAWSライブラリのエラーメッセージです。
= Ruby on Rails
In a Ruby on Rails application you may also specify your credentials in
the following ways:
* Via a config initializer script using any of the methods mentioned above
(e.g. RAILS_ROOT/config/initializers/aws-sdk.rb).
* Via a yaml configuration file located at RAILS_ROOT/config/aws.yml.
This file should be formated like the default RAILS_ROOT/config/database.yml
file.
Rubyからのアクセスには、まず以下のGemを追加します。
gem "aws-sdk", "~> 1.32.0"
そうすると上で設定した環境変数を引っ張って下記のように接続からBucketの取得までできます。
AWS.config(access_key_id: ENV['S3_KEY'],
secret_access_key: ENV['S3_SECRET'],
region: 'us-west-2')
BUCKET = AWS::S3.new.buckets[ENV['S3_BUCKET']]
すると以下のように、key名のprefixでS3上のオブジェクトを取得したりデータを読み込んだりできます。オブジェクトの詳細な扱いとかはAWS::S3のクラスドキュメントにまとまっています。
BUCKET.objects.with_prefix(directory).each do |obj|
puts obj.key
puts obj.read
end
スケジューラへの追加
スケジュール化されたタスクを走らせる方法としては定期的にRakeコマンドを実行するHeroku SchedulerとClockworkなどのGemを利用する方法があるらしい。Heroku Schedulerはone-off dynos上で実行されるBest Effortサービスらしいが、とりあえずこっちの方が簡単そうなのでこちらで実装してみました。 Heroku Schedulerのアドオンを追加すると以下のような感じで簡単にJobの登録ができます。実行後に以下のようにログを確認できます。
$ heroku logs -p scheduler
2014-01-16T18:07:59.715840+00:00 heroku[scheduler.7222]: Starting process with command `bundle exec rake test`
2014-01-16T18:08:00.376906+00:00 heroku[scheduler.7222]: State changed from starting to up
2014-01-16T18:08:04.282904+00:00 app[scheduler.7222]: Loading Files for 20140116
2014-01-16T18:08:04.719251+00:00 app[scheduler.7222]:
2014-01-16T18:08:04.719251+00:00 app[scheduler.7222]: [AWS S3 200 0.431475 0 retries] list_objects(:bucket_name=>"zzz",:max_keys=>1000,:prefix=>"pre")
2014-01-16T18:08:05.958921+00:00 heroku[scheduler.7222]: Process exited with status 0
2014-01-16T18:08:05.980991+00:00 heroku[scheduler.7222]: State changed from up to complete
ところで、Herokuのログってdefaultだと1500行までしか保持してくれないんですね。アドオン導入しないとな。やっぱPapertrailでしょうか。
0 件のコメント:
コメントを投稿