AppEngineでLaravelを動かすには、Cloud SQLに接続するためのunix_socketの設定や、runtimeディレクトリへの出力をCloud Strageへ向けるなどの対応が必要になります。
これらに対応した設定を生成してくれるパッケージがGaeSupportL5です。
GaeSupportL5がサポートするLaravelのバージョンは5.1です。
この記事では、Laravel5プロジェクトにGaeSupportL5をインストールし、AppEngine、Cloud SQLおよびCloud Strageリソースを設定し、デプロイ、動作確認することろまでをまとめています。
この記事で作成するLaravel 5.1のプロジェクトはGithubにアップしてありますので、全体のソースはこちらを参照ください。
Github: hrendoh/trial-gae-support-l5
Laravelプロジェクトの作成
GaeSupportL5は、5.2にはまだ対応していないので、5.1のプロジェクトを作成します。
$ composer create-project laravel/laravel laravel5-gae "5.1.*"
$ cd laravel5-gae
GaeSupportL5のインストール
GaeSupportL5は、Laravelの初期化の仕組みであるService Providersを利用してAppEngine上でLaravelを実行するために必要な設定を行います。
Composerでパッケージを追加
composer.jsonにshpasser/gae-support-l5
を追加し
// composer.json
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.2.*",
"shpasser/gae-support-l5": "~1.0"
},
composer update
を実行して、GaeSupportL5パッケージをインストール
$ composer update
Providerを追加
Providerはconfig/app.php
に追加
// config/app.php"
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
...
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
/*
* GaeSupport
*/
Shpasser\GaeSupportL5\GaeSupportServiceProvider::class
],
以上で、GaeSupportL5をプロジェクトに追加できました。
Google Cloud Plattformに各リソースを作成
次に、プロジェクトから利用するリソースを作成していきます。
AppEngineは、アカウントの割当て数上限(デフォルト10)に達していなければ、プロジェクトを作成すると利用可能になっているので、その他、Laravelを動かすために必要な最小限のリソース、Cloud StrageバケットとCloud SQLインスタンスをプロジェクトに追加していきます。
Cloud Strageにバケットを作成
Cloud Strageにセッションストア用のバケットを追加します。
ダッシュボードの[Cloud Strageバケットの作成]をクリックします。
※ 左のメニューの[ストレージ > Strage]を選択してもOKです。
バケット作成用のポップアップが表示されます。
適当な、バケット名を入力して、ストレージクラスはデフォルトのStandardを選択、AppEngineで使う場合、地域は米国(us-central)を選択します。
[作成]をクリックすると、空のバケットが作成されます。
Cloud SQLインスタンスを作成
[Cloud SQL]は左のメニューから選択します。
[インスタンスを作成]をクリックして、ウィザードを開始します。
[インスタンス タイプの選択]が表示されます
2016.4.5現在、第2世代はAppEngineに対応していないので、[第1世代を選択]します。
次の、[インスタンスの作成]では、インスタンスの情報を入力していきます。
適当なインスタンスIDを入力し、地域はus-central
、サイズは動作確認なので一番小さいD0 - 128 MB RAM
を選択しました。
詳細設定はデフォルトのまま[作成]をクリックしてインスタンスの作成を開始します。
Cloud SQLインスタンスにデータベースを作成
データベースの作成は、コンソールからも可能です。
[インスタンスの詳細]で[データベース]タブを開きます。
[新しいデータベース]をクリックすると、データベース作成用のポップアップが表示されます。
laravel5todo
という名前のデータベースを作成しました。
MySQLクライアントからCloud SQLインスタンスに接続してデータベースを作成することもできます。
ローカルPCからMySQLクライアントを使ってデータベースを作成する手順については「Google AppEngine PHPからCloud SQLへ接続する」にまとめてありますのでこちらを参考にしてください。
GaeSupportL5のgae:setupを実行
GaeSupportL5は、AppEngine、StargeおよびSQLをプロジェクトから利用する設定を追加してくれるartisan
コマンドgae:setup
を用意しています。
以下のように、作成したCloud StrageバケットとCloud SQLインスタンスおよびデータベースを指定してartisan gae:setup
コマンドを実行します。
$ php artisan gae:setup --config --cache-config --bucket="laravel5bucket" --db-socket="<project-id>:mydb" --db-name="laravel5todo" <project-id>
Created the ".env.production" file.
Created the ".env.local" file.
Replaced the application class in "bootstrap/app.php".
Replaced the service providers in "config/app.php".
Set the log handler in "config/app.php".
Replaced the 'compiled' path in "config/view.php".
Added queue driver configuration in "config/queue.php".
Added Cloud SQL driver configuration in "config/database.php".
Added GAE filesystem driver configuration in "config/filesystems.php".
Generated "bootstrap/cache/config.php" for GAE deployment.
* To use "bootstrap/cache/config.php" locally please regenerate it.
Generated the "app.yaml" file.
Generated the "php.ini" file.
各オプションについては、以下のとおりです。
- –cache-config:
php artisan config:cache
で生成されるConfiguration CachingがAppEngineに合わないらしく、AppEngineで動作するキャッシュを生成してくれます - –bucket: Cloud Strageバケットを指定します
- –db-socket: Cloud SQLのインスタンス接続名 <プロジェクトID>:<インスタンス名> を指定します。
- –db-name: Cloud SQLインスタンスに作成したデータベース名を指定します
デプロイおよび動作確認
設定できたら、デプロイしてみます。
$ /usr/local/google_appengine/appcfg.py -A <project-id> -V v1 update .
http://
にアクセスするとLaravel5のトップページが表示されます。
このページが表示されれば、各リソースへの接続が正常にできています。
マイグレーションについて
マイグレーションの実行手順についても調べてみました。
マイグレーションは、AppEngine上では実行できないので、ローカルPCから実行します。
運用では、デプロイ用のインスタンス構築するか、デプロイサービスを利用する必要がありそうです。
ここでは、サンプルTodoアプリのタスクを保存するテーブルitems
を追加します。
artisanコマンドでマイグレーションを作成します。
$ php artisan make:migration create_items_table
Created Migration: 2016_04_03_161637_create_items_table
マイグレーションを以下のように定義しました。
// database/migrations/2016_04_03_161637_create_items_table
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateItemsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('items', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->boolean('isCompleted')->default(false);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('items');
}
}
ローカルからCloud SQLインスタンスのデータベースにマイグレーションを実行するために.env.migration
を新しく作成します。
// .env.migration
APP_ENV=migration
DB_HOST=11.22.33.44
DB_DATABASE=laravel5todo
DB_USERNAME=root
DB_PASSWORD=password
gae:setup
で生成したConfiguration Cacheは、ローカルで動かないので、artisan migrate
を実行する前に、artisan config:clear
で消しておく必要があります。
$ php artisan config:clear
Configuration cache cleared!
.env.migration
のファイル名を.env
に変更します。
$ mv .env.migration .env
マイグレーションを実行します。
$ php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2016_04_03_161637_create_items_table
再度デプロイするときは、マイグレーション用の.env
を.env.production
に戻してConfiguration Cacheを生成し直す必要があります。
$ mv .env .env.migration
$ mv .env.production .env
$ php artisan gae:setup --cache-config <project-id>
Overwrite the existing ".env.production" file? (yes/no) [no]:
>
Overwrite the existing ".env.local" file? (yes/no) [no]:
>
Generated "bootstrap/cache/config.php" for GAE deployment.
* To use "bootstrap/cache/config.php" locally please regenerate it.
マイグレーションの度に、.envの置き換えと、デプロイ用のConfiguration Cacheを生成しなおさなければならなくなるので、運用の構成については検討が必要そうです。
ここで追加したitems
テーブルを利用するアプリのコードの説明は割愛しますので、Github: hrendoh/trial-gae-support-l5を参照ください。
まとめ
Laravel 5.1がAppEngineで動作することが確認できました。
Cloud SQLもリーズナブルで非常に魅力がありますが、やはりStandard runtimeがPHP 5.5しか対応していないのが気になります。
Javaもすでにサポート切れの7で止まっていますし、今後AppEngineはFlexisible Environmentにフォーカスする方針なのでしょうか。
となるとAppEngineでPHPを動かす場合は、新しいPHPのバージョンのカスタム環境を用意する必要がありそうです。
もともと、アプリのデプロイ先を検討して調査しましたが、今回はAppEngineの採用は見送ってHerokuあたりにすることになりそうです。
補足: 無料試使用に登録
Cloud SQLなどいくつかのリソースを利用するには、請求アカウントを作成して無料試使用に登録する必要があります。
請求アカウントを設定していないプロジェクトでCloud SQLを開くと以下のように左上に[無料試使用に登録]ボタンが表示されています。
[無料試使用に登録]をクリックすると以下の登録フォームが表示されます。
必要な情報を入力して[同意してい無料試使用を開始]をクリックすると登録完了です。