Rails4 でセッションストアに DynamoDB を使う
2ヶ月以上前ですが、Rack アプリケーションで DynamoDB を セッションストア用として使うための gem が公開されていました。
DynamoDB Session Store for Rack Applications
Rails だと ActiveRecord のセッションストアがありますが、RDB なので、どうしても気になるのは負荷と障害ですね。
そんな時は、スケーラブルかつ耐障害性に優れた DynamoDB を使って解決しましょう。 *1
ということで、Rails4 で DynamoDB をセッションストアとして使う方法を試してみました。
Rails アプリケーションの作成
先ずは Rails アプリケーションの作成です。
$ mkdir try_dynamodb_sessionstore && cd try_dynamodb_sessionstore $ bundle init $ vim Gemfile # A sample Gemfile source "https://rubygems.org" gem 'rails', '4.0.1' $ bundle install --path vendor/bundle $ bundle exec rails new . --skip-bundle
作成出来たら、今回対象の aws-sessionstore-dynamodb という gem を追記して、bundle install しましょう。
$ vim Gemfile gem 'aws-sessionstore-dynamodb' $ bundle install
各種設定
bundle install が終わったら、Rails の起動時に AWS の設定を読み込むように以下を記述します。
$ vim config/initializers/aws.rb AWS.config({ access_key_id: YOUR_ACCESS_KEY_ID, secret_access_key: YOUR_SECRET_ACCESS_KEY, region: YOUR_REGION })
次に session_store.rb を開いて、セッションストアに DynamoDB を使うように指定します。
$ vim config/initializers/session_store.rb # Be sure to restart your server when you modify this file. TryDynamodbSessionstore::Application.config.session_store :dynamodb_store
マイグレーション
Generator が用意されているので、以下のように実行すると、migration ファイルと設定ファイル dynamodb.yml が作られます。
$ bundle exec rails g sessionstore:dynamodb create db/migrate/20131024152038_sessionstore_migration.rb create config/sessionstore/dynamodb.yml
これで rake db:migrate を実行すると、実際に DynamoDB に作られるはずです。
$ bundle exec rake db:migrate == SessionstoreMigration: migrating ========================================== == SessionstoreMigration: migrated (57.4941s) ================================
マネージメントコンソールを開くと、DynamoDB に sessions という名前のテーブルが作られていますね。
コントローラとビューの作成
セッションの動きを確認するために、シンプルなコントローラとビューを作ります。
$ bundle exec rails g controller blogs --no-helper --no-assets —no-test-framework
Controller
app/controllers/blogs_controller.rb
class BlogsController < ApplicationController # GET /blogs def index if session[:counter].nil? session[:counter] = 1 else session[:counter] += 1 end end end [/ruby] <h3>View</h3> <p><strong>app/views/blogs/index.html.erb</strong></p> <p><%= session[:counter] %></p>
Routes
config/routes.rb
root 'blogs#index'
counter をカウントアップして、表示するだけのサンプルを作りました。
セッションの動きを確認する
ここまで終わったら、Rails を起動して、ブラウザ(http://localhost:3000/)でカウンターが増えることを確認しましょう。
$ bundle exec rails s
ブラウザで確認できたら、マネージメントコンソールを見てみると、アイテムが作られてるのが分かりますね!
属性として、session_id、created_at、data、updated_at がありますが、これは後述のセッション削除の条件の部分でポイントになります。
セッションデータの削除
DynamoDB に登録されるセッションデータの削除は rake タスクとして用意されているのでこれを使います。
$ bundle exec rake -T db:sessions rake db:sessions:cleanup # Clean up old sessions in Amazon DynamoDB session store
実行して、セッションデータを削除します。
$ bundle exec rake db:sessions:cleanup
マネージメントコンソールを確認してみると、アイテムが削除されてるのが分かりますね!
セッション削除の条件を指定する
dynamodb.yml にある max_age、max_stale を指定すると、上記の rake タスクで削除される条件を設定できます。
$ vim config/sessionstore/dynamodb.yml ・・・ # [Integer] Maximum number of seconds earlier # from the current time that a session was created. # By default this is 7 days. # max_age: 604800 # [Integer] Maximum number of seconds # before the current time that the session was last accessed. # By default this is 5 hours. # max_stale: 18000 ・・・
max_age、max_stale は、DyanmoDB 上に作成された Item の属性である created_at、update_at に各々対応しており、 指定した期間を過ぎている Item だけが、rake db:sessions:cleanup の際の削除対象になります。
参考サイト
aws / aws-sessionstore-dynamodb-ruby
脚注
-
このあたりの話は以下のリンクが参考になりますです。
Amazon DynamoDBによるTomcatセッション永続化とフェイルオーバー ↩