Laravel6/PHP7/Redisで構成されたシステムの、セッションストアで使用していたRedis部分をDynamoDB(AWSのNoSQLデータベース)に置き換えたときのメモです。
LaravelもPHPもバージョン古めですがごめんなさい。
% php artisan -V
Laravel Framework 6.20.45
% which php
/usr/local/opt/php@7.3/bin/php
Laravel で DynamoDB を使うための AWS SDK for PHP は2024年11月時点での最新版(バージョン3.326.0)を入れています。
AWS SDK for PHP のインストール方法やAWSのアクセスキーID確認方法などは今回記載しません。
dd(\Aws\Sdk::VERSION);
"3.326.0"
セッションの保存先をRedisからDynamoDBへ変更
1) .env を修正
それではまず、 .env
ファイルを修正していきます。
# 中略
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
↑これをこうします。↓
# 中略
SESSION_DRIVER=dynamodb
AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=your_aws_access_key_id
AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key
DYNAMODB_SESSION_TABLE=table_name
DYNAMODB_PARTITION_KEY=partition_key_name
2) app/Providers/AppServiceProvider.php を修正
次に app/Providers/AppServiceProvider.php
を修正します。
実際のコードでは .env
の値をそのまま呼び出さずconfig挟んでから呼び出したりはしていますが、シンプルに書くと以下のような感じかと。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Routing\UrlGenerator;
use Illuminate\Support\Facades\Session;
use Aws\DynamoDb\SessionHandler;
use Aws\DynamoDb\DynamoDbClient;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot(UrlGenerator $url)
{
$dynamoDb = new DynamoDbClient([
'region' => env('AWS_REGION'),
'credentials' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
],
// PHP7でAWS SDK for PHPを使うと出てくる警告を抑制
'suppress_php_deprecation_warning' => true,
]);
$handler = SessionHandler::fromClient($dynamoDb, [
'table_name' => env('DYNAMODB_SESSION_TABLE'),
'hash_key' => env('DYNAMODB_PARTITION_KEY'),
]);
Session::extend('dynamodb', function ($app) use ($handler) {
return $handler;
});
}
}
基本これだけだったと思います。
いろいろな記事やサイトを見ているとカスタムのセッションハンドラーを自作してファイル配置しているような内容も多かったのですが、せっかくSDKを導入しているので一番シンプルな方法をメモしておこうと思いました。
変なところがあったらぜひ教えてください。
参考URL
aws SDK for PHP 3.x APIリファレンス - Aws/DynamoDb/DynamoDbClient
LaravelでAWS SDKのS3を扱う
Laravel 6.x(またはLumen 6.x)でDynamoDBに接続する
Laravel 8でセッションドライバーをDynamoDBに設定