【GCP】Laravel 10のアプリをApp Engineにデプロイするまでの手順


この記事では、ローカル環境でLaravel 10のアプリを作成して、そのアプリをGCPのApp Engineにデプロイするまでの手順を解説していきます。

## 開発環境

* macOS Venture 13.2.1
* Laravel 10.15.0
* PHP 8.1.21

## ローカルでLaravel 10のアプリを作成

まずは、ローカル環境でLaravelのアプリを作成します。ターミナルで以下のコマンドを実行してください。

```
curl -s "https://laravel.build/example-app" | bash
```

今回のローカルはDocker環境にするためLaravel Sailを使います。上記のコマンドでLaravelのアプリを作成したら、そのアプリのルートディレクトリに移動して、以下のコマンドを実行してください。

```
./vendor/bin/sail up
```

これでローカルでLaravelのアプリが立ち上がるはずです。http://localhost にアクセスして以下のような画面が表示されていればOKです。
![スクリーンショット 2023-07-27 17.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/8330e8bf-2864-3de7-5477-3147bc3b835b.png)

## GCPの新しいプロジェクトを作成

次はLaravelのアプリをデプロイするためのGCPの新しいプロジェクトを作成していきます。

まずは、[Google Cloud](https://cloud.google.com/free?hl=ja)のサイトを開いて、右上のコンソールをクリックしてください。
![スクリーンショット 2023-07-27 18.10.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/7dba7ea7-06b5-8295-5f0b-cf4e4e385173.png)

コンソールの画面を開いたら、画面の左上にあるプロジェクトを選択するプルダウンをクリックして、新しいプロジェクトを選択します。
![スクリーンショット 2023-07-27 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/0f927694-3cd0-71be-0e33-7135e77650f6.png)

何か好きなプロジェクト名をつけて「作成」をクリックします。今回は「test」という名前をつけます。
![スクリーンショット 2023-07-27 18.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/9d101d51-95f3-430b-eee2-254fd4c32348.png)

## App Engineのアプリケーションを作成

では、次にLaravelのアプリをデプロイするApp Engineの設定をしていきます。

まずは、GCPの管理画面を開いて、画面の左上にあるナビゲーションメニューをクリックします。
![スクリーンショット 2023-07-28 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/1c5f05c7-d50c-0149-3aaa-7d64141a27fa.png)
※作業中のプロジェクトがLaravelのアプリをデプロイするためのプロジェクトになっていることも確認してくださいね。

すると画面の左側にメニューが表示されるので、「プロダクトとソリューション」の「すべてのプロダクト」を選択してください。
![スクリーンショット 2023-07-28 10.20.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/b2ad488e-8af7-6435-fcfd-891758224415.png)

すべてのプロダクトの画面が表示されたら、画面を下にスクロールしていくと、サーバーレスのところにApp Engineの項目があるので、App Engineのピンのマークをクリックしてください。
![スクリーンショット 2023-07-28 10.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/5a56554f-8d28-4654-5945-ce5f52a93309.png)

これでメニューバーにApp Engineが表示されるようになります。
![スクリーンショット 2023-07-28 10.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/49b50ba9-1ac4-fad0-9505-be13ce1435bb.png)

ここまでできたら、メニューバーのApp Engineのところにある「ダッシュボード」を選択してください。
![スクリーンショット 2023-07-28 10.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/ae19614e-8a37-8078-5313-ba96a90aaba6.png)

ダッシュボードを開いたら「アプリケーションを作成」を選択してください。
![スクリーンショット 2023-07-28 10.32.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/414a3594-9678-2d3c-8750-1c30744463c5.png)

まず、App Engineのリージョンを選択する画面が表示されるので、東京のリージョンを選択して「次へ」をクリックします。
![スクリーンショット 2023-07-28 10.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/ec3a2dbf-ce60-aeba-6f13-21cf20b32d46.png)

アプリケーションの作成が終わったら、以下のような画面になります。App Engineの設定は一旦ここまでで完了です。
![スクリーンショット 2023-07-28 10.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/8e360423-73a1-e621-c700-f25a31926b7c.png)

次はアプリをGCPにデプロイするためのコマンドをターミナルで使えるようにするための設定をしていきます。

## Cloud SDKをインストールする

Cloud SDKとは、Google Cloudをコマンドで動かすためのツールです。これを使うことでターミナルでLaravelのアプリをApp Engineにデプロイするためのコマンドが使えるようになります。

まずは、[Cloud SDKのインストールページ](https://cloud.google.com/sdk/docs/install-sdk?hl=ja)からご自身の環境にマッチしたパッケージをダウンロードしてください。
![スクリーンショット 2023-07-27 18.42.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/279eda28-d5eb-086b-d98c-4aa4a31948be.png)

ダウンロードしたZipファイルを展開します。次に、展開したファイルのディレクトリに移動してターミナルで以下のコマンドを実行します。

```
./google-cloud-sdk/install.sh
```

これでGCPをコマンドで操作するための準備ができました。では、実際にコマンドを使っていきましょう。

先ほど作成したLaravelのプロジェクトのディレクトリに移動してください。移動したら以下のコマンドをターミナルで実行します。

```
gcloud auth login
```

上記のコマンドはGCPのアカウントとgcloudコマンドの紐付けを行うためのコマンドです。

実行するとGCPにログインするアカウントを選択する画面がブラウザで表示されるので、laravelのアプリをデプロイするためのアカウントでログインします。

![スクリーンショット 2023-07-28 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/356e766e-49ce-5dfc-2fea-fb4502497f05.png)

アカウントを選択すると、アクセスのリクエストのページが表示されるので「許可」をクリックします。
![スクリーンショット 2023-07-28 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/f9150103-6e57-923e-44eb-05f7a71ffe1f.png)

「これで gcloud CLI で認証されました。」という内容の画面が表示されたらアカウントの紐付けは完了です。
![スクリーンショット 2023-07-28 11.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/a1e67b71-3d39-c6f2-f98e-b0aa52345d7f.png)

アカウントの紐付けは完了したので、次は今回使うGCPのプロジェクトの選択などをやっていきます。

以下のコマンドを入力してください。

```
gcloud init
```

このコマンドを実行すると、いくつか選択式の質問が出てくるので番号を選択して解答していきます。

まず、「Pick configuration to use:」に対しては、「Re-initialize this configuration [default] with new settings 」を選択します。
![スクリーンショット 2023-07-28 11のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/9554b4ca-0e81-4e91-566b-d41dd624b24f.png)

「Choose the account you would like to use to perform operations for this 
configuration:」に対しては、Laravelのアプリをデプロイするアカウントを選択します。
![スクリーンショット 2023-07-28 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/e361301e-083c-aa6b-e4b3-91b0610a3230.png)

「Pick cloud project to use: 」に対しては、該当するプロジェクトのIDを選択します。
![スクリーンショット 2023-07-28 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/ab144942-54a0-6bb1-3c3e-0467dc0c41e7.png)

「Your Google Cloud SDK is configured and ready to use!」という表示がターミナルに表示されたら、こちらの設定は完了です。
![スクリーンショット 2023-07-28 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/c5d65631-9936-35f9-b362-bdfdf883419d.png)

次はLaravelの設定をしていきます。

## app.yamlファイルを作成

App Engineにアプリをデプロイするためにはapp.yamlというファイルが必要になります。このapp.yamlにApp Engineの設定を書いていきます。

では、Laravelのプロジェクトのルートディレクトリにapp.yamlを作成して、中身を以下のように書いてください。

```app.yaml
# PHPのバージョンは8.1
runtime: php81
# スタンダード環境を指定
env: standard

runtime_config:
  document_root: public
  php_version: 8.1

automatic_scaling:
  min_idle_instances: automatic
  max_pending_latency: automatic
  max_concurrent_requests: 80

env_variables:
  # ログのエラーが出ないようにするための記述
  LOG_CHANNEL: stderr
  # キャッシュのエラーが出ないようにするための記述
  CACHE_DIRECTORY: /tmp/laravel/cache
  SESSION_DRIVER: cookie
  APP_STORAGE: /tmp

# デプロイ時のcomposerのバージョン
build_env_variables:
  GOOGLE_COMPOSER_VERSION: 2.2.1
```

App Engineの環境はスタンダード環境とフレキシブル環境という2つの環境があります。

この2つの環境には色々と違いがあるものの、2023年7月28日現在では、スタンダード環境で対応しているPHPのバージョンが8.2までとなっており、フレキシブル環境では7.3までとなっています。

Laravel 10の場合だとPHPのバージョンが8.1以上でなければいけないので、今回はスタンダード環境にデプロイしていきます。

```app.yaml
env: standard
```

というのがスタンダード環境を指定するための記述です。

また、App EngineにLaravelのアプリをデプロイしたときに、ログやキャッシュに関するエラーが出る場合があるので、そういったエラーを防ぐための記述もしていきます。

```app.yaml
env_variables:
  # ログのエラーが出ないようにするための記述
  LOG_CHANNEL: stderr
  # キャッシュのエラーが出ないようにするための記述
  CACHE_DIRECTORY: /tmp/laravel/cache
  SESSION_DRIVER: cookie
  APP_STORAGE: /tmp
```

## composer.jsonの編集

次はcomposer.jsonの中身を編集していきます。composer.jsonのscriptsのところに以下のような記述を追加していください。

```composer.json
        "post-install-cmd": [
            "chmod -R 755 bootstrap\/cache",
            "php artisan cache:clear"
        ]
```

この記述はデプロイしたときにキャッシュのエラーが出ないようにするための記述ですね。

## その他のファイルを編集

composer.json以外にもアプリをデプロイしたときにキャッシュのエラーを防ぐために編集が必要なファイルがあるので、Laravelのファイルをいくつか編集していきます。

まず、bootstrapのディレクトリにあるapp.phpに以下の記述を追記します。

```bootstrap/app.php
$app->useStoragePath(env('APP_STORAGE', base_path() . '/storage'));
```

次はconfigディレクトリにあるcache.phpのfileのところにあるpathを以下のように変更します。

```config/cache.php
'path' => '/tmp/cache',
```

同じくconfigディレクトリにあるsession.phpのdriverの部分を以下のように変更します。

```config/session.php
'driver' => env('SESSION_DRIVER', 'cookie'),
```

最後に、configディレクトリにあるview.phpのcompiledの部分を以下のように変更します。

```config/view.php
'compiled' => storage_path(),
```

## .gcloudignoreを作成する

不必要なものやデプロイするとエラーになるファイルをデプロイしないようにするためにLaravelのプロジェクトのルートディレクトリに.gcloudignoreファイルを作成します。

このファイルは.gitignoreのようなもので、指定したファイルをデプロイのときに無視することができます。

.gcloudignoreファイルの中身は以下のようにしてください。

```.gcloudignore
.DS_Store

/vendor
/node_modules

/bootstrap/cache/*
!/bootstrap/cache/.gitignore

/storage/framework/cache/*
!/storage/framework/cache/.gitignore
/storage/framework/sessions/*
!/storage/framework/sessions/.gitignore
/storage/framework/testing/*
!/storage/framework/testing/.gitignore
/storage/framework/views/*
!/storage/framework/views/.gitignore
/storage/debugbar/*
!/storage/debugbar/.gitignore
/storage/logs/*
!/storage/logs/.gitignore
/storage/*.key
/public/storage

/_ide_helper.php
/_ide_helper_models.php
/.phpstorm.meta.php

/.phpunit.result.cache
```

※上記の.gcloudignoreファイルはこちらの記事を参考にさせていただいております。

https://qiita.com/conjLob/items/f11fbb852d179d83523c

## デプロイ

ここまでできたら、実際にLaravelのアプリをApp Engineにデプロイしていきます。

ターミナルでLaravelのプロジェクトのディレクトリに移動して、以下のコマンドを実行してください。

```
gcloud app deploy
```

このコマンドを入力すると「Do you want to continue (Y/n)? 」と聞かれるのエンターを押して、デプロイを実行します。

デプロイが完了するのをしばらく待ちます。ターミナルに以下のような表示が出たら、デプロイは完了です。

以下のコマンドをターミナルに入力すると、ブラウザが開いてデプロイしたLaravelの画面が表示されます。

```
gcloud app browse
```

以下のような画面が表示されていればOKです。
![スクリーンショット 2023-07-28 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089293/197c6908-a762-0eee-5a0b-3f1c63b6f18e.png)

App EngineからCloud SQLに接続する方法などについては、こちらの記事で解説しています。

https://qiita.com/masakiwakabayashi/items/dd93d9a69395090f16d2

## まとめ

app.tamlファイルをLaravelのルートディレクトリに作成してデプロイするための設定を記述し、デプロイしたときのログやキャッシュのエラーを防ぐための対応をすることで、App Engineのスタンダード環境にlaravel 10のアプリをデプロイすることができます。

今回作成したLaravelのプロジェクトのリポジトリはこちらです。

https://github.com/masakiwakabayashi/laravel_gcp_app_engine_deploy