DynamoDBを利用したTomcatセッションレプリケーションのやり方


1からやり方を教えてくれる記事が無かったので、自分でまとめる。

1. ライブラリを入手

ライブラリ入手サイト
サイト内「aws-dynamodb-session-tomcat-2.0.1.jar.zip」をクリックしてダウンロード。(2016/06/20時点)

※ソースも落とせるけど、Jarが楽チン。

2. Tomcatのlibディレクトリに、1のライブラリを配置

libの場所は環境によって異なるが、「/opt/tomcat8/lib/」あたりにあることが多い。

注意点

  1. WEB-INF/lib ではなく、Tomcatのlibに配置する。
  2. どこかのサイトに、併せてAWS関連のjarも必要と書いてあったが、結果的に不要だった。

3. Tomcatのcontext.xmlの編集

context.xmlの場所は環境によって異なるが、「/opt/tomcat8/conf/context.xml」あたりにあることが多い。

東京リージョンのDynamoDBで、EC2にDynamoDBを操作するロールが設定されている場合は、以下の設定で良い。
ロール??って人は、以下の設定に「awsAccessKey」と「awsSecretKey」を追加してください。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <Manager className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
           regionId="ap-northeast-1"
           endpoint="dynamodb.ap-northeast-1.amazonaws.com"
           createIfNotExist="true"/>
</Context>

※その他の設定値は、こちらを参照

4. Tomcatの再起動

サービス登録してるなら、service tomcat restartとかで。

以上までで、上手くいっていれば、対象のアプリケーションにアクセスしたときにDynamoDBに
「Tomcat_SessionState」テーブルが作成され、セッション管理できているはず。

テーブル名を変えたいときは、context.xmlに「table」パラメータを追加する。(table="hogehoge")

注意!

ここのサイトにも書いてあるけど
スティッキーセッションを使用しないと、値のまき戻りが発生することがある。

この件に関して、 AWSサポートに問い合わせたところ、以下の回答だった。

結論から申しますとセッション情報が最新状態とならないことはありえます。

aws-dynamodb-session-tomcat では Tomcat の PersistentManagerBase というクラスを継承して作成されております。
PersistenManager は Tomcat のメモリで持っているセッション情報永続化のために利用されますが、 同期的に書き込みをせず、最低値を設定した場合でも1秒経過しなければ、セッション情報を永続化しません。

上記より、スティッキーセッションを利用できない場合、1秒以内に同じクライアントからそれぞれ別のインスタンスへアクセスした場合にはセッション情報が最新状態とならない挙動となります。

本事象は既に記載しておりますように DynamoDB 利用による問題ではなく、Tomcat の PersistentManager に依存した挙動となっております。

上記を考慮した上での使用をお勧め致します。