この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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ですので、セッション情報の永続化先にもってこいです。今日から君もステートレスサーバーな生活を手に入れよう!