この記事について
Laravelアプリケーションではセッション情報をデータベースに保存することが可能です。アプリケーションにリクエストが発生するたびに、セッションをデータベースに保存します。
もしLaravelアプリケーションの正常性を監視するためにヘルスチェックを実装している場合、セッションをデータベースに保存したくありません。
ヘルスチェックのような特定のリクエストのセッションをデータベースに保存しないようにする手法についてこのメモにまとめます。
構成
Laravel(バージョン10)アプリケーションはECSにて稼働しています。
ECSのタスク内にはLaravel(PHP-FPM)コンテナとNGINXコンテナが稼働しています。
ALBを経由して、ユーザのリクエストをアプリケーションに送信します。
バックエンドDBとしてはRDS(MySQL)を利用しています。
アプリケーションのデータと、セッションをこのRDSに保存するようにしています。
[ユーザー] => [ALB] => [NGINX(ECS)] => [Laravel(ECS)] => [MySQL(RDS)]
結論
ルーティングにて、セッションをDBに保存しないように設定する
ことで実現可能です。
今回であればヘルスチェックのルーティングに以下のエントリーを追加すれば良いです。
config()->set('session.driver', 'array');
Laravelにはセッションドライバーという設定があります。セッションドライバーとはセッションを保存する場所です。config/session.phpファイルにセッションドライバーを定義すると、アプリケーション全体でそのセッションドライバーが利用されるようになります。(実際にはSESSION_DRIVERなどを.envにて指定します。このSESSION_DRIVERなどの変数がconfig/session.phpにて利用されています。)
特定の箇所にてセッションドライバーを指定したい場合はconfig()->set('session.driver', 'xxxx')
と定義します。
セッションドライバーをarrayにすると、セッション情報はPHP配列として保存されて、永続化されなくなります。
// アプリケーションのルーティング
Route::group(['prefix' => 'app'], function () {
Route::get('index', [AppController::class, 'index'])->name('index');
Route::get('create', [AppController::class, 'create'])->name('create');
Route::post('create', [AppController::class, 'store'])->name('store');
});
// ヘルスチェックのルーティング
Route::group(['prefix' => 'healthcheck'], function () {
config()->set('session.driver', 'array');
Route::get('/', function () {
return response()->json([]);
});
});
このようにヘルスチェックのルーティングのグループ内に設定を差し込むことで、ヘルスチェックのセッションはデータベースに保存されなくなります。
参考