Google App EngineでLaravelを動かしてCloud SQLへ接続してみた

投稿者:

GCP」って本当に便利ですね。最近は色々なプロジェクトでお世話になっております。今まではGCP上でLaravelを動作させる場合は、Dockerも含めて「Google Compute Engine(GCE)」がほとんどだったのですが、Laravelで構築するサービスがシンプルな場合はフルマネージド型である「Google App Engine(GAE)」を使った方が簡単なので、Laravel+GAEの運用環境を構築する事にしました。また今回はGCPのリレーショナルデータベース「Cloud SQL」への接続まで説明したいと思います。




参考サイト・ページ

https://cloud.google.com/community/tutorials/run-laravel-on-appengine-standard

1. Laravel側の設定

デプロイ用ファイル(app.yaml)の設定

Laravelのインストールや「Google Cloud SDK」の環境構築についてはこの記事では説明しませんので別途準備しておいてください。GAEのデプロイには「app.yaml」という専用ファイルをプロジェクトに設置する事が必須です。

runtime: php72

env_variables:
  ## Put production environment variables here.
  APP_KEY: YOUR_APP_KEY
  APP_STORAGE: /tmp
  VIEW_COMPILED_PATH: /tmp
  SESSION_DRIVER: cookie

設定にある「YOUR_APP_KEY」はLaravelの.envファイルに記述されている「APP_KEY」に置き換えてください。

その他Laravelの設定

「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]

最後に以下のコマンド(composer)を実行して「beyondcode/laravel-dump-server」を削除します。

composer remove --dev beyondcode/laravel-dump-server

公式サイトにもありますが、ここで一旦デプロイして、「https://プロジェクト名.appspot.com」にアクセスして、LaravelのTOPページが表示される事を確認しておきましょう。

gcloud app deploy

2. Cloud SQLへの接続設定

事前準備

次にCloud SQLへの接続ができるように設定を行います。まずはGCPの同一プロジェクトのCloud SQLにてインスタンスを作成して「インスタンスID」を控えておいてください。ここでは「db01」とします。ちなみにデータベースエンジンは「MySQL(第2世代)」を選択しています。

Cloud SQL Proxyの設定と接続

ローカル環境からマイグレーションを行えるよう、「Cloud SQL Proxy」を設定します。Cloud SQL Proxyを使うためには「Cloud SQL Admin API」を有効化する必要があるため、ここから設定するか、GCPの「APIとサービス」から設定してください。写真のピンク枠が「DISABLE API」になっていれば有効化状態です。

補足ですがGAEからCloud SQLへの接続にCloud SQL Proxyは必要なく、Cloud SQL Proxyが必要なのはGCEだけのようです。
「Cloud SQL Proxy」についての詳細はこちら

Cloud SQL Proxyは実行ファイルになっているので、こちらからファイルをダウンロードします。私の環境はMacOSの64ビットなので以下を実行しました。

curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
chmod +x cloud_sql_proxy

続いては「インスタンス接続名」を取得します。Cloud SQLのインスタンスの詳細画面にも表示されていますが、以下のコマンドでも取得できます。形式としては「プロジェクト名:リージョン:インスタンスID」になります。

gcloud sql instances describe YOUR_INSTANCE_NAME | grep connectionName

「YOUR_INSTANCE_NAME」にはインスタンスIDが入るので「db01」を入れます。

gcloud sql instances describe db01 | grep connectionName

実行すると「connectionName: インスタンス接続名」のように表示されますので、それを使ってCloud SQL Proxyのコネクションを張ります。

./cloud_sql_proxy -instances=インスタンス接続名=tcp:3306

Cloud SQL Proxyは127.0.0.1:3306を使う事になるのですが、私の環境ではMySQLを稼働させていたためか「listen tcp 127.0.0.1:3306 bind: address already in use」と表示されました。仕方がないのでMySQLを一旦停止した所、正常に動きました。

sudo /usr/local/opt/mysql\@5.7/support-files/mysql.server stop

またこちら。

brew services stop mysql@5.7

データベースの作成

ローカルからCloud SQLへのコネクションが正常な場合、マイグレーションが可能になります。その前にまずはデータベースを作ってみましょう。

gcloud sql databases create laravel --instance=db01

成功するとメッセージが表示されます。実際にGCP上のCloud SQLの画面から見ると、ちゃんと「laravel」というデータベースが作られていました。

マイグレーション

マイグレーションはローカルから行いますので、DBへの接続設定は「app.yaml」ではなく「.env」を参照する点だけ注意してください。

php artisan migrate

あとはテスト環境でゴリゴリ作って、「gcloud app deploy」でデプロイをすれば「https://プロジェクト名.appspot.com」でアプリケーションが公開されます。デプロイしたバージョンを即公開したくない場合は「–no-promote」オプションを付与すればオッケーです(非公開バージョンの公開操作はGCP上の「App Engine」の「バージョン」メニューから操作可能)。

gcloud app deploy --no-promote