

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

# AWS SDK for PHP バージョン 3 での DynamoDB セッションハンドラーの使用
<a name="service_dynamodb-session-handler"></a>

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

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

DynamoDB サービスに関する詳細については、[Amazon DynamoDB ホームページ](https://aws.amazon.com/dynamodb/)を参照してください。

## 基本的な使用法
<a name="basic-usage"></a>

### ステップ 1: ハンドラーを登録する
<a name="step-1-register-the-handler"></a>

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

```
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. セッションを格納するテーブルを作成する
<a name="create-a-table-for-storing-your-sessions"></a>

実際にセッションハンドラーを使用する前に、セッションを格納するテーブルを作成する必要があります。[Amazon DynamoDB 向けAWS AWS コンソール](https://console.aws.amazon.com/dynamodb/home)または AWS SDK for PHPを使用して、前もってこれを実行できます。

このテーブルを作成するときは、プライマリキーの名前として「id」を使用します。また、セッションの自動ガベージコレクションの利点を活用するため、「expires」属性を使用して[有効期限属性](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html)を設定することもお勧めします。

### ステップ 3. 通常どおりに PHP セッションを使用する
<a name="step-3-use-php-sessions-as-you-normally-would"></a>

ハンドラーが登録され、テーブルが完成したら、`$_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();
```

## 設定
<a name="configuration"></a>

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

** `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](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.DynamoDb.WriteRequestBatch.html) オブジェクトに直接渡されます。`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,
]);
```

## 料金
<a name="pricing"></a>

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

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

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


****  

|  |  | 
| --- |--- |
|  `session_start()` 経由の読み込み   |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 
|  `session_start()` 経由の読み込み (セッションロックの使用)。  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 
|  `session_write_close()` 経由で書き込み   |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 
|  `session_destroy()` 経由で削除   |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 
|  ガベージコレクション  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 

## セッションのロック
<a name="ddbsh-session-locking"></a>

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

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

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

## ガベージコレクション
<a name="ddbsh-garbage-collection"></a>

「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();
```

## ベストプラクティス
<a name="best-practices"></a>

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

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

1.  AWS マネジメントコンソールまたは Amazon CloudWatch を使用して消費スループットをモニタリングし、アプリケーションの需要に合わせて必要に応じてスループット設定を調整します。

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

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

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

## 必要な IAM 許可
<a name="required-iam-permissions"></a>

DynamoDB セッションハンドラーを使用するには、[設定された認証情報](guide_credentials.md)に、[前のステップで作成](#create-a-table-for-storing-your-sessions)した DynamoDB テーブルを使用するためのアクセス許可が必要です。次の IAM ポリシーには必要最小限のアクセス許可が含まれています。このポリシーを使用するには、リソース値を以前に作成したテーブルの Amazon リソースネーム (ARN) で置き換えます。IAM ユーザーポリシーの作成と添付の詳細については、「IAM ユーザーガイド」の「[IAM ポリシーを管理する](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)」を参照してください。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SessionHandler",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:Scan",
                "dynamodb:BatchWriteItem"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/table-name"
        }
    ]
}
```

------