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を追加し

    "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に追加

    '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バケットの作成]をクリックします。
gaesupportl5-cloud-strage-start-create-bucket
※ 左のメニューの[ストレージ > Strage]を選択してもOKです。

バケット作成用のポップアップが表示されます。
gaesupportl5-cloud-strage-create-bucket
適当な、バケット名を入力して、ストレージクラスはデフォルトのStandardを選択、AppEngineで使う場合、地域は米国(us-central)を選択します。

[作成]をクリックすると、空のバケットが作成されます。
gaesupportl5-created-cloud-strage-bucket

Cloud SQLインスタンスを作成

[Cloud SQL]は左のメニューから選択します。

gaesupportl5-cloud-sql-menu
[インスタンスを作成]をクリックして、ウィザードを開始します。
gaesupportl5-cloud-sql-start-create-instance

[インスタンス タイプの選択]が表示されます
gaesupportl5-cloud-sql-select-instance-type
2016.4.5現在、第2世代はAppEngineに対応していないので、[第1世代を選択]します。

次の、[インスタンスの作成]では、インスタンスの情報を入力していきます。
appengine-php-cloud-sql-create-instance
適当なインスタンスIDを入力し、地域はus-central、サイズは動作確認なので一番小さいD0 - 128 MB RAMを選択しました。
詳細設定はデフォルトのまま[作成]をクリックしてインスタンスの作成を開始します。

Cloud SQLインスタンスにデータベースを作成

データベースの作成は、コンソールからも可能です。

[インスタンスの詳細]で[データベース]タブを開きます。
gaesupportl5-cloud-sql-start-create-database
[新しいデータベース]をクリックすると、データベース作成用のポップアップが表示されます。
gaesupportl5-cloud-sql-create-database
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://.appspot.com/にアクセスするとLaravel5のトップページが表示されます。
gaesupportl5-show-deployed-laravel5-default-index-page
このページが表示されれば、各リソースへの接続が正常にできています。

マイグレーションについて

マイグレーションの実行手順についても調べてみました。

マイグレーションは、AppEngine上では実行できないので、ローカルPCから実行します。
運用では、デプロイ用のインスタンス構築するか、デプロイサービスを利用する必要がありそうです。

ここでは、サンプルTodoアプリのタスクを保存するテーブルitemsを追加します。
artisanコマンドでマイグレーションを作成します。

$ php artisan make:migration create_items_table
Created Migration: 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を新しく作成します。

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を開くと以下のように左上に[無料試使用に登録]ボタンが表示されています。
google-cloud-platform-freetrial-start
[無料試使用に登録]をクリックすると以下の登録フォームが表示されます。
google-cloud-platform-freetrial
必要な情報を入力して[同意してい無料試使用を開始]をクリックすると登録完了です。
google-cloud-platform-freetrial-registered