データベースの接続情報など、環境(開発/検証/本番)によって切り替える必要がある情報を.envに書き出すのは王道ですが、その切り替えまで触れた記事をあまり見かけないのでまとめてみました。
一言で言うと「環境を切り替えるために.envを上書きするコマンドをいちいち叩くのではなく、Composerに定義しちゃおうぜ」という話です。「当然じゃん?」と思う方は読み飛ばしてください。GAEだけじゃなくいろんな場面に応用のきく、開発者にとって必須のTipsかと思います。
envファイル定義例
env-local
APP_ENV=local
(省略)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
GCP_PROJECT_ID=YOUR_STAGING_PROJECT_ID
GOOGLE_APPLICATION_CREDENTIALS=/var/www/YOUR_STAGING_CREDENTIAL_FILE.json
env-staging
APP_ENV=staging
(省略)
DB_CONNECTION=mysql
DB_HOST=xxx.xxx.xxx.xxx
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=YOUR_DB_USERNAME
DB_PASSWORD=YOUR_DB_PASSWORD
DB_SOCKET=/cloudsql/YOUR_STAGING_PROJECT_ID:asia-northeast1:YOUR_CLOUDSQL_INSTANCE_ID
GCP_PROJECT_ID=YOUR_STAGING_PROJECT_ID
env-production
APP_ENV=production
(省略)
DB_CONNECTION=mysql
DB_HOST=yyy.yyy.yyy.yyy
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=YOUR_DB_USERNAME
DB_PASSWORD=YOUR_DB_PASSWORD
DB_SOCKET=/cloudsql/YOUR_PRODUCTION_PROJECT_ID:asia-northeast1:YOUR_CLOUDSQL_INSTANCE_ID
GCP_PROJECT_ID=YOUR_PRODUCTION_PROJECT_ID
解説
- 開発環境での動作確認に検証用のGCPプロジェクトを利用しています。
- 開発環境からGCPの各サービスを利用するためには認証ファイルが必要なため、取得したファイルをGOOGLE_APPLICATION_CREDENTIALSで指定する必要があります。
- 逆に検証・本番環境では、この設定が残っているとファイルを探しに行ってしまう(そして見つからない)ため、消してやる必要があります。
検証環境/本番環境へのデプロイ
composer.json定義例
"scripts" : {
"deploy": [
"cp env-staging .env",
"gcloud app deploy --project=YOUR_STAGING_PROJECT_ID",
"cp env-local .env"
],
"deploy-production": [
"cp env-production .env",
"gcloud app deploy --no-promote --project=YOUR_PRODUCTION_PROJECT_ID",
"cp env-local .env"
],
(省略)
"post-autoload-dump" : [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover",
"@php artisan gae:prepare"
]
},
解説
- a1comms/GaeSupportLaravelを利用しているので、それで必要とされるコマンドを"post-autoload-dump"に追加しています。
-
composer deploy
(検証環境)またはcomposer deploy-production
(本番環境)のコマンドを叩くだけで、「.envファイルを検証/本番環境用で上書き」「cloud app deployコマンドでデプロイ」「.envファイルを開発環境用に戻す」をやってくれます。 - 本番デプロイ時に
--no-promote
オプションを付ける運用をしている場合も、このように定義しておくことでうっかりミスを防ぐことができます。 - 本番環境用の方がコマンドが長いのは「検証環境の方がデプロイ回数が多い=打つ文字が少ない方がいい」という個人的な好みによるものです。必要であれば好きに変更してもらって構いません。
検証環境/本番環境へのDBマイグレーション
composer.json定義例
"scripts" : {
"migrate": [
"cp env-staging .env",
"DB_SOCKET= php artisan migrate",
"cp env-local .env"
],
"migrate-production": [
"cp env-production .env",
"DB_SOCKET= php artisan migrate",
"cp env-local .env"
],
(省略)
},
解説
-
DBのマイグレーションは開発環境から行う必要があるので、
composer migrate
(検証環境)またはcomposer migrate-production
(本番環境)コマンドも定義してみました。 - 開発環境=Laradock等からはIPアドレス(DB_HOST)で、検証環境=GAEサービスからはソケット(DB_SOCKET)で接続する必要があります。開発環境からの接続時にDB_SOCKETがあると失敗するので
DB_SOCKET= php artisan migrate
という感じで消してやります。