AWS SDK for PHP バージョン 3 での DynamoDB セッションハンドラーの使用 - AWS SDK for PHP

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS SDK for PHP バージョン 3 での DynamoDB セッションハンドラーの使用

DynamoDB セッションハンドラーは PHP 用カスタムセッションハンドラーで、デベロッパーは Amazon DynamoDB をセッションストアとして使用できます。DynamoDB をセッションのストレージに使用すると、ローカルファイルシステムからセッションを共有の場所に移動することで、分散されたウェブアプリケーションのセッション処理で発生する問題を抑制します。DynamoDB は高速で、スケーラブルで、設定が簡単で、データのレプリケーションを自動的に処理します。

DynamoDB セッションハンドラーは、session_set_save_handler() 関数を使用して DynamoDB オペレーションを PHP のネイティブセッション関数にフックして、代替を許可します。これには、セッションのロックやガベージコレクションなどの機能のサポートが含まれています。これは、PHP のデフォルトのセッションハンドラーの一部です。

DynamoDB サービスに関する詳細については、Amazon DynamoDB ホームページを参照してください。

基本的な使用法

ステップ 1: ハンドラーを登録する

まず、インスタンス化し、セッションハンドラーを登録します。

use Aws\DynamoDb\SessionHandler; $dynamoDb = new Aws\DynamoDb\DynamoDbClient([ 'region'=>'us-east-1' // Since version 3.277.10 of the SDK, ]); // the 'version' parameter defaults to 'latest'. $sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions' ]); $sessionHandler->register();

ステップ 2。セッションを格納するテーブルを作成する

実際にセッションハンドラーを使用する前に、セッションを格納するテーブルを作成する必要があります。Amazon DynamoDB 向け AWSAWS コンソールまたは AWS SDK for PHP を使用して、前もってこれを実行できます。

このテーブルを作成するときは、プライマリキーの名前として「id」を使用します。また、セッションの自動ガベージコレクションの利点を活用するため、「expires」属性を使用して有効期限属性を設定することもお勧めします。

ステップ 3。通常どおりに PHP セッションを使用する

ハンドラーが登録され、テーブルが完成したら、$_SESSION superglobal を使用して、セッションに対して読み書きを行うことができます。これは PHP のデフォルトセッションハンドラーを使用する場合と同じです。DynamoDB セッションハンドラーは DynamoDB とのやり取りをカプセル化および抽象化します。これにより、PHP のネイティブセッション関数とインターフェイスを使用できるようになります。

// Start the session session_start(); // Alter the session data $_SESSION['user.name'] = 'jeremy'; $_SESSION['user.role'] = 'admin'; // Close the session (optional, but recommended) session_write_close();

構成

次のオプションを使用してセッションハンドラーの動作を設定することができます。すべてのオプションは必要に応じて利用できますが、デフォルトの内容を十分理解してください。

table_name

セッションを保存する DynamoDB テーブルの名前。これのデフォルトは 'sessions' です。

hash_key

DynamoDB セッションテーブル内のハッシュキーの名前。これのデフォルトは 'id' です。

data_attribute

セッションデータが格納されている DynamoDB セッションテーブルの属性の名前。これのデフォルトは 'data' です。

data_attribute_type

セッションデータが格納されている DynamoDB セッションテーブルの属性のタイプ。このデフォルトは ['string'] ですが、オプションで 'binary' に設定することができます。

session_lifetime

ガーベージコレクションを開始するまでの非アクティブなセッションの継続期間。指定されない場合は、使用される実際の継続期間値は ini_get('session.gc_maxlifetime') です。

session_lifetime_attribute

セッションの有効期限が格納されている DynamoDB セッションテーブルの属性の名前。これのデフォルトは 'expires' です。

consistent_read

セッションハンドラーが GetItem オペレーションに対して整合性のある読み込みを使用するかどうかを示します。デフォルトは true です。

locking

セッションのロックを使用するかどうかを指定します。デフォルトは false です。

batch_config

ガベージコレクション中にバッチ削除を使用するように設定します。これらのオプションは、DynamoDB WriteRequestBatch オブジェクトに直接渡されます。SessionHandler::garbageCollect() 経由でガベージコレクションを手動でトリガーします。

max_lock_wait_time

セッションハンドラーが、放棄するまでロックの取得を待機する最大時間 (秒単位)。デフォルトは 10 で、セッションのロックでのみ使用されます。

min_lock_retry_microtime

セッションハンドラーが、ロックの取得を試みる間に待機する最小時間 (マイクロ秒単位)。デフォルトは、10000 で、セッションのロックでのみ使用されます。

max_lock_retry_microtime

セッションハンドラーが、ロックの取得を試みる間に待機する最大時間 (マイクロ秒単位)。デフォルトは、50000 で、セッションのロックでのみ使用されます。

セッションハンドラーを設定するには、ハンドラーをインスタンス化するときに設定オプションを指定します。次のコードでは、すべての設定オプションを指定した例を示します。

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'hash_key' => 'id', 'data_attribute' => 'data', 'data_attribute_type' => 'string', 'session_lifetime' => 3600, 'session_lifetime_attribute' => 'expires', 'consistent_read' => true, 'locking' => false, 'batch_config' => [], 'max_lock_wait_time' => 10, 'min_lock_retry_microtime' => 5000, 'max_lock_retry_microtime' => 50000, ]);

