wheneverでActiveRecord管理の古いセッション情報レコードを自動で削除

先日のエントリー、Rails4でsession storeをActiveRecordに変更 | EasyRamble の続き。ActiveRecord で管理しているセッション情報(Sessionモデル、DBはsessionsテーブル)のうち、古くなったものをサーバー側で自動的に破棄するようにします。レコードの削除を cron で定期的に自動実行するために、crontab を Ruby で管理できる gem である whenever を利用する。

whenever

スポンサーリンク

Gemfile に whenever を追加してインストール

Gemfile

続いて、wheneverize コマンドを実行。

config/schedule.rb が作成されます。

古いセッションデータのレコードを削除するクラスメソッドを作成

sessions テーブルの古いセッションデータを持つレコードを削除するロジックは、Rails Guides を参考にしました。

Ruby on Rails Security Guide — Ruby on Rails Guides

app/models/session.rb

created_at で指定する期間も、引数で渡せるように変更した。

config/schedule.rb で cron ジョブの設定

whenever では、config/schedule.rb にスケジューリング実行するジョブを追加します。以下のジョブをスケジュール設定できます。

command: bashコマンド
runner: 任意のメソッド
rake: Rakeタスク
script: script

とりあえず実験用で動作確認のため、以下のように設定しました。

config/schedule.rb

2分おきに cron で Session.sweep を実行。セッションレコードのうち updated_at が5分前より古いもの、または created_at が15分前より古いものを削除します。テストでは、無事に動作確認できました。

以下は production 環境での例。

production 環境で、1日1回午前4時30分に Session.sweep を実行するジョブです。updated_at が7日前より古いもの、または created_at が30日前より古いものを削除する。この Session.sweep メソッドが実行されると、Devise 等によるログイン認証の維持も破棄される(ログアウトされる)のでそこは注意。Session.sweep の引数で指定する期間は適宜調整します。

whenever で設定したジョブを crontab に反映させる

ここまでの作業だけでは、まだ whenever で設定したジョブが crontab 自体に登録されることはありません。

whenever のヘルプは以下。

whenever でスケジューリングしたジョブを確認。

crontab に反映させる。

crontab 確認。

とりあえずテスト確認用で設定した、2時間毎に実行する cron ジョブが登録されています。

crontab から削除。

再び crontab 確認。

削除されていることを確認する。

whenever と Capistrano の連携

Capistrano3 でデプロイ実行時に、自動で crontab をアップデートする設定を行います。

Capfile で、whenever/capistrano の require を追記。

Capfile

続いて、config/deploy.rb で whenever 実行の環境、cronjob 識別子の設定、および SSHKit.config で whenever コマンドが bundle exec 付きで実行されるように指定。以下の内容を追記します。

config/deploy.rb

デプロイ実行。

whenever でスケジューリング設定したジョブが、crontab に反映されていることを確認できたら完了です。config/schedule.rb を編集した場合、デプロイするたびに自動で crontab が更新されます。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!