Rails
AWS
ElasticBeanstalk
delayed

AWS Elastic Beanstalk でDelayed Jobのworkerを運用する

メールやslack通知を非同期実行するのに Delayed jobを導入。

.ebextensionsでworker起動しようと思ったが、killして起動し直すのも面倒だし、止まってないかの監視も必要なので、Rakeタスクで止まってたら起動する処理をスケジューラで実行することにした。

Modules::LogNoticeModules::SlackNotifierJobはログ書き出し、slack通知を行うJob。)


lib/tasks/delayed_jobs.rake

namespace :delayed_jobs do

desc 'delayed_job のプロセスを起動'
task start_up: :environment do
Rails.logger.info "[BATCH]delayed_jobs.start_up is begun."
ps = `ps aux | grep jobs`
Rails.logger.info ps
if !Rails.env.development? && !ps.match(/bin\/rake jobs:work *\n/)
# バックグラウンドでjobを起動。
if system('cd /var/app/current && nohup bundle exec rake jobs:work > /dev/null 2>&1 &')
Modules::LogNotice.perform ['jobが起動していなかったので起動しました。']
else
message = 'jobの起動に失敗しました。確認してください。'
Rails.logger.fatal message
Modules::SlackNotifierJob.perform_now({ text: message }, 'danger')
end
end
Rails.logger.info "[BATCH]delayed_jobs.start_up is finished."
end
end


config/schedule.rb

...

every 10.minute do
command "cd /var/app/current && bundle exec rake delayed_jobs:start_up"
end
...

標準出力、標準エラー出力を破棄しているが、ログに出すのも余裕があれば検討。

参考