料金

データストレージとデータ転送料金を除き、DynamoDB の使用に関連するコストは、使用するテーブルのプロビジョンドスループット性能に基づいて計算されます (詳細については、「Amazon DynamoDB 料金」を参照)。スループットは、書き込み容量と読み込み容量のユニットで測定されます。Amazon DynamoDB ホームページでは次のように記載されています。

読み込みキャパシティーユニットは、サイズが 4 KB である項目に対する、1 秒あたり 1 回の強力な整合性のある読み込み (または 1 秒あたり 2 回の結果整合性のある読み込み) を表します。書き込みキャパシティーユニットは、サイズが 1 KB である項目に対する、1 秒あたり 1 回の書き込みを表します。

最終的に、セッションテーブルに必要なスループットとコストは、予想されるトラフィックおよびセッションサイズとの相関があります。以下の表では、各セッション関数に対して、DynamoDB テーブルで実行される読み取りおよび書き込みオペレーションの量を説明します。

session_start() 経由の読み込み

  • 1 回の読み込みオペレーション (consistent_readfalse の場合は 0.5 のみ)。

  • (条件付き) 有効期限が切れている場合にセッションを削除する 1 回の書き込みオペレーション。

session_start() 経由の読み込み (セッションロックの使用)。

  • 最低 1 回の 書き込みオペレーション。

  • (条件付き) セッションのロックの獲得を試行するたびの追加書き込みオペレーション。ロックの待機時間と再試行オプションの設定に基づく。

  • (条件付き) 有効期限が切れている場合にセッションを削除する 1 回の書き込みオペレーション。

session_write_close() 経由で書き込み

  • 1 回の書き込みオペレーション

session_destroy() 経由で削除

  • 1 回の書き込みオペレーション

ガベージコレクション

  • 期限切れのセッションに対してスキャンするテーブル内のデータ 4 KB ごとに 0.5 回の読み取りオペレーション。

  • 削除するための期限切れの項目あたり 1 回の書き込みオペレーション。

セッションのロック

DynamoDB セッションハンドラーは、PHP のデフォルトのセッションハンドラー動作を模倣するペシミスティックセッションロックをサポートします。デフォルトでは、DynamoDB セッションハンドラーはこの機能をオフにします。特に Ajax リクエストまたは iflame を使用するときに、アプリケーションがセッションにアクセスして、パフォーマンスのボトルネックとコスト上昇につながる可能性があるからです。有効にする前に、セッションのロックがアプリケーションで必要とされるかどうかを十分に検討します。

