GAEに、Larabelをデプロイしてみよう!
と、いう事でGCPの公式見つつ、やっていってみたいと思います。
この記事が公開されたのは Published: 2019-01-31 と、なっているのでちょっと前になり今回実施するのは Laravel 8 になるけれど、なんとかなるかな?
動作環境
- Windows 10
- Docker Desktop で動作させたコンテナに構築したDebianとCloud SDKでデプロイを実行。
GAE上にLaravelを構築するにあたっての事前準備として
- GCP上にプロジェクトつくりましょう
- つくったプロジェクトに対し、請求情報を紐付けましょう
- Cloud SDKをインストールして、初期設定を済ませましょう
を、まずしましょうとなっています。
そして、Laravel公式の手順に沿ってLaravelのインストールの準備もしましょう、と。
LaravelのDeployするに向かって
app.yamlを作成して、内容は下記のようにしましょう、と。
app.yaml ファイルは、App Engine アプリの設定などを記載するもの。
runtime: php72
env_variables:
## Put production environment variables here.
APP_KEY: YOUR_APP_KEY
APP_STORAGE: /tmp
VIEW_COMPILED_PATH: /tmp
SESSION_DRIVER: cookie
環境変数とは、OSの環境をカスタマイズするためのシステム変数の事だけど、ここではGAEを動作する際、必要な内容をここで設定して後から利用できるようにする、という事なのかな?
セッションドライバ( driver )はリクエスト毎のセッションデータをどこに保存するかを決める事ができると。
PHPでセッションを管理する場合、通常はデータの保存先はファイルで、場合によってはDBにしたりもできるらしい。
env_variables:
によって、アプリで使用できるように、app.yaml ファイルで環境変数を定義することができる。
「YOUR_APP_KEY」の部分を、
php artisan key:generate --show
ComposerかLaravelインストーラを使ってインストールしていれば、php artisan key:generateコマンドにより、既に設定されているそう。
通常、この文字列は32文字にすべき、らしいです。
キーは.env環境ファイルに設定されます。
アプリケーションキーが設定されていなければ、ユーザーセッションや他の暗号化済みデーターは安全ではないと!
そして、
If you’re on Linux or macOS, the following command will automatically update your app.yaml:
sed -i '' "s#YOUR_APP_KEY#$(php artisan key:generate --show --no-ansi)#" app.yaml
と、あります。
このコマンドによって、app.yamlの中の”YOUR_APP_KEY”の値を
自分の環境はWindowsなので関係ないといえば関係ないですが、どんな処理の事を指しているのかは気になるので、調べてみたいと思います。
- sedコマンド
文字列を全置換したり、行単位で抽出したり、削除したり、いろいろなテキスト処理のできるコマンド。
処理内容はコマンドラインパラメータで指定して、非対話的に一括処理できる。
sedというコマンド名は Stream EDitor の略、とのこと。 -
sedコマンド -iオプション
ファイル名を指定してオプション -i を使うと、そのファイルを読み込んで結果をそのファイルに上書きできるそう。
sコマンドは正規表現で置換処理をしてくれる。
なので、ここで紹介されているコマンドだと php artisan key:generate で実行したコマンドで”YOUR_APP_KEY”を置き換えてapp.yamlに記述しているんでしょうね。
ansiは色付きで結果を出力しているオプションのようで、ここではnonとしているので、色付きをやめる、という事なんでしょうね。
sed についてはこちらが参考になりそうでした。
例えば、
xxxと書かれた hello.txt があったとして、下記コマンドを実行すると。。。
sed -e 's/xxx/XXX/g' ./hello.txt > ./hello-new.txt
XXX と書かれた hello-new.txt が出来上がります。
そして、この状態でデプロイすると、とりあえずエラーになります。
この画面、通称イカエラーというらしいです。
There is no existing directory at "/workspace/storage/logs" and it could not be created: Read-only file system
Replace YOUR_APP_KEY in app.yaml with an application key you generate with the following command:
ディレクトリがない、と言われてますね。
Modify bootstrap/app.php by adding the following block of code before the return statement. This will allow you to set the storage path to /tmp for caching in production.
下記を bootstrap/app.php に追記しろと。
# [START] Add the following block to `bootstrap/app.php`
/*
|--------------------------------------------------------------------------
| Set Storage Path
|--------------------------------------------------------------------------
|
| This script allows you to override the default storage location used by
| the application. You may set the APP_STORAGE environment variable
| in your .env file, if not set the default location will be used
|
*/
$app->useStoragePath(env('APP_STORAGE', base_path() . '/storage'));
# [END]
先程、app.yamlに記載した設定がここで効いてきそうな気配を感じますね!
そして次はこんなエラーが。
Class 'Facade\Ignition\IgnitionServiceProvider' not found
facade/ignition は何?という感じですけど
facade/ignition
composer require facade/ignition
A beautiful error page for Laravel applications.
公式にはこんな感じで書いてありますね。
Dev 専用として使いたい場合は composer require する際に –dev オプションを付けてパッケージを指定します。
–dev オプションをつけると composer.json 内の require-dev 要素に追加されます。
上記の例の場合は、バージョンの指定がないため、composer が自動的に現在の PHP バージョンに合わせて必要なバージョンの記載もしてくれます。
そしたら、たしかに表示されました。
なんと..!
この後もちょっと改修してデプロイするとエラーが出てくるようです。
この話はまた、別途触れていきたいと思います。
参考記事
Google公式のドキュメント:Run Laravel on Google App Engine standard environment
【Laravel】Classが見つからない!なんてエラーが出たときの処理
laravelをGAE SE php7.2環境で動かす
↑envをデプロイ対象から除外したり、実際の運用で役に立ちそうな記述がかいてある。