Laravel6.0 をGCP App Engineで公開し、Google Cloud SQL でMySQLを設定したメモ


概要

前回のソースをGCPに上げた。
主に以下のサイトを参考にしたけれど、大分ハマってしまった。

ログの設定

手順だと最後だけれど、エラーの調査のためにも最初にやっておいたほうがいい気がする。
ログみればテーブルが足りてないことにすぐに気づけたりするので。

Loggerの追加

app/Logging/CreateStackdriverLogger.phpを追加。
configファイルを以下のように修正。

config/logging.php
+        // Add the following lines to integrate with Stackdriver:
+        'stackdriver' => [
+            'driver' => 'custom',
+            'via' => App\Logging\CreateStackdriverLogger::class,
+            'level' => 'debug',
+        ],
    ],
];

GCP公開時の環境変数を以下のように追加。

app.yaml
runtime: php72

env_variables:
+  LOG_CHANNEL: stackdriver

app/Exceptions/Handler.phpを以下のように修正。

app/Exceptions/Handler.php
+ use Google\Cloud\ErrorReporting\Bootstrap;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
// 省略

    public function report(Exception $exception)
    {
-        parent::report($exception);
+        if (isset($_SERVER['GAE_SERVICE'])) {
+            // Ensure Stackdriver is initialized and handle the exception
+            Bootstrap::init();
+            Bootstrap::exceptionHandler($exception);
+        } else {
+            parent::report($exception);
+        }
    }
    # [END

composerでライブラリの導入。

composer require google/cloud-logging google/cloud-error-reporting

MySQLの準備

  • インスタンスを作成

  • MySQL を選択

  • インスタンスIDを入力。

    • インスタンス名には機密情報や個人を特定できる情報を含めない。
    • インスタンス名は外部から閲覧可能。
    • インスタンス名にプロジェクト ID を含める必要はない。
    • この処理は必要に応じて自動的に行う(ログファイルの場合など)
  • リージョンを入力

    • インスタンスと同じリージョンにすること
    • asia-northeast1 (東京))
    • ゾーンは任意のままでよい

MySQLの詳細設定は、次の記事が分かりやすく書かれています。

ここで、フラグを設定して日本時間にしておくと、後々再起動しなくてよい。

gcloud に接続

Laravel5.5をGoogle App Engineで動かすを参考に、laradockのworkspaceコンテナにgcpを入れることにした。
プロキシをたてて、php artisan migrateを行う必要があるため。
今までのgcpコンテナにはphpには入れていなかったので。
このコンテナに入る処理をgcp/bin/sql_bashファイルに記述した。
どんなファイルかは参考のソースを参照。
で、コンテナに入ったらgcloud auth loginで認証して、インスタンスの情報を確認する。

./bin/sql_bash.sh
gcloud auth login
gcloud sql instances describe インスタンス名 | grep connectionName

connectionName: プロジェクトID:asia-northeast1:インスタンス名が返される。プロジェクトID:asia-northeast1:インスタンス名が接続文字列となる。

バックグラウンドでプロキシを動かす

末尾に&をつけて、プロキシをバックグラウンドで動かす。
実行した後、Enter を押さないと止まったように見える。

cloud_sql_proxy -instances=whitemap-255523:asia-northeast1:db01=tcp:3306 &

MySQL に接続してインスタンスを作る

gcloud sql databases create laravel --instance=インスタンス名

プラットフォームから確認する。

タイムゾーンについて

フラグを設定していれば日本時間になっているはず。

show variables like '%time_zone%';

文字コードについて

ちなみに、デフォルトは utf8。
utf8mb4 にするなら、手動でSQL流せばいける。

CREATE DATABASE example CHARACTER SET utf8mb4;
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.04 sec)

テーブルの作成

今回は手順に従ってsession,cacheをDBに保存する設定も行うため、
それ用のテーブル定義をsession:table,cache:tableで行う。
passport も入れてあるので、その分の artisan も追加。

php artisan session:table
php artisan cache:table
export DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=YOUR_DB_PASSWORD DB_HOST=127.0.0.1
php artisan migrate --force
php artisan passport:install

接続ユーザの作成

接続するためのユーザをつくる。
作ったら、一度コンソールでログインして、テーブルやユーザができているか確認するとよい。

gcloud sql users create [USER_NAME] --host=[HOST] --instance=[INSTANCE_NAME] --password=[PASSWORD]

設定ファイルの修正

DB設定を追加する。

app.yaml
runtime: php72

env_variables:
  APP_KEY: YOUR_APP_KEY
  APP_STORAGE: /tmp
  VIEW_COMPILED_PATH: /tmp
+  CACHE_DRIVER: database
+  SESSION_DRIVER: database
+  ## Set these environment variables according to your CloudSQL configuration.
+  DB_DATABASE: YOUR_DB_DATABASE
+  DB_USERNAME: YOUR_DB_USERNAME
+  DB_PASSWORD: YOUR_DB_PASSWORD
+  DB_SOCKET: "/cloudsql/YOUR_CONNECTION_NAME"

passport の設定を環境変数にいれるようにする

  • passportの「Passportのデプロイ」を参照
設定ファイルの作成
php artisan vendor:publish --tag=passport-config
環境変数にファイルの内容を埋め込む
  • php artisan passport:installで以下のファイルができている
    • storage/oauth-private.key
    • storage/oauth-private.key

この鍵ファイルの内容を以下のように設定ファイルに入れる

app.yaml
runtime: php72

env_variables:
  APP_KEY: YOUR_APP_KEY
  APP_STORAGE: /tmp
  VIEW_COMPILED_PATH: /tmp
  CACHE_DRIVER: database
  SESSION_DRIVER: database
  ## Set these environment variables according to your CloudSQL configuration.
  DB_DATABASE: YOUR_DB_DATABASE
  DB_USERNAME: YOUR_DB_USERNAME
  DB_PASSWORD: YOUR_DB_PASSWORD
  DB_SOCKET: "/cloudsql/YOUR_CONNECTION_NAME"
+   PASSPORT_PRIVATE_KEY: |
+     -----BEGIN RSA PRIVATE KEY-----
+     <private key here>
+     -----END RSA PRIVATE KEY-----
+   PASSPORT_PUBLIC_KEY: |
+     -----BEGIN PUBLIC KEY-----
+     <public key here>
+     -----END PUBLIC KEY-----

公開準備

Firebase のシークレットファイルの場所を追記。

前回でFirebaseを導入したため。

app.yaml
env_variables:
+  FIREBASE_CREDENTIALS: secret.json

これで公開してやれば、動く。
ここまでのソース

はず。

cloud sql のストレージに初期から1Gあってちょっとだけびっくりした

ほとんどデータいれていない状態で、1.13GiB あって少し驚いた。
メタデータとかも容量に含まれているのね。

参考

Run Laravel on Google App Engine standard environment
Google App Engine で Laravel を動かして Cloud SQL へ接続してみた
Cloud SQL for MySQL インスタンス
【Docker】AlpineLinux を使った Laravel 環境構築
Cloud SQL for MySQL ユーザ作成
passport
Laravel Passport の暗号キー情報を環境変数(.env ファイル)で保持する方法
複数行の yaml
Logging
PHP 用 Error Reporting の設定
Laravel5.5 を Google App Engine で動かす
passport
Laravel Passportの暗号キー情報を環境変数(.envファイル)で保持する方法