Laravel+Eclipseで開発するための準備&Google App Engineにデプロイする

# 概要
以前からLaravelに興味があり、Laravelを用いて何かWebアプリケーションを作ってみたいと思っていました。

そこで先日、準備としてLaravelをインストールしてEclipseで開発環境を作り、作成した新規LaravelプロジェクトをGoogle App Engineにデプロイしてみました。最初は色々つまずきましたが、何とか一通りできたので参考にさせていただいたサイトと手順をメモとして残します。

## 目的
- Laravelをインストールしてプロジェクトを作成する
- LaravelプロジェクトをEclipseにインポートして編集できるようにする
- 作成したLaravelプロジェクトをGoogle App EngineにデプロイしてWebアプリとして公開する

## 環境
macOS Catalina ver.10.15.7
PHP 7.3.11
Laravel Framework 8.50.0
Eclipse Platform Version: 2021-06 (4.20)

※おおよその手順は同じだと思いますが、Windowsの場合手順が一部異なる可能性があります。
※今回、開発環境にEclipseを選んでいますがEclipse以外の環境を用いても大丈夫です。

# 手順
## 1.&nbsp; Eclipseのインストール
参考サイト：[MacにEclipse（+日本語化）をインストールする方法](https://reasonable-code.com/mac-eclipse-install/)

上記サイトを参考に、[Pleiades All in One ダウンロード](https://mergedoc.osdn.jp/)ページから自分の環境に合うEclipseをダウンロード・インストールしてください（自分はMacのFull Edition(PHP)を選択しました）。

## 2. Composerのインストール
参考サイト：[Macにcomposerをインストール](https://qiita.com/shosho/items/572b3c356fc97214790b)

[Composer](https://getcomposer.org/)のダウンロードページにあるコマンドを実行してComposerをインストールしてください。

インストール後、```composer -V```または```composer --version```コマンドを実行してComposerが正しくインストールされているかを確認してください。

## 3. Composerを用いてLaravelをインストール+プロジェクトを作成
参考サイト：[【PHP/Laravel】開発環境構築（Mac版）](https://qiita.com/masayan-06/items/53295d3cf37d8507b380)

プロジェクトを作成したい場所にカレントディレクトリを移動し、

```
$ composer create-project "laravel/laravel=8.*" プロジェクト名
```
（プロジェクト名の部分は任意の名前を設定してください。またLaravelのバージョンはここでは8としていますが、任意のバージョンで大丈夫です。）

上記コマンドでLaravelをインストール&プロジェクトを作成してください。プロジェクトの作成後、作成したプロジェクトにカレントディレクトリを移動して

```
$ php artisan serve
```
上記コマンドを実行して表示されるURLにブラウザでアクセスし、プロジェクトが正しく動作することを確認してください（ローカルサーバーを停止させたい時はCtrl+Cを押してください）。

以降、作成したプロジェクトがカレントディレクトリになっている状態として説明を続けていきます。

### Eclipseに Laravelプロジェクトをインポートする
※ここの作業はEclipseにLaravelプロジェクトを読み込ませたい場合の手順なので、今ではなくLaravelプロジェクトのデプロイ後に実施しても大丈夫です。

1.&nbsp; Eclipseのメニューバーから ファイル > インポートを選択

2.&nbsp; PHP > 既存のComposerプロジェクト を選択

3.&nbsp; 作成したLaravelプロジェクトを参照で選択する。プロジェクト名に任意の名前を入力して完了を押すと、Eclipse上にLaravelプロジェクトがインポートされる

## 4. Google Cloud Platformの利用登録とGoogle App Engineのプロジェクト作成
参考サイト：[ゼロから始める Google App Engine の使い方（2017年）](https://blog.apar.jp/web/6912/)

上記サイトを参考に、Google Cloud Platformの利用登録とGoogle App Engineのプロジェクト作成を行なってください（作成したプロジェクトについて、請求は有効にしてください）。

ここでGoogle Cloud PlatformとGoogle App Engineの概要について簡単に触れると、

**Google Cloud Platform：**
Googleが提供するクラウド上のサービス群。データ解析や機械学習系など様々なサービスがある。利用登録後、90日間（$300相当）無料トライアルで利用できる。

**Google App Engine：**
Google Cloud Platformのサービスの1つで、Webアプリケーションを公開することができる。JavaやPython、PHPなどに対応している。[無料枠が存在](https://cloud.google.com/free/docs/gcp-free-tier/?hl=ja#app-engine)する。

Google Cloud Platformの利用登録をする際に支払い方法を設定する必要がありますが、利用登録後90日間は無料トライアルを利用できます。また無料トライアル期間が終了して有料アカウントに切り替えても、無料枠に収めて運用することができれば課金はされません。

※無料トライアルが終了した後は有料アカウントに切り替える必要があります（切り替えない場合、プロジェクトのリソースが削除されてしまう）。

## 5. Google Cloud SDKのインストール
参考サイト：[【Mac】gcloudコマンドのインストール](https://takagi.blog/how-to-install-gcloud-command-on-mac/)

```
$ curl https://sdk.cloud.google.com | bash
```
上記コマンドを実行してGoogle Cloud SDKをインストールし、ターミナル上でgcloudコマンドが使える状態にしてください（上記コマンドを実行すると対話形式で色々聞かれますが、基本的には全てEnter及びyで大丈夫です）。

```
$ exec -l $SHELL
```
上記コマンドでシェルを再起動した後、

```
$ gcloud -v
```
を実行してGoogle Cloud SDKのバージョンが表示されれば正しくインストールされています。

Google Cloud SDKのインストール後、

```
$ gcloud init
```
を実行して環境を初期化してください（ブラウザで認証を求められるので、Google Cloud Platformの利用登録を行なったGoogleアカウントで認証してください）。

ターミナル上で使用するアカウントを聞かれた場合は登録を行なったアカウントを、使用するプロジェクトを聞かれた場合は登録したプロジェクトを選択してください。

## 6. app.yamlの作成とbootstrap/app.phpの編集
参考サイト：
[Laravel6をGoogle App Engineで動かす](https://qiita.com/kiyc/items/d86da4e5753220c121b9)
[Google App Engine(GAE)を無料枠で収めるための勘所](https://www.serversus.work/topics/p1uaj4jrv8b5x70hwe6p/)

Laravelプロジェクト内にapp.yamlを作成します。一例ですが、内容は以下のようにします（環境変数の設定と、プロジェクトをできるだけ無料枠で収めるためにしておきたい設定を書いています）。

```app.yaml
runtime: php73

env: standard
instance_class: F1

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

automatic_scaling:
  min_idle_instances: automatic
  max_idle_instances: 1
  min_pending_latency: 3000ms
  max_pending_latency: automatic
  max_instances: 2
```
runtimeのphp**の値はPHPのバージョンに合わせて設定します（例：PHPのバージョンが7.2であれば72）。

またYOUR_APP_KEYの部分には

```
$ php artisan key:generate --show --no-ansi
```
の実行結果を書いてください（以下のコマンドを実行すると自動的に書き替えてくれます）。

```
$ sed -i '' "s#YOUR_APP_KEY#$(php artisan key:generate --show --no-ansi)#" app.yaml
```

次に、bootstrap/app.phpの```return $app;```の手前に以下の内容を追記します。

```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'));
```

## 7. Laravelプロジェクトをデプロイ
参考サイト：[Laravel6をGoogle App Engineで動かす](https://qiita.com/kiyc/items/d86da4e5753220c121b9)

```
$ gcloud app deploy
```
上記コマンドを実行して、LaravelプロジェクトをGoogle App Engineにデプロイします。

途中でどのリージョンにデプロイするかを聞かれると思うので、任意のものを選択してください（リージョンによって無料枠を超えた場合にかかる費用が若干異なるみたいですが、大きな違いはないのであまり気にしなくて大丈夫だと思います。特別な理由がなければ、距離的に近い東京（asia-northeast1）または大阪（asia-northeast2）を選ぶと良いと思います）。

何もエラーが出なければデプロイ成功です。以下のコマンドを実行することで、ブラウザ上でページを表示することができます。

```
$ gcloud app browse
```

なお、もし上記コマンドを実行してブラウザ上でページを表示させた時に

```
Class 'NunoMaduro\Collision\Adapters\Laravel\CollisionServiceProvider' not found
```
といったエラーが表示された場合、composer.jsonの "require-dev" 内にある```"nunomaduro/larastan": "^{バージョン}"```を "require" に移動してみてください（[参考ページ](https://stackoverflow.com/questions/54284713/class-nunomaduro-collision-adapters-laravel-collisionserviceprovider-not-found)）。

<br>
以降、ファイルを編集してApp Engine上にその内容を反映させたい場合は

```
$ gcloud app deploy
```
を実行してデプロイを行なってください。

ローカル環境でページを確認したい場合は

```
$ php artisan serve
```
を実行して表示されるURLにアクセスし、公開したページを表示したい場合は

```
$ gcloud app browse
```
を実行してください（App EngineのダッシュボードにURLが表示されているのでそこからアクセスしてもOKです）。

## 無料枠で運用するためにやっておきたいこと
参考サイト：[App Engine の費用の管理](https://cloud.google.com/appengine/docs/managing-costs?hl=ja#create_budget_alerts)

意図せぬ形で料金を請求されてしまうことがないよう、項目6で述べたようにapp.yamlにmax_instances等を設定したり、プロジェクトの設定画面から予算アラートを設定しておきましょう（設定次第では指定したしきい値を超えた場合にアプリを自動的に無効化することもできるみたいです）。

無料枠を超えてしまった等、アプリを停止させたい場合はApp Engineの設定画面の「アプリケーションを無効にする」を押すことで一時的に停止させることができます（後で再開させることもできます）。

万が一に備えて、無料枠で運用できているかこまめにApp Engineのダッシュボードは確認しましょう。

<br>
以上、Laravelプロジェクトの作成〜App Engineにデプロイするまでの手順をまとめてみました。最後まで読んでくださりありがとうございました！