1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

Organization

Laravelで.envに問題がある場合はデプロイ時にエラーにする

前置き

今時のWebアプリケーション開発では、開発環境と本番環境はほとんど同じ構成になっている上、VCSで一元管理されているソースコードを自動デプロイツールでデプロイするので、デプロイ時に問題が起こることはなかなかありません。

ですが中にはどうしても開発環境と本番環境で同等にできず、その上VCSで管理することもできず、デプロイ時に問題を起こしがちなものもあります。

Laravelにおいては.envがそれです。このファイルは環境ごとに変わるデータを入れるのが目的のため開発環境と本番環境で同じものを使うことは基本的にできない上、APIのキー等の秘密情報を入れることも多く、VCSで管理することもできません。

.env
# .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 ValidatorLaravel Deployerを使ってこのような問題をできる限り防ぐための方法をご紹介します。

Laravel Env Validatorは、.env(というか環境変数自体)をLaravelのヴァリデーションルールを使ってヴァリデーションする機能を提供するパッケージです。

config/laravel-env-validator.phpに以下のように記述して、

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を実行するタスクをレシピに書きます。

recipe/artisan-config-env-validator.php
<?php

namespace Deployer;

desc('validate .env');
task('artisan:config:env-validator', artisan('config:env-validator'));

次にこのレシピをincludeします。config/deploy.phpは、php artisan deploy:initで事前に用意しておいてください。

config/deploy.php
    'include' => [
        'recipe/artisan-config-env-validator.php',
    ],

最後に、このタスクを実行するよう設定します。

config/deploy.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の記述ミスで問題のあるデプロイをしてしまうことがなくなります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?