DynamoDB セッションハンドラーを使用するAWSSDK for PHP バージョン 3 - AWSSDK for PHP

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

DynamoDB セッションハンドラーを使用するAWSSDK for PHP バージョン 3

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

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

DynamoDB サービスの詳細については、Amazon DynamoDB のホームページ

基本的な使用法

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

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

use Aws\DynamoDb\SessionHandler; $sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions' ]); $sessionHandler->register();

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

実際にセッションハンドラーを使用する前に、セッションを格納するテーブルを作成する必要があります。これを行うには、前もってこれを実行します。AWSAmazon DynamoDB のコンソールを使用するか、AWSSDK 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();

Configuration

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

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, ]);

Pricing

データストレージとデータ転送料金を除き、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 セッションハンドラーは、一連のScanおよびBatchWriteItemオペレーション. 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 SessionHhandler を使用するには、認証情報の設定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>" } ] }