menu-icon

セッション管理にDynamoDBを使う(Laravel 6)

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へアクセスするための情報を設定します。

.env
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メソッドになりますので、変更する場合はここも一度読んでおいた方が良いかと思います。

config/cache.php
        '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)内に処理も記載します。

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を使ってみました。自分で組み込む必要が無いのは良いですね。一方で、設定の詳細なドキュメントがないのは不親切かなと思いました。ソースを読みこまないと設定が把握できませんでした。