今回は、GCPのApp EngineにデプロイしたLaravelのアプリからCloud SQLに接続する方法を解説します。Laravelはバージョン10を使っていきます。
ローカル環境から本番環のでマイグレーションを行う手順やローカル環境からCloud SQLのデータベースに接続する方法なども、この記事で詳しく解説していきますね。
開発環境
- macOS Venture 13.2.1
- Laravel 10.15.0
- PHP 8.1.21
LaravelのアプリをApp Engineにデプロイ
まずは、Laravel 10のプロジェクトを新しく作成して、GCPのApp Engineにをデプロイしていきます。
Laravel 10のプロジェクトを作成する方法やApp EngineにLaravelのアプリをデプロイする方法については、こちらの記事で詳しく解説しているので参考にしてみてください。
現時点では、アプリがデプロイされたURLで以下のようなlaravelの画面が表示されていればOKです。
ここからは、以前に記事でApp EngineにデプロイしたLaravelのアプリに、ユーザーの新規登録とログインの機能をつけて、そのユーザーのデータがCloud SQLのデータベースに保存されるようにしていきます。
Laravelに認証機能をつける
まずは、ローカル環境のLaravelのアプリにログインとユーザー登録の機能をつけていきます。ここではBreezeを使って認証機能を作ります。以下のコマンドを順番にターミナルで入力してください。
composerにBreezeを入れるために、まずはこちらのコマンドを入力します。
./vendor/bin/sail composer require laravel/breeze --dev
次はLaravelにBreezeをインストールします。
./vendor/bin/sail php artisan breeze:install
ここまでできたらマイグレーションを実行します。このマイグレーションでユーザーテーブルが作成されます。
./vendor/bin/sail php artisan migrate
マイグレーションが完了したら、npm installとnpm run devを実行します。
./vendor/bin/sail npm install
./vendor/bin/sail npm run dev
実際に、ローカルのLaravelのアプリの画面を開くとログインとユーザー登録の機能ができていることが確認できるはずです。
Cloud SQLのインスタンスを作成する
次はCloud SQLを使うための設定を行なっていきます。GCPの管理画面を開いてください。
画面左上のナビゲーションメニューを開くと「SQL」という項目があるので、そちらをクリックしてください。※もしナビゲーションメニューにSQLがなければ、全てのプロダクトのページから追加してください。
Cloud SQLを使うためには、Cloud SQLのインスタンスを作成する必要があるので「無料クレジットを利用してインスタンスを作成」をクリックしてください。
するとデータベースの種類を選択する画面が表示されます。ここではMySQLを使っていくので、MySQLを選択してください。
ここで「インスタンスを作成するには、まず Compute Engine API を有効にする必要があります」という表示が出る場合には「APIを有効化する」をクリックしてAPIを有効化してください。
APIの有効化が完了すると、以下のようなMySQLのインスタンスを作成する画面が表示されます。
まずはインスタンスIDとrootユーザーのパスワードを入力してください。
インスタンスIDとrootユーザーのパスワードを入力したら、Cloud SQLのエディションの選択します。EnterpriseとEnterprise Plusがあるので、ここではEnterpriseを選択します。また、エディションのプリセットはサンドボックスにしておきます。
次はリージョンを選択します。リージョンはApp Engineのインスタンスと同じリージョンにしておきます。※App Engineのインスタンスリージョンは、GCPの管理画面からApp Engineのダッシュボードを開くと確認できます。
リージョンを選択したら「インスタンスを作成」をクリックします。しばらく待つと以下のような画面が表示されます。
これでインスタンスの作成は完了です。
データベースを作成する
次は、先ほど作成したインスタンスに今回のLaravelのアプリで使うためのデータベースを作成していきます。
先ほどのSQLの画面の左側にあるメニューから「データベース」を選択します。
すると、先ほど作成したインスタンスにあるデータベースの一覧が表示されます。Laravelのアプリに使うためのデータベースを新しく作りたいので「データベースの作成」をクリックします。
すると、データベース名などを入力するモーダルが出てくるので、データベースを名をローカルで作成したLaravelのプロジェクトで使っているデータベース名と同じにし、照合を「utf8_general_ci」に変更して「作成」ボタンをクリックします。
Laravelのプロジェクトで使っているデータベース名は.envファイルから確認できます。
これでデータベースが作成されました。実際にデータベース一覧のところに今回作成したデータベースが作成されていると思います。
ここからはローカルからCloud SQLに接続するための設定をしていきますね。
接続の設定から自分のIPアドレスを追加する
Cloud SQLは外部からのアクセスをデフォルトでシャットアウトしているため、接続を許可するIPアドレスのリストに自分のIPアドレスを追加する必要があります。
まずは、画面の左側のメニューから「接続」を選択してください。
接続のページを開いたら「ネットワーキング」を選択し、ネットワークの追加をクリックしてください。
するとネットワークを追加する入力欄が表示されるので、ここに適当なネットワーク名と自分のIPアドレスを入力して「完了」を押して、画面の下の方にある「保存」をクリックします。完了を押しただけだと保存されないので注意してくださいね。
ちなみに、自分のIPアドレスはこちらで調べることができます。
保存ボタンを押してしばらく待つと、先ほど自分のIPアドレスが承認済みのネットワークのところに保存されているのが確認できるはずです。
Cloud SQLに接続するためのIPアドレスの追加はこれで完了です。
APIを有効にする
次は、ローカル環境からCloud SQLに接続するために必要なAPIを有効化していきます。
まずはこちらのページを開いてください。
このページの「始める前に」の3のところにある「APIを有効化する」のボタンをクリックしてください。
APIを有効化するのボタンをクリックすると、以下のような画面が表示されるので「次へ」をクリックしてください。
すると以下のような画面になるので「有効化する」をクリックしてください。
少し待つとAPIの有効化が完了します。
Cloud SQL Auth Proxyを使ってローカルからCloud SQLのデータベースに接続する
ローカル環境からCloud SQLに接続するためにはCloud SQL Auth Proxyというものが必要になります。
まずは、このCloud SQL Auth Proxyをインストールしていきます。ターミナルでLaravelのプロジェクトのディレクトリに移動して、以下のコマンドを入力してください。
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.6.0/cloud-sql-proxy.darwin.amd64
chmod +x cloud-sql-proxy
次はCloud SQL Auth Proxyを起動させます。Cloud SQLの接続名がaaa:bbb:cccだった場合、以下のコマンドでCloud SQL Auth Proxyを起動することができます。
./cloud-sql-proxy -dir=cloudsql -instances=aaa:bbb:ccc
これでローカル環境からCloud SQLに接続することができました。次はローカル環境からCloud SQLのデータベースでマイグレーションを行います。
.envファイルを変更してマイグレーションを行う
Cloud SQLに接続できたので、次はローカルからCloud SQLのデータベースのマイグレーションを行います。
Laravelのプロジェクトの.envファイルの環境変数をCloud SQLのものに変更して、ローカル環境のLaravelのコンテナの中に入ってマイグレーションのコマンドを実行すればCloud SQLのデータベースでマイグレーションが実行されるようになっています。
まずは.envファイルの中身を変更します。変更するのは
・DB_HOST
・DB_USERNAME
・DB_PASSWORD
まずはDB_USERNAMEをrootにして、DB_PASSWORDをCloud SQLのインスタンスを作成したときに決めたrootユーザーのパスワードにします。
そうしたら、GCPの管理画面から今回使うCloud SQLの概要のページを開いて、パブリックIPアドレスをコピーします。
このパブリックIPアドレスをDB_HOSTの値にしてください。
これでマイグレーションを実行するための準備ができたので、次はLaravelのコンテナの中に入ってマイグレーションを実行します。
以下のコマンドを使ってコンテナの中に入ります。
./vendor/bin/sail shell
コンテナの中に入ったらマイグレーションを実行してください。
php artisan migrate
マイグレーションが完了したらOKです。
ここまでできたら、次は認証機能を実装したLaravelのアプリをApp Engineにデプロイするための設定をしていきます。
app.yamlの編集
Laravelのプロジェクトのルートディレクトリにあるapp.yamlのenv_variablesのところにデータベース名やデータベースのユーザー名、パスワードなどを追加します。
Cloud SQLのデータベース名はローカル環境のLaravelと同じにしているので、app.yamlでも同じ名前にしてください。ここではexample_appになっています。
ユーザー名はrootで、パスワードはCloud SQLのインスタンスを作成したときに決めたrootユーザーのパスワードにしておいてください。
DB_SOCKETは"/cloudsql/接続名"という感じにしてください。例えば、接続名がaaa:bbb:cccであれば、DB_SOCKETは"/cloudsql/aaa:bbb:ccc"となります。
デプロイ
ここまでできたらLaravelのアプリをApp Engineにデプロイして実際にCloud SQLに接続できるかどうかを確かめてみましょう。
以下のコマンドをターミナルに入力してください。
gcloud app deploy
デプロイが終わったら次のコマンドで、デプロイされたLaravelのアプリの画面を開きます。
gcloud app browse
実際にLaravelのアプリの画面が表示され、ログインとユーザー登録の機能も有効になっているはずです。新規登録したユーザーの情報はCloud SQLのインスタンスにあるデータベースのusersテーブルに保存されるようになっています。
まとめ
GCPの管理画面からCloud SQLのインスタンスとデータベースを作成して、App EngineにデプロイしたLaravelのアプリからCloud SQLのデータベースに接続することができる。
また、Cloud SQL Auth Proxyを使うことでローカル環境からCloud SQLに接続し、マイグレーションなどを行うこともできる。
今回作成したLaravelのプロジェクトのリポジトリはこちらです。