LoginSignup
14
9

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-10-13

概要

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

ログの設定

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

image.png

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の準備

  • インスタンスを作成
    2019-10-13-16-11-34.png

  • MySQL を選択
    2019-10-13-16-12-18.png

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

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

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

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

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

2019-10-13-16-19-46.png

image.png

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=インスタンス名

プラットフォームから確認する。
2019-10-13-16-49-27.png

2019-10-13-16-52-04.png

2019-10-13-16-53-22.png

タイムゾーンについて

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

show variables like '%time_zone%';

image.png

文字コードについて

ちなみに、デフォルトは 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]

2019-10-13-22-07-55.png

設定ファイルの修正

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あってちょっとだけびっくりした

2019-10-13-20-36-40.png

ほとんどデータいれていない状態で、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ファイル)で保持する方法

14
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9