セッションのロックを有効にするには、'locking' をインスタンス化するときに、true オプションを SessionHandler に設定してください。

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'locking' => true, ]);

ガベージコレクション

「expires」属性を使用して、DynamoDB テーブルで TTL 属性を設定します。これにより、セッションが自動的にガベージコレクションの対象になり、自分でガベージコレクションを実行する必要がなくなります。

または、DynamoDB セッションハンドラーは、一連の ScanBatchWriteItem オペレーションを使用することでセッションのガベージコレクションをサポートしています。Scan オペレーション処理の仕様上、すべての期限切れのセッションを検索し、それらを削除するには、ガベージコレクションプロセスに多大なプロビジョンドスループットが必要です。

このため、自動化されたガベージコレクションはサポートされていません。消費スループットのバーストが残りのアプリケーションは中断しない、オフピーク時間中に実行するようにガベージコレクションのスケジュールを設定することがベストプラクティスです。たとえば、夜間の cron ジョブでガベージコレクションを実行するスクリプトをトリガーすることもできます。このスクリプトは、次のように何らかの処理を実行する必要があります。

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'batch_config' => [ 'batch_size' => 25, 'before' => function ($command) { echo "About to delete a batch of expired sessions.\n"; } ] ]); $sessionHandler->garbageCollect();

'before' オプションを 'batch_config' オペレーションの内部で使用して、ガベージコレクションプロセスによって実行される BatchWriteItem オペレーションに遅延を導入します。これにより、ガベージコレクションが完了するまでにかかる時間は増加しますが、ガベージコレクション中にプロビジョンドスループット性能内、または近くに抑えられるように、DynamoDB セッションハンドラーによって行われるリクエストを分散できます。

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'batch_config' => [ 'before' => function ($command) { $command['@http']['delay'] = 5000; } ] ]); $sessionHandler->garbageCollect();

ベストプラクティス

  1. アプリケーションサーバーと同じリージョンまたは地理的に最も近い AWS リージョンにセッションテーブルを作成します。これにより、アプリケーションと DynamoDB データベース間で、レイテンシーが最小になります。

  2. 使用するセッションテーブルのプロビジョンドスループット性能を慎重に選択します。アプリケーションへの予想されるトラフィックとセッションの予想サイズを考慮します。または、テーブルに対して「オンデマンド」読み取り/書き込みキャパシティーを使用します。

  3. AWS マネジメントコンソールまたは Amazon CloudWatch で消費スループットをモニタリングし、アプリケーションのニーズに対応できるようにスループット設定を調整します。

  4. セッションのサイズを小さく抑えます (理想的には、1 KB 未満)。セッションが小さいと、パフォーマンスが向上し、必要なプロビジョンドスループット性能が減ります。

  5. アプリケーションで必要な場合を除き、セッションのロックを使用しないでください。

  6. PHP の組み込みのセッションガベージコレクショントリガーを使用する代わりに、cron ジョブ、または別のスケジューリングメカニズムを使用してガベージコレクションのスケジュールを設定して、オフピークの時間帯中に実行します。便利な 'batch_config' オプションを使用します。

必要な IAM 許可

DynamoDB セッションハンドラーを使用するには、設定された認証情報に、前のステップで作成した DynamoDB テーブルを使用するためのアクセス許可が必要です。次の IAM ポリシーには必要最小限のアクセス許可が含まれています。このポリシーを使用するには、リソース値を以前に作成したテーブルの Amazon リソースネーム (ARN) で置き換えます。IAM ユーザーポリシーの作成と添付の詳細については、「IAM ユーザーガイド」の「IAM ポリシーを管理する」を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "dynamodb:GetItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:Scan", "dynamodb:BatchWriteItem" ], "Effect": "Allow", "Resource": "arn:aws:dynamodb:<region>:<account-id>:table/<table-name>" } ] }