
Laravel では php artisan down コマンドと php artisan up コマンドを使ってアプリケーションの「メンテナンスモード」を切り替えることができる.仕組みとしては storage/framework/down というファイルがあったらメンテナンス画面を返すようになっていて,php artisan down コマンドと php artisan up コマンドは storage/framework/down ファイルを操作する.
しかし Bref を使って Laravel アプリケーションを AWS Lambda 関数で動かす場合に /var/task ディレクトリが読み取り専用になっているため storage/framework/down ファイルを操作できないという制約がある.よって,Bref には専用の仕組みがある.
具体的には Bref では Bref Laravel Bridge というライブラリを使って MAINTENANCE_MODE という環境変数があったら /tmp/storage/framework/down ファイルを操作してメンテナンスモードを切り替えるように拡張されている.コード的には src/MaintenanceMode.php あたりが参考になる😀
実際に試してみた \( 'ω')/
Laravel 標準のメンテナンスモードを試す
まずは Laravel 標準のメンテナンスモードを試す.新しく Laravel プロジェクトをセットアップして php artisan down コマンドを実行するとメンテナンス画面に切り替わった👌
$ php artisan down
INFO Application is now in maintenance mode.

storage/framework/down ファイルもできていた.
$ cat storage/framework/down { "except": [ "\/up" ], "redirect": null, "retry": null, "refresh": null, "secret": null, "status": 503, "template": null }
メンテナンスモードを戻すときは php artisan up コマンドを実行する.
$ php artisan up
INFO Application is now live.
$ cat storage/framework/down
cat: storage/framework/down: No such file or directory
Bref をセットアップする
Bref の Getting started を参考に Laravel プロジェクトを修正する.
$ composer require bref/bref bref/laravel-bridge --update-with-dependencies $ php artisan vendor:publish --tag=serverless-config
自動生成されたserverless.yml は必要最低限な設定まで減らして,最終的に以下のようになった.ポイントは MAINTENANCE_MODE: ${param:maintenance, null} で,デプロイ時に --param="maintenance=1" を付けるとメンテナンスモードを切り替えることができるところ.
service: sandbox-bref-maintenance-mode provider: name: aws region: ap-northeast-1 environment: APP_ENV: ${sls:stage} APP_KEY: 'base64:+b5SgEAbvM6+u0kDdmiLRvowHwdg/7PixBYCCI5vEVg=' APP_DEBUG: 0 SESSION_DRIVER: cookie MAINTENANCE_MODE: ${param:maintenance, null} LOG_CHANNEL: stderr LOG_STDERR_FORMATTER: Bref\Monolog\CloudWatchFormatter functions: web: handler: public/index.php runtime: php-84-fpm timeout: 28 events: - httpApi: '*' package: patterns: - '!.env' - '!node_modules/**' - '!public/storage' - '!resources/assets/**' - '!resources/css/**' - '!resources/images/**' - '!resources/js/**' - '!storage/**' - '!tests/**' - '!database/*.sqlite' plugins: - ./vendor/bref/bref
Bref を使って AWS Lambda 関数にデプロイする(メンテナンスモード OFF)
まずはメンテナンスモード OFF でデプロイする.
$ serverless deploy Deploying sandbox-bref-maintenance-mode to stage dev (ap-northeast-1) ✔ Service deployed to stack sandbox-bref-maintenance-mode-dev (33s) endpoint: ANY - https://pfyn3zqflf.execute-api.ap-northeast-1.amazonaws.com functions: web: sandbox-bref-maintenance-mode-dev-web (38 MB) Want a better experience than the AWS console? Try out https://bref.sh/cloud
Amazon API Gateway のエンドポイントにアクセスすると Laravel の初期画面が表示された👌

Bref を使って AWS Lambda 関数にデプロイする(メンテナンスモード ON)
次にメンテナンスモード ON でデプロイする.
$ serverless deploy --param="maintenance=1" Deploying sandbox-bref-maintenance-mode to stage dev (ap-northeast-1) ✔ Service deployed to stack sandbox-bref-maintenance-mode-dev (38s) endpoint: ANY - https://pfyn3zqflf.execute-api.ap-northeast-1.amazonaws.com functions: web: sandbox-bref-maintenance-mode-dev-web (38 MB) Want a better experience than the AWS console? Try out https://bref.sh/cloud
すると Bref を使って AWS Lambda 関数にデプロイした Laravel アプリケーションでも同じメンテナンス画面に切り替わった👌

カスタム画面をデプロイする
Laravel では resources/views/errors/503.blade.php ファイルを使ってデフォルトのメンテナンス画面をカスタマイズできる.
今回は簡単に We are currently down for maintenance. Please check back soon. という1文を追加したメンテナンス画面を追加して,もう一度メンテナンスモード ON でデプロイする.
$ serverless deploy --param="maintenance=1" Deploying sandbox-bref-maintenance-mode to stage dev (ap-northeast-1) ✔ Service deployed to stack sandbox-bref-maintenance-mode-dev (27s) endpoint: ANY - https://pfyn3zqflf.execute-api.ap-northeast-1.amazonaws.com functions: web: sandbox-bref-maintenance-mode-dev-web (38 MB) Want a better experience than the AWS console? Try out https://bref.sh/cloud
するとカスタム画面に切り替わった👌

最終的にメンテナンスモードを解除する場合は --param="maintenance=1" を付けずにデプロイすれば OK👌
$ serverless deploy
まとめ
Bref と Bref Laravel Bridge で Laravel アプリケーションのメンテナンスモードを切り替える仕組みを試してみた.Bref Laravel Bridge には他にも Laravel アプリケーションを AWS Lambda 関数で動かすための仕組みが実装されているから調べてみようと思う❗️