Laravel 6でのセッション管理に、NoSQLデータベースのAmazon DynamoDBを使ってみました。フレームワークを使わない場合はコチラです。
準備
DynamoDB
DynamoDBローカルを使用します。以下の項目は前回の記事を参照してください。
- IAMユーザーのアクセスキー
- DynamoDBローカルのセットアップ
セッションデータ保存用のテーブル作成
セッションデータ保存用のテーブルcache
を作成します。デフォルトではキャッシュとして使う場合と同じ設定になるのでこの名前です。
$ aws dynamodb create-table --table-name=cache --attribute-definitions AttributeName=key,AttributeType=S --key-schema AttributeName=key,KeyType=HASH --billing-mode PAY_PER_REQUEST --endpoint-url http://localhost:8000
アプリケーション
Laravelのプロジェクト作成後から始めます。
まず、AWSのSDKをインストールします。
$ composer require aws/aws-sdk-php
次に.env
にDynamoDBへアクセスするための情報を設定します。
SESSION_DRIVER=dynamodb
AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY
AWS_DEFAULT_REGION=us-east-2
DYNAMODB_ENDPOINT=http://localhost:8000
今回はテーブル名やキー名はデフォルトのものを使用します。これらを変更したい場合は、config/cache.php
で設定します。実際に設定を使用しているのは、Illuminate\Cache\CacheManager
クラスのcreateDynamodbDriver
メソッドになりますので、変更する場合はここも一度読んでおいた方が良いかと思います。
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
// 以下は変更しない場合は必要ないです
'attributes' => [
'key' => 'key', // キー名
'value' => 'value', // データ格納用の属性の名称
'expiration' => 'expires_at', // 有効期限格納用の属性の名称
],
],
最後に実際の処理を書いていきます。今回はお試しなので、ルーティングの設定(routes/web.php
)内に処理も記載します。
<?php
Route::get('/store', function (Illuminate\Http\Request $request) {
if (!$request->has('sdata')) {
return redirect('/view');
}
$request->session()->put('sdata', $request->get('sdata'));
return 'stored';
});
Route::get('/view', function (Illuminate\Http\Request $request) {
if (!$request->session()->has('sdata')) {
return 'Not found';
}
return 'DATA : ' . $request->session()->get('sdata');
});
動かしてみる
/view
にアクセスします。

セッションに保存してあるデータはありませんので、Not foundと表示されます。次に/store?sdata=hoge
にアクセスします。

これでデータが保存されたはずです。もう一度/view
にアクセスします。

保存した'hoge'が表示されました。念のため、データを直接確認してみます。
$ aws dynamodb scan --table-name cache --endpoint-url http://localhost:8000
{
"Items": [
{
"value": {
"S": "s:207:\"a:4:{s:6:\"_token\";s:40:\"ht2HgjP8Mw0ONn72Qb5SErPrH3jdtOVIUSk6m4Hv\";s:9:\"_previous\";a:1:{s:3:\"url\";s:26:\"https://dev.tdomy.com/view\";}s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:5:\"sdata\";s:4:\"hoge\";}\";"
},
"key": {
"S": "laravel_cache:YWmPOgBsDHojrexgc2NrkYnWMxOfDw74TqwfFEZC"
},
"expires_at": {
"N": "1592129027"
}
}
],
"Count": 1,
"ScannedCount": 1,
"ConsumedCapacity": null
}
見づらいですが、valueにデータが保存されているのがわかります。
まとめ
Laravel 6でセッション管理にDynamoDBを使ってみました。自分で組み込む必要が無いのは良いですね。一方で、設定の詳細なドキュメントがないのは不親切かなと思いました。ソースを読みこまないと設定が把握できませんでした。