メニュー
AWS SDK for Java
開発者ガイド

DynamoDB を使用した Tomcat セッション状態の管理

Tomcat アプリケーションは多くの場合、セッション状態のデータをメモリに保存します。ただし、アプリケーションが複数のウェブサーバーまで拡大するとセッション状態をサーバー間で共有する必要があるので、この方法には十分な拡張性がありません。一般的な対応策は、MySQL を使用して専用のセッション状態サーバーをセットアップすることです。ただし、この方法にも欠点があります。他のサーバーの管理が必要になり、セッション状態サーバーが単一障害点となります。また、MySQL サーバー自体がパフォーマンスの問題の原因となる可能性があります。

AWS の NoSQL データベースストアである DynamoDB を使用すれば、ウェブサーバー間のセッション状態の共有に効果的なソリューションが提供され、これらの欠点を回避できます。

セッションマネージャーをダウンロードする

セッションマネージャーは、GitHub の aws/aws-dynamodb-session-tomcat プロジェクトからダウンロードできます。このプロジェクトはセッションマネージャーのソースコードもホストするので、プルリクエストや未解決の問題を弊社に送信することでプロジェクトに貢献することができます。

セッション状態プロバイダーを設定する

DynamoDB セッション状態プロバイダを使用するには、以下を実行する必要があります。

  1. そのプロバイダを使用するように Tomcat サーバーを設定します。

  2. AWS にアクセスできるようにプロバイダの認証情報を設定します。

DynamoDB をセッション状態サーバーとして使用するように Tomcat サーバーを設定する

Tomcat インストールの AmazonDynamoDBSessionManagerForTomcat-1.x.x.jar ディレクトリに、lib をコピーします。AmazonDynamoDBSessionManagerForTomcat-1.x.x.jar は、完全なスタンドアロンの JAR ファイルで、DynamoDB Tomcat セッションマネージャーを実行するためのすべてのコードと依存関係が含まれています。

context.xmlcom.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager をセッションマネージャーとして指定するように、サーバーの ファイルを編集します。

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

AWS 認証情報を設定する

セッションマネージャー用の AWS 認証情報は複数の方法で指定できます。それらの認証情報は、次の優先順位に従って読み込まれます。

  1. Manager 要素の AwsAccessKey 属性と AwsSecretKey 属性は、明示的に認証情報を提供します。

  2. Manager 要素の AwsCredentialsFile 属性は、認証情報の読み込み元となる .properties ファイルを指定します。

Manager 要素を使用して認証情報を指定しなければ、DefaultAWSCredentialsProviderChain は次の順序で認証情報の検索を続行します。

  1. 環境変数 - AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY

  2. Java のシステムプロパティ - aws.accessKeyId および aws.secretKey

  3. Amazon EC2 インスタンスメタデータサービス (IMDS) によって提供されたインスタンスプロファイル認証情報

Elastic Beanstalk で設定する

Elastic Beanstalk でセッションマネージャーを使用している場合は、プロジェクトを調べ、出力アーティファクト構造の最上位に .ebextensions ディレクトリがあることを確認する必要があります。次のファイルを .ebextensions ディレクトリに配置します。

  • AmazonDynamoDBSessionManagerForTomcat-1.x.x.jar ファイル

  • 前に説明した、セッションマネージャーを設定するための context.xml ファイル

  • Tomcat の lib ディレクトリに JAR ファイルをコピーし、オーバーライドされた context.xml ファイルを適用する設定ファイル。

Elastic Beanstalk 環境のカスタマイズの詳細については、Elastic Beanstalk Developer Guide の「AWS Elastic Beanstalk 環境設定」を参照してください。

AWS Toolkit for Eclipse を使用して Elastic Beanstalk にデプロイする場合、ツールキットにセッションマネージャーのセットアップをさせることができます。[New AWS Java Web Project] ウィザードを使用し、セッション管理に DynamoDB を選択します。AWS Toolkit for Eclipse は必要なファイルを設定し、そのファイルをプロジェクトの WebContent ディレクトリ内の .ebextensions ディレクトリに格納します。このディレクトリの検索に問題が発生した場合は、ピリオドで始まるファイルを非表示にしていないことを確認してください。

