この記事は、ゆめみ Advent Calendar 2021 の7日目の記事です(もう過ぎちゃったけど)
Laravel でデフォルトで用意しているルーティング定義ファイルとして api.php
と web.php
があります
ユーザー定義のルーティング定義ファイルを増やす方法を紹介します
前提条件
確認したバージョン
- PHP 8
- Laravel v8.x
やり方
参考に実装してみた Pull Request の Files changed を見るのが手っ取り早いです
参考実装に従って、ヘルスチェック用のルーティングファイルを増やす手順を示します
ヘルスチェック用のルーティングを書くファイルを新しく作る
routes/health-check.php
とでもします
routes/health-check.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/health-check', function () {
return response()->json(['status' => 'ok']);
});
クロージャで適当な JSON を返しておきます
RouteServiceProvider でルーティングを登録
boot
メソッドに足しましょう
app/Prooviders/RouteServiceProvider.php
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
+ Route::namespace($this->namespace)
+ ->group(base_path('routes/health-check.php'));
});
}
これだけで OK です
ヘルスチェックのエンドポイントを叩けばレスポンスが返ってきます
$ curl -i http://localhost/health-check
HTTP/1.1 200 OK
Date: Tue, 07 Dec 2021 15:41:59 GMT
Server: Apache
Cache-Control: no-cache, private
X-Robots-Tag: noindex, nofollow
Content-Length: 15
Content-Type: application/json
{"status":"ok"}
メリット
- ヘルスチェックのためだけのルーティングが、アプリケーションのルーティングに混ざらなくて良い
-
web
やapi
のルーティンググループで通している Middleware を通らないので、無駄な処理が発生しない- 例えば、セッションが生成されたりしない 1
- その気になればちょっとした処理も書ける
- バックエンドのデータストアとの接続性を確認したり
- データストアからメンテナンス状態を確認して、メンテナンスモードのレスポンスを返すなど
- がんばればテストも書ける
- PHP や Laravel のブートストラップまでは正常に動くことが確認できる
デメリット
- 単に Web サーバーが生きているか確認するだけなら、 public に静的ファイルを置くだけでよい
- web や api で動かしている Middleware が生きてるかは確認できない
- RouteServiceProvider での登録時にヘルスチェックで確認したいものを Middleware group 指定すればいいけど
- フレームワークのバージョンが上がって、 RouteServiceProvider の書き方が変わったら移植する必要がある
- 6.x → 8.x で結構変わってた
- ルーティングの重複に気づきづらい
- API に行って欲しいけど一生ヘルスチェックに吸われるとかがあるかも
まとめ
- 気軽にルーティングファイルを生やしていきましょう
- アプリケーション内のある程度の単位で別けるのも、スッキリして良さそう
- ただし、やりすぎると混乱するのでほどほどに
-
AWS ELB のヘルスチェックで無限にセッションが生成される地獄を経験された方なら嬉しさがわかるかも ↩