お久しぶりですGMO NIKKOのS.Tです。
今回は現在稼働中のオンプレシステムをGCPへ移植する機会があったので、その備忘録的な内容となっています。
■準備
Windowsを使用するのでWindows用Google Cloud SDK をインストールしてください。
インストールが完了したらコマンドプロンプトでGCPのコマンドが使用可能になるので、
gcloud initを実行してログイン後、作成済みのCloud Platform プロジェクトを選択します。
■設定
・index.phpのディレクトリにapp.yamlを追加
1 2 3 4 5 6 7 8 9 10 11 |
runtime: php72 handlers: - url: /(.+\.(html|css|js|gif|png|jpg|txt))$ static_files: \1 upload: .+\.(html|css|js|gif|png|jpg|txt)$ secure: always - url: .* script: auto secure: always |
phpはバージョン7.2で画像ファイル等の静的ファイルとスクリプトをアップロードするように設定しています。
詳細はこちらを確認してください。
・application\config\database.phpの設定変更
AppEngineからCloudSQLに接続するには、
dsnは設定せずにhostnameに’/cloudsql/[CloudSQLのインスタンス接続名]’と設定すればいいようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$db['default']['dsn'] = ''; $db['default']['hostname'] = '/cloudsql/[CloudSQLのインスタンス接続名]'; $db['default']['username'] = '***'; $db['default']['password'] = '***'; $db['default']['database'] = '***'; $db['default']['dbdriver'] = 'mysqli'; $db['default']['dbprefix'] = ''; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] = FALSE; $db['default']['cache_on'] = FALSE; $db['default']['cachedir'] = ''; $db['default']['char_set'] = 'utf8'; $db['default']['dbcollat'] = 'utf8_general_ci'; $db['default']['swap_pre'] = ''; $db['default']['autoinit'] = FALSE; $db['default']['stricton'] = FALSE; |
・application\config\config.phpの設定変更
Redisを使用していたので使用しないように設定変更。
1 2 3 |
$config['sess_driver'] = 'files'; $config['sess_save_path'] = '/tmp'; $config['sess_regenerate_destroy'] = TRUE; |
■コマンド実行
・app.yamlを追加したディレクトリでgcloud app deployを実行
対象プロジェクトやURLが表示されるのでそのまま実行します。
すると以下のようなエラーメッセージが表示されました。どうやら日本語ファイル名が存在すると弾かれるようです。
1 |
ERROR: gcloud crashed (UnicodeDecodeError): 'ascii' codec can't decode byte 0xe5 in position 15: ordinal not in range(128) |
コマンド実行によりカレントディレクトリに.gcloudignoreファイルが作成されているので対象ファイルを無視するように記述しました。
app.yamlにskip_filesを記述すれば正規表現も使えますが、phpでは使用できないらしいので面倒ですが.gcloudignoreを使います。
再度gcloud app deployを実行するとやっとアップロードが始まったのですが、またまたエラーが出ました。
ここでハマってかなり悩みましたがどうやらアップロード対象にphpのログファイルが含まれていたようでファイルサイズが結構な量になっていたのが原因でした。
これも日本語ファイルと同様に.gcloudignoreに無視ファイルを記述することで対応しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Updating service [default]...failed. ERROR: (gcloud.app.deploy) Error Response: [9] Cloud build ab83100f-fe52-4baa-a309-ab43ca346cb6 status: FAILURE. Error ID: A246CE89. Error type: BuildError. Error message: INFO FTL version php-v0.17.0 INFO Beginning FTL build for php ・ ・ ・ ERROR gzip_tar_runtime_package gzip /tmp/tmp6bOQwa.tar -1 exited with error [Errno 12] Cannot allocate memory gzip_tar_runtime_package is likely not on the path Traceback (most recent call last): File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main "__main__", fname, loader, pkg_name) File "/usr/lib/python2.7/runpy.py", line 72, in _run_code exec code in run_globals File "/usr/local/bin/ftl.par/__main__.py", line 65, in <module> File "/usr/local/bin/ftl.par/__main__.py", line 60, in main File "/usr/local/bin/ftl.par/__main__/ftl/common/ftl_error.py", line 77, in InternalErrorHandler IOError: [Errno 2] No such file or directory: '""/output'. |
無事完了したらgcloud app browseコマンドでページを確認できます。
■ソース修正
OracleからCloudSQL(MySQL)へ変更するため主にSQLの修正になりました。
趣旨から外れるので詳細は省略しますが、MySQLのバージョンが5.7(2020/05/11現在)のためWITH句が使用できないのが痛いですね・・・
早く最新版に対応してほしいです。
■まとめ
GCPは後発のせいか日本語に対応していなかったりMySQLの対応が遅れていたりまだまだ未完成だと思いますね。
ドキュメントを見ても情報量は多いのですがわかりにくいと感じます。
ファイルサイズエラーもCannot allocate memoryではわからないのでかなり時間を取られてしまいました。
これにめげずに頑張りたいですね。