2014年2月7日

DynamoDB で tomcat の session を管理する

DynamoDB で session 管理

AWS SDK for Java のドキュメントに、「Manage Tomcat Session State with Amazon DynamoDB」という項目があります。
http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-tomcat-session-manager.html

名前の通り Tomcat の Session を DynamoDB で管理する方法がありました。こちらを試してみます。

ソースは github にあります。
https://github.com/aws/aws-dynamodb-session-tomcat

Eclipse で github からソース取得して、「プロジェクトのインポート」をすることでプロジェクトとして認識されます。
pom.xml があるので、プロジェクトの右クリックメニューから maven プロジェクトへ変換できますのでしてしまいましょう。

変換後、pom.xml を右クリックして maven build でゴールを package とすれば target ディレクトリに aws-dynamodb-session-tomcat-1.0.0.jar が作られます。

前述の AWS のドキュメントに
Copy AmazonDynamoDBSessionManagerForTomcat-1.x.x.jar to the lib directory of your Tomcat installation.
とありますのでこの jar を tomcat の lib ディレクトリに入れましょう。WEB-INF/lib の中に入れても起動時に java.lang.ClassNotFoundException となるようです。
注意が必要なのはこの aws-dynamodb-session-tomcat-1.0.0.jar から DynamoDB へアクセスするわけですから AWS SDK が必要となるため、AWS SDK およびその依存ライブラリも lib へ入れておきましょう。(Eclipse で AWS Java Web Project を作成する際に DynamoDB Session Management を選択して作成された jar には依存ライブラリも含まれているようです)

次に context.xml を編集して、Session 管理に DynamoDB を使用するように修正します。

設定できる項目は以下です。AccessKey/SecretKey、CredentialsFile を設定していなかった場合は DefaultAWSCredentialsProviderChain を使用するようですので、EC2 上で IAM Role を使いたい場合は何も設定しなければいいですね。
awsAccessKeyアクセスキー
awsSecretKeyシークレットキー
awsCredentialsFileアクセスキー/シークレットキーが書かれたファイルパス
endpointDynamo DB のエンドポイント
regionId使用するリージョン
tableテーブル名、省略した場合 Tomcat_SessionState
createIfNotExisttrue の場合、存在しない場合に新規作成する
readCapacityUnitsテーブル作成時に設定する read capacity units
writeCapacityUnitsテーブル作成時に設定する write capacity units

ドキュメントにもサンプルがありますが、例えばこんな感じです。
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
             endpoint="dynamodb.ap-northeast-1.amazonaws.com"
             table="hogehoge_session"
             createIfNotExist="true"
              />
</Context>

これで起動すれば Sessin は DynamoDB で管理されるようになります。Auto-Scaling で試してみたいですね!

DynamoDBLocal で session 管理

さて、context.xml に endpoint があったので思いついた人もいるかと思いますが、これを DynamoDBLocal で試します。
endpoint を DynamoDBLocal に向けるだけなので簡単です。
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
             awsAccessKey="teketou"
             awsSecretKey="teketou"
             endpoint="http://localhost:8000"
             table="hogehoge_session"
             createIfNotExist="true"
              />
</Context>
DynamoDBLocal に session を保持する意味はあまりわかりませんが、ビーチでも飛行機の中でもコーディングできるようにはなると思います!

0 コメント:

コメントを投稿