元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

OpsWorks + Whenever

cron設定をバージョン管理に含めることができるのでありがたいWheneverをOpsWorksで使ったときのメモです。

基本はデプロイフック(Chef デプロイフックの使用)を使うのですが、ポイントは

  1. OpsWorksアプリケーションの「Environment Variables」を引き継ぐようにする
  2. whenever --update-cronではidentifierを指定する

の2点です。

1はそもそもコマンド実行に必要、2をしないとdeployの度にcrontabにどんどん追記されていってしまうことへの対策です。(デフォルトのidentifierはschedule.rbの絶対パス=リリースパスになるので実行毎に代わってしまう)

config/schedule.rb

# deploy時の環境変数を引き継ぐために書き出し
ENV.each do |key, value|
  env key, value
end

job_type :runner,  "cd :path && bundle exec ruby bin/rails runner -e :environment ':task' :output"

every :day, :at => '04:00am' do
  runner 'CountingService.new(Date.yesterday).start'
end

deploy/before_restart.rb

Chef::Log.info 'Running deploy/before_restart.rb'
app_name = :yourappname
rails_env = node[:deploy][app_name][:rails_env]  # OpsWorks Railsアプリケーションの Rails environment
env_hash = node[:deploy][app_name][:environment] # OpsWorks Railsアプリケーションの Environment Variables
current_release = release_path                   # /srv/www/yourappname/releases/20150325052254/

execute 'whenever' do
  cwd current_release
  command "bundle exec whenever --update-cron #{app_name}_#{rails_env}"
  environment env_hash.merge(RAILS_ENV: rails_env)
  user 'deploy'
  group 'nginx'
end