概要
前回のソースをGCPに上げた。
主に以下のサイトを参考にしたけれど、大分ハマってしまった。
- Run Laravel on Google App Engine standard environment
- Google App Engine で Laravel を動かして Cloud SQL へ接続してみた
ログの設定
手順だと最後だけれど、エラーの調査のためにも最初にやっておいたほうがいい気がする。
ログみればテーブルが足りてないことにすぐに気づけたりするので。
Loggerの追加
app/Logging/CreateStackdriverLogger.phpを追加。
configファイルを以下のように修正。
+ // Add the following lines to integrate with Stackdriver:
+ 'stackdriver' => [
+ 'driver' => 'custom',
+ 'via' => App\Logging\CreateStackdriverLogger::class,
+ 'level' => 'debug',
+ ],
],
];
GCP公開時の環境変数を以下のように追加。
runtime: php72
env_variables:
+ LOG_CHANNEL: stackdriver
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の準備
- インスタンスIDを入力。
- インスタンス名には機密情報や個人を特定できる情報を含めない。
- インスタンス名は外部から閲覧可能。
- インスタンス名にプロジェクト ID を含める必要はない。
- この処理は必要に応じて自動的に行う(ログファイルの場合など)
- インスタンス名には機密情報や個人を特定できる情報を含めない。
- リージョンを入力
- インスタンスと同じリージョンにすること
- asia-northeast1 (東京))
- ゾーンは任意のままでよい
- インスタンスと同じリージョンにすること
MySQLの詳細設定は、次の記事が分かりやすく書かれています。
-
GoogleAppEngineでFuelPHP(と、ついでにGoogleCloudSQL)をカジュアルに使ってみよう
- ストレージはHDDのほうが安い 料金表
- ※ストレージは後で変更できないので注意。
- CPUはmicroが安い
- ※cpuは後から変更できる
- ストレージはHDDのほうが安い 料金表
ここで、フラグを設定して日本時間にしておくと、後々再起動しなくてよい。
- Cloud SQL のタイムゾーンを変える
- 詳細設定のフラグを開く
-
default_timezone
を+09:00
にする
-
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設定を追加する。
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
この鍵ファイルの内容を以下のように設定ファイルに入れる
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を導入したため。
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ファイル)で保持する方法