【GCP】App EngineにデプロイしたLaravelのアプリからCloud SQLに接続する方法を解説

今回は、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のアプリをデプロイする方法については、こちらの記事で詳しく解説しているので参考にしてみてください。

https://qiita.com/masakiwakabayashi/items/9dd84996e7c4f9fd698d

現時点では、アプリがデプロイされたURLで以下のようなlaravelの画面が表示されていればOKです。
![スクリーンショット 2023-07-28 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/97adb1ea-3339-e946-f24c-bf452b7d0949.png)

ここからは、以前に記事で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
```

ターミナルに以下のようになればOKです。
![スクリーンショット 2023-08-02 10.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/644cf5cd-1fb0-fad4-b223-1391f9ef82de.png)

実際に、ローカルのLaravelのアプリの画面を開くとログインとユーザー登録の機能ができていることが確認できるはずです。
![スクリーンショット 2023-08-02 10.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/ca645fb3-6b7a-d0e1-fd8a-1d0bcd08132d.png)

## Cloud SQLのインスタンスを作成する

次はCloud SQLを使うための設定を行なっていきます。GCPの管理画面を開いてください。

![スクリーンショット 2023-08-02 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/06e5c7a8-42d7-f4dd-a2b3-f97f2c0a2895.png)

画面左上のナビゲーションメニューを開くと「SQL」という項目があるので、そちらをクリックしてください。※もしナビゲーションメニューにSQLがなければ、全てのプロダクトのページから追加してください。
![スクリーンショット 2023-08-02 10.50.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/abd47954-45be-880d-c000-42ef7f72506a.png)

Cloud SQLを使うためには、Cloud SQLのインスタンスを作成する必要があるので「無料クレジットを利用してインスタンスを作成」をクリックしてください。
![スクリーンショット 2023-08-02 10.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/8de4e40c-da60-6ed9-6af8-f62ffd5b2abb.png)

するとデータベースの種類を選択する画面が表示されます。ここではMySQLを使っていくので、MySQLを選択してください。
![スクリーンショット 2023-08-02 11.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/e8feb8e5-6d90-b890-cc6d-9cfec96ad5b6.png)

ここで「インスタンスを作成するには、まず Compute Engine API を有効にする必要があります」という表示が出る場合には「APIを有効化する」をクリックしてAPIを有効化してください。
![スクリーンショット 2023-08-02 11.08.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/f3bc427a-52cb-548f-ec16-a973e199bd74.png)

APIの有効化が完了すると、以下のようなMySQLのインスタンスを作成する画面が表示されます。
![スクリーンショット 2023-08-02 11.11.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/61bab28e-7c98-55ed-c38a-dc28ea5d37ba.png)

まずはインスタンスIDとrootユーザーのパスワードを入力してください。
![スクリーンショット 2023-08-02 11.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/cfa5e47b-822e-0c28-757e-3dddc7031e39.png)

インスタンスIDとrootユーザーのパスワードを入力したら、Cloud SQLのエディションの選択します。EnterpriseとEnterprise Plusがあるので、ここではEnterpriseを選択します。また、エディションのプリセットはサンドボックスにしておきます。
![スクリーンショット 2023-08-02 11.15.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/8bdca59b-64ec-61fd-60e3-68cf6647b4c4.png)

次はリージョンを選択します。リージョンはApp Engineのインスタンスと同じリージョンにしておきます。※App Engineのインスタンスリージョンは、GCPの管理画面からApp Engineのダッシュボードを開くと確認できます。
![スクリーンショット 2023-08-02 11.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/035cd18b-0158-2d42-1892-0e795d113536.png)

リージョンを選択したら「インスタンスを作成」をクリックします。しばらく待つと以下のような画面が表示されます。
![スクリーンショット 2023-08-02 11.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/6a2ae5f6-45c7-945f-ef5e-ef5c0c8ad930.png)

これでインスタンスの作成は完了です。

## データベースを作成する

次は、先ほど作成したインスタンスに今回のLaravelのアプリで使うためのデータベースを作成していきます。

先ほどのSQLの画面の左側にあるメニューから「データベース」を選択します。
![スクリーンショット 2023-08-02 11.58.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/5f22b074-3454-2e11-480e-da84165ccacb.png)

すると、先ほど作成したインスタンスにあるデータベースの一覧が表示されます。Laravelのアプリに使うためのデータベースを新しく作りたいので「データベースの作成」をクリックします。
![スクリーンショット 2023-08-02 12.01.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/312d91da-4089-112a-421a-fd17e8af5e10.png)

すると、データベース名などを入力するモーダルが出てくるので、データベースを名をローカルで作成したLaravelのプロジェクトで使っているデータベース名と同じにし、照合を「utf8_general_ci」に変更して「作成」ボタンをクリックします。
![スクリーンショット 2023-08-02 13.17.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/757a50af-d63f-5b05-fd48-adaa58640c56.png)

Laravelのプロジェクトで使っているデータベース名は.envファイルから確認できます。
![スクリーンショット 2023-08-02 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/ea0ec247-924b-7110-44ba-0999adbfd003.png)

これでデータベースが作成されました。実際にデータベース一覧のところに今回作成したデータベースが作成されていると思います。
![スクリーンショット 2023-08-02 13.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/33041b0e-7d69-0723-f72f-11dc4b6a7bf5.png)

ここからはローカルからCloud SQLに接続するための設定をしていきますね。

## 接続の設定から自分のIPアドレスを追加する

Cloud SQLは外部からのアクセスをデフォルトでシャットアウトしているため、接続を許可するIPアドレスのリストに自分のIPアドレスを追加する必要があります。

まずは、画面の左側のメニューから「接続」を選択してください。
![スクリーンショット 2023-08-02 13.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/3a65038b-1a28-240f-28a3-a47232689adc.png)

接続のページを開いたら「ネットワーキング」を選択し、ネットワークの追加をクリックしてください。
![スクリーンショット 2023-08-02 13.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/f1d55662-bf42-723b-a026-37605fbab5be.png)

するとネットワークを追加する入力欄が表示されるので、ここに適当なネットワーク名と自分のIPアドレスを入力して「完了」を押して、画面の下の方にある「保存」をクリックします。完了を押しただけだと保存されないので注意してくださいね。

ちなみに、自分のIPアドレスは[こちら](https://www.cman.jp/network/support/go_access.cgi)で調べることができます。
![スクリーンショット 2023-08-02 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/c223b996-9d6a-c129-6c7c-2dad21c7b417.png)

保存ボタンを押してしばらく待つと、先ほど自分のIPアドレスが承認済みのネットワークのところに保存されているのが確認できるはずです。
![スクリーンショット 2023-08-02 13.55.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/a94268ec-79f9-8283-b020-eb8a95b807c5.png)

Cloud SQLに接続するためのIPアドレスの追加はこれで完了です。

## APIを有効にする

次は、ローカル環境からCloud SQLに接続するために必要なAPIを有効化していきます。

まずは[こちら](https://cloud.google.com/sql/docs/mysql/connect-instance-local-computer?hl=ja)のページを開いてください。

このページの「始める前に」の3のところにある「APIを有効化する」のボタンをクリックしてください。
![スクリーンショット 2023-08-02 14.50.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/a20bd5ab-7d7a-8d36-2172-82bdc625b8d1.png)

APIを有効化するのボタンをクリックすると、以下のような画面が表示されるので「次へ」をクリックしてください。
![スクリーンショット 2023-08-02 14.45.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/553c9aa1-60f5-6ab9-e37a-18495e32028a.png)

すると以下のような画面になるので「有効化する」をクリックしてください。
![スクリーンショット 2023-08-02 14.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/343dcebf-4199-cd99-6691-7b64d8c7dc57.png)

少し待つと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

の3つです。この画像のところですね。
![スクリーンショット 2023-08-02 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/a58f25c0-58c8-11c7-b103-5a54d541cd2c.png)

まずはDB_USERNAMEをrootにして、DB_PASSWORDをCloud SQLのインスタンスを作成したときに決めたrootユーザーのパスワードにします。

そうしたら、GCPの管理画面から今回使うCloud SQLの概要のページを開いて、パブリックIPアドレスをコピーします。
![スクリーンショット 2023-08-02 17のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/52ac8c28-202b-4bd6-410b-f0abb1db8aa5.png)

このパブリックIPアドレスをDB_HOSTの値にしてください。

これでマイグレーションを実行するための準備ができたので、次はLaravelのコンテナの中に入ってマイグレーションを実行します。

以下のコマンドを使ってコンテナの中に入ります。

```
./vendor/bin/sail shell
```

コンテナの中に入ったらマイグレーションを実行してください。

```
php artisan migrate
```

マイグレーションが完了したらOKです。

ここまでできたら、次は認証機能を実装したLaravelのアプリをApp Engineにデプロイするための設定をしていきます。

## app.yamlの編集

Laravelのプロジェクトのルートディレクトリにあるapp.yamlのenv_variablesのところにデータベース名やデータベースのユーザー名、パスワードなどを追加します。
![スクリーンショット 2023-08-02 17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/51b8b9bf-43f4-a191-9113-ff85f0c8d97f.png)

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のプロジェクトのリポジトリはこちらです。

https://github.com/masakiwakabayashi/laravel_gcp_cloud_sql_connect