DynamoDB を使用した Tomcat セッション状態の管理

EC2 インスタンスに IAM ロールを使用するよう設定されている Amazon EC2 インスタンスで Tomcat サーバーが実行されている場合は、context.xml ファイルで認証情報を指定する必要はありません。この場合、AWS SDK for Java はインスタンスメタデータサービス (IMDS) で取得した IAM ロール認証情報を使用します。

アプリケーションは、起動時に、デフォルトで Tomcat_SessionState という名前の DynamoDB テーブルを探します。このテーブルには、"sessionId" という文字列のハッシュキー (大文字と小文字は区別されます) がありますが、範囲キーはありません。また、ReadCapacityUnitsWriteCapacityUnits の適切な値があります。

アプリケーションの初回の実行前に、このテーブルを作成することをお勧めします。ただし、テーブルを作成していない場合は、拡張機能によって初期化時にテーブルが作成されます。セッション状態テーブルが存在しない場合のセッション状態テーブルの作成方法を設定する属性のリストについては、次のセクションの context.xml のオプションを参照してください。

注記

DynamoDB テーブルの操作方法とプロビジョニングされたスループットについては、DynamoDB 開発者ガイドを参照してください。

アプリケーションを設定してテーブルを作成した後は、他のどのセッションプロバイダでもセッションを使用できます。

context.xml に指定されるオプション

context.xml ファイルの Manager エレメントでは、次の設定属性を使用できます。

  • AwsAccessKey - 使用するアクセスキー ID。

  • AwsSecretKey - 使用するシークレットキー。

  • AwsCredentialsFile - AWS セキュリティ認証情報と共に accessKey プロパティと secretKey プロパティが含まれる .properties ファイル。

  • Table - オプションの文字列属性。セッションデータの格納に使用されるテーブルの名前。デフォルトは Tomcat_SessionState です。

  • RegionId – オプションの文字列属性。DynamoDB を使用する AWS リージョン。利用可能な AWS リージョンの一覧については、Amazon Web Services General Reference の「リージョンとエンドポイント」を参照してください。

  • Endpoint - オプションの文字列属性。指定すると、Region オプションに設定した値がオーバーライドされます。この属性は、使用する DynamoDB サービスのリージョンのエンドポイントを指定します。利用可能な AWS リージョンの一覧については、Amazon Web Services General Reference の「リージョンとエンドポイント」を参照してください。

  • ReadCapacityUnits - オプションの整数属性。セッションマネージャーがテーブルを作成する際に使用する読み取りキャパシティーユニット。デフォルトは 10 です。

  • WriteCapacityUnits - オプションの整数属性。セッションマネージャーがテーブルを作成する際に使用する書き込みキャパシティーユニット。デフォルトは 5 です。

  • CreateIfNotExist - オプションのブール属性。CreateIfNotExist 属性は、テーブルが存在しない場合にセッションマネージャーがテーブルを自動作成するかどうかを制御します。デフォルトは true です。このフラグが false に設定されており、テーブルが存在しない場合は、Tomcat の起動時に例外がスローされます。

トラブルシューティング

セッションマネージャーで問題が発生した場合は、最初に catalina.out を調べます。Tomcat のインストールにアクセスできる場合は、このログファイルを直接参照し、セッションマネージャーからのエラーメッセージを検索できます。Elastic Beanstalk を使用している場合は、AWS マネジメントコンソール または AWS Toolkit for Eclipse で環境ログを表示できます。

制約事項

セッションマネージャーはセッションのロックをサポートしていません。したがって、多数の同時 AJAX 呼び出しを使用してセッションデータを操作するアプリケーションは、セッションマネージャーでの使用に適していない場合があります。これは、セッションデータの競合状態がデータストアに書き込まれ、保存されるためです。