前置き
今時のWebアプリケーション開発では、開発環境と本番環境はほとんど同じ構成になっている上、VCSで一元管理されているソースコードを自動デプロイツールでデプロイするので、デプロイ時に問題が起こることはなかなかありません。
ですが中にはどうしても開発環境と本番環境で同等にできず、その上VCSで管理することもできず、デプロイ時に問題を起こしがちなものもあります。
Laravelにおいては.env
がそれです。このファイルは環境ごとに変わるデータを入れるのが目的のため開発環境と本番環境で同じものを使うことは基本的にできない上、APIのキー等の秘密情報を入れることも多く、VCSで管理することもできません。
# .envの一部。データベースの接続情報などが記載されている。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
実際、laravel new
して自動生成される.gitignore
ではこのファイルが除外リストに入っています。
一度用意した後は頻繁に変更するものではありませんが、それでもたまにこのファイルに入れておきたいデータが増えることがあります。
そのような変更の後には.env
を手動で変更した上でデプロイする必要があります。.env
の変更を忘れると、場合によっては致命的な問題になります。外部の決済システムを変更した後、新しい決済システム用の認証情報がない場合、どうなるでしょう?
本題
今日はLaravel Env ValidatorとLaravel Deployerを使ってこのような問題をできる限り防ぐための方法をご紹介します。
Laravel Env Validatorは、.env
(というか環境変数自体)をLaravelのヴァリデーションルールを使ってヴァリデーションする機能を提供するパッケージです。
config/laravel-env-validator.php
に以下のように記述して、
<?php
return [
'rules' => [
'APP_ENV' => 'in:local,production',
'APP_KEY' => 'required',
'APP_DEBUG' => 'boolean',
],
];
php artisan config:env-validator
と実行すると、環境変数が検証され、たとえば上記の場合だと、APP_ENV
がtestingだったり、APP_KEY
が未設定の状態だったりすると以下のようなエラーを出します。
In EnvValidator.php line 31:
The .env file has some problems. Please check config/laravel-env-validator.php
The selected APP_ENV is invalid.
The APP_KEY field is required.
注意としてはconfigとして記述するため、Illuminate\Validation\Rule
のルールを使うようなことはできません。というか実際にはできないことはないのですが、php artisan config:cache
でエラーになってしまうため実用的ではありません。シリアライズできないんですね。ですので複雑なルールを書くような場合は、カスタムルールを用意するのがよさそうです。
さて、これだけでも便利ですが、できればデプロイ時に自動でヴァリデーションさせたいところです。自動で防げるミスは防ぎたいですよね。
そこでLaravel Deployerで以下のように設定します。
まず、php artisan config:env-validator
を実行するタスクをレシピに書きます。
<?php
namespace Deployer;
desc('validate .env');
task('artisan:config:env-validator', artisan('config:env-validator'));
次にこのレシピをincludeします。config/deploy.php
は、php artisan deploy:init
で事前に用意しておいてください。
'include' => [
'recipe/artisan-config-env-validator.php',
],
最後に、このタスクを実行するよう設定します。
'ready' => [
'artisan:storage:link',
'artisan:view:clear',
'artisan:cache:clear',
'artisan:config:env-validator',
'artisan:config:cache',
'artisan:migrate',
],
artisan:config:cache
の前に実行するのが肝です。config:cacheされた後は環境変数は読み込まれないため、環境変数を直接見ているLaravel Env Validatorのヴァリデーションは正常に動作しません。
後はその他必要なデプロイのための設定をして、デプロイするだけです。.envをヴァリデーションして問題なければデプロイが成功しますし、そうでなければ失敗します。これにより、適切なルールを用意している限り、.envの記述ミスで問題のあるデプロイをしてしまうことがなくなります。