node.jsのセッション管理にAmazon DynamoDBを使う

node.jsのセッション管理は?

node.jsにセッション管理の仕組みは備わっていません。なぜならば、node.jsが持っているhttp機能はベーシックなステートレスのみだからです。では、ステートフル(状態を保持する)な仕組みは無いのか?。実はモジュールという形で追加することで実現できます。今回は、node.jsのセッション管理の仕組みとして、Expressフレームワークを使います。このフレームワークの中にConnectというミドルウェアが統合されていて、セッション管理を行ってくれます。また、このセッション管理はデフォルトでメモリ上での管理(セッションストア)を行っていますが、Redis等を指定することも可能です。今回は、このセッションストアの部分をDynamoDBにしたいと思います。node.jsからDynamoDBに接続するライブラリはdynodeです。

環境のセットアップ

npmを使えば簡単♪

$ npm install dynode
$ npm install express
$ npm install connect
$ npm install connect-dynamodb

DynamoDB session store for Connect

connect-dynamodbは、node.jsでセッション管理を行うためのミドルウェアであるConnectのセッションストア実装です。つい最近公開されたばかりのできたてホヤホヤのオープンソースです。ついでにバグがあったのでパッチを投稿しておきました。まずはソースを修正しましょう。

$ vi node_modules/connect-dynamodb/lib/connect-dynamodb.js

パッチは他リージョン対応バグ対応です。

セッション利用のサンプルアプリ作成

node.js + Express + connect-dynamodb + dynode + DynamoDB を使ったセッション管理アプリを作ってみます。

$ vi app.js
var dynode = require('dynode');
var express = require('express');
var connect = require('connect');
var DynamoDBStore = require('connect-dynamodb')(connect);
var assert = require('assert');

var client = new (dynode.Client)({
  accessKeyId:'XXXXXXXXXXXXXXXXXXXXX',
  secretAccessKey:'XXXXXXXXXXXXXXXXXXXXX',
  host:'dynamodb.ap-northeast-1.amazonaws.com'
});

var store = new DynamoDBStore({
  client:client
});

var app = express.createServer(
  express.cookieParser(),
  express.session({
    secret:'satoshi-secret-key',
    store:store,
    cookie:{httpOnly:false, maxAge: 7 * 24 * 60 * 60 * 1000}
  })
);

app.get('/', function(req, res){
    res.send('foo = ' + req.session.foo + ', hoge = ' +req.session.hoge);
});

app.get('/set', function(req, res) {
    req.session.foo = 'bar';
    req.session.hoge = 'hogehoge';
    res.send('set: foo,hoge');
});

app.get('/del', function(req, res) {
    delete req.session.foo;
});

app.listen(3000);
$ node app.js

動作確認

実際にDynamoDBをセッション管理に使うか動作確認してみましょう。nodeを起動すると、まず始めにセッション用のテーブルを作成します。

次にブラウザからアクセスをしてセッションに値をセットします。

DynamoDBにセッション情報が格納されているか管理コンソールから確認をします。

JSON形式で保存されていることが分かりますね。また、クライアントを識別するIDはconnect.sidという名前でCookieに入っています。

まとめ

node.jsのモジュールやミドルウェアを活用することで、セッション情報を永続化することができました。CookieのIDを識別子に使っていますので、複数サーバに負荷分散したとしても同じセッション情報を使えます。DynamoDBの特性はメンテナンスフリーで高可用性で高速I/Oですので、セッション情報の永続化先にもってこいです。今日から君もステートレスサーバーな生活を手に入れよう!

参考資料

Express

Connect

Connect DynamoDB