rakumoコンサルティング部の小山(@koyhoge)です。
既存のWordPressをGCPに移行する解説記事の3回目です。
- 第1回 構築済のWordPressをGoogle App Engineに移行する(1)
- 第2回 構築済のWordPressをGoogle App Engineに移行する(2)
- 第3回 構築済のWordPressをGoogle App Engineに移行する(3)
- 第4回 構築済のWordPressをGoogle App Engineに移行する(4)
- 番外編 構築済のWordPressをGoogle App Engineに移行する(費用編)
前回の作業で GCP 環境のセットアップが終わりましたので、次に Google App Engine (GAE) 上に構築する WordPress の準備をしていきます。
WPonGAE のセットアップ
第1回で紹介した「WordPress on App Engine Starter Project (WPonGAE) 」を使って GAE 上に WordPress を構築していきます。
ここで一つ注意点があって、GAE の PHP は通常の環境 (Standard Environment) では PHP 5.5 で動作します。PHP 5.6 以上が必要な WordPress プラグインを使用している場合はこのやり方ではうまくいきません。その場合は Flexible Environment を用いてカスタムランタイムを利用することになりますが、この記事ではそのやり方については取り上げません。
GitHub から取得
まずは WPonGAE のソース一式を GitHub より取得します。これには git コマンドを使います。コマンドラインが苦手な方は GitHub Desktop などのGUI環境でも良いでしょう。
- GitHub Desktop desktop.github.com
git clone --recursive https://github.com/googlearchive/appengine-php-wordpress-starter-project.git
すると「appengine-php-wordpress-starter-project」という名前のディレクトリができます。以下にはいくつかのファイルとディレクトリがあります。
appengine-php-wordpress-starter-project_build_linux_mac.zip appengine-php-wordpress-starter-project_windows.zip appengine-wordpress-plugin/ app.yaml batcache/ cron.yaml databasesetup.sql move_files_after_editing.bat move_files_after_editing.sh php.ini README.md wordpress/ wp-config.php wp-memcache/
このディレクトリをGAEへの配布元として作業していきます。
$ cd appengine-php-wordpress-starter-project
WordPress の置き換え
まずは現在動作している WordPress のディレクトリをコピーしてきて、WPonGAE の wordpress と入れ替えます。こうすることで既存環境にインストールされている各種プラグインも、そのまま GAE 上で動作するようになります。
$ rm -rf wordpress $ cp -r original_wordpress ./wordpress
設定ファイルの変更
app.yaml の変更
まずは GAE の設定ファイルである app.yaml を変更します。先頭の application と version 行を削除します。
-application: your-project-id -version: wpfromstarterproject runtime: php55 api_version: 1
これは WPonGAE が作られた後で、GAE 側の仕様が変わったことによります。現在では application と version は環境から渡すことになっており、app.yaml に記述することは推奨されません。
あと git clone した環境だと、.git/ ディレクトリに不要な大きいファイルがあるので、これを無視するように skip_files に追加します。
skip_files: - ^(.*/)?\.zip$ - ^(.*/)?\.bat$ - ^(.*/)?\.sh$ - ^(.*/)?\.md$ - \.git/
wp-config.php の変更
次に WordPress の実行設定である wp-config.php を変更します。
WPonGAE に用意されている wp-config.php をベースにしても良いですが、これは WordPress 3.X のものであまりに古いので、既存環境の wp-config.php に変更を追加していくことにします。そのためまずは WPonGAE の wp-config.php を wp-config-gae.php にリネームして、既存の wp-config.php をカレントディレクトリにコピーします。
$ mv wp-config.php wp-config-gae.php
$ cp wordpress/wp-config.php .
wp-config.php をエディタで開いて修正を加えていきます。
まずはデータベースの設定から。現在の設定はおそらく以下のようになっていると思います。(4.9.1-ja)
/** WordPress のためのデータベース名 */ define('DB_NAME', 'my_wordpress_db'); /** MySQL データベースのユーザー名 */ define('DB_USER', 'my_wordpress_user'); /** MySQL データベースのパスワード */ define('DB_PASSWORD', 'xxxxxxxx'); /** MySQL のホスト名 */ define('DB_HOST', 'localhost');
その部分をこうします。
if (isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'],'Google App Engine') !== false) { /** The name of the Cloud SQL database for WordPress */ define('DB_NAME', 'my_wordpress_db'); /** Live environment Cloud SQL login and SITE_URL info */ /** Note that from App Engine, the password is not required, so leave i\ t blank here */ define('DB_HOST', 'localhost:/cloudsql/wp-on-gae-187408:asia-northeast1:wp-on-gae-mysql'); define('DB_USER', 'my_wordpress_user'); define('DB_PASSWORD', 'xxxxxxxx'); } else { /** The name of the local database for WordPress */ define('DB_NAME', 'my_wordpress_db'); /** Local environment MySQL login info */ define('DB_HOST', 'localhost:/cloudsql/wp-on-gae-187408:asia-northeast1:wp-on-gae-mysql'); define('DB_USER', 'my_wordpress_user'); define('DB_PASSWORD', 'xxxxxxxx'); }
if 文の最初のブロックが GAE で動作する場合の設定で、else 以降のブロックがそれ以外の設定になっています。上記の例では、この後の都合で両者とも同じ設定値になっていますが、ローカルで動かしたときだけ DB 設定を変えたい等の場合は、下のブロックを変更して下さい。
DB_NAME, DB_USER, DB_PASSWORD は、それぞれご自身の環境のものに書き換えます。
GAE の場合の設定の以下の記述ですが、
define('DB_HOST', 'localhost:/cloudsql/wp-on-gae-187408:asia-northeast1:wp-on-gae-mysql');
これは * 実行マシンの * /cloudsql ディレクトリに存在する * 「wp-on-gae-187408:asia-northeast1:wp-on-gae-mysql」 という名前のUNIXドメインソケット に接続するという意味になります。第1回目で作成した Cloud SQLの「インスタンス接続名」をここで使用します。
次に WordPress のサイト URLを、アクセスされた URL から自動設定するために以下を挿入します。
// Determine HTTP or HTTPS, then set WP_SITEURL and WP_HOME if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVE\ R_PORT'] == 443) { $protocol_to_use = 'https://'; } else { $protocol_to_use = 'http://'; } define( 'WP_SITEURL', $protocol_to_use . $_SERVER['HTTP_HOST']); define( 'WP_HOME', $protocol_to_use . $_SERVER['HTTP_HOST']);
GAEには処理の定期実行の仕組みがありますので、WordPressによる cron の疑似実行は無効にします。
/** * Disable default wp-cron in favor of a real cron job */ define('DISABLE_WP_CRON', true);
WPonGAE に含まれる batcache プラグインのための設定を追加します。
// Required for batcache use define('WP_CACHE', true); // configures batcache $batcache = [ 'seconds' => 0, 'max_age' => 30 * 60, // 30 minutes 'debug' => false ];
以上で wp-config.php の編集はおしまいです。
インストールスクリプトの実行
WPonGAE 用意されているスクリプト "move_files_after_editing.sh" を実行します。これは各種プラグインを ./wordpress 以下に移動します。
$ sh move_files_after_editing.sh
WordPress 側の準備はこれにて完了です。
Cloud SQL Proxy のインストール
Cloud SQLのデータベースに接続するには、以下の2つの方法があります。
GAEの環境では、後者の cloud_sql_proxy 経由になりますので、手元でも同じ環境を作っておくほうが何かと便利でしょう。ということでローカルに Cloud SQL Proxy をインストールします。
Cloud SQL Proxy については以下の Google のページを参考にします。
https://cloud.google.com/sql/docs/mysql/connect-admin-proxy?hl=jacloud.google.com
Cloud SQL Administration APIを有効にする
以下のURLの管理画面から Cloud SQL Administration APIをプロジェクトに対して有効にします。
Cloud SQL Administration APIの有効化
プロキシをインストールする
cloud_sql_proxy のソースコードは GitHub で公開されていますが、各種プラットフォーム毎のバイナリも用意されていますので、そちらを用います。今回は Linux 64ビット環境で用いますので以下のコマンドでダウンロードします。
$ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy $ chmod +x cloud_sql_proxy
アプリケーション認証情報を取得
Cloud SQL Proxyは Cloud SQLに接続する際にGCPの認証を必要とします。このために専用のサービスアカウントを作成する方法もあります(上記の Googleの解説ではそのやり方について説明しています)。今回は Cloud SDK の認証情報を使用する簡易な方法でいきます。
まずは gcloud コマンドで application-default の認証を行います。
$ gcloud auth application-default login Go to the following link in your browser: https://accounts.google.com/o/oauth2/auth?<後略> Enter verification code:
ブラウザが開く環境ならおそらく自動で認証画面が表示されるでしょう。リモートログインしている環境などブラウザを開けない状況では、上記のように認証用の URL が表示されるので、それをブラウザで開いて許可を行った結果、表示される認証コードを入力します。
Enter verification code: XXXXXXXXXX Credentials saved to file: [/home/koyama/.config/gcloud/application_default_credentials.json] These credentials will be used by any library that requests Application Default Credentials.
これにより割り当てられた認証情報用いて cloud_sql_proxy コマンドは Cloud SQL に接続できるようになります。
プロキシを起動
cloud_sql_proxy コマンドは、オプションにより TCP ソケットと UNIX ドメインソケットのどちらかを使用して接続を受け付けます。ここでは GAE の実行環境と同様に UNIX ドメインソケットを用います。
まずはソケットが置かれるディレクトリを作成します。これは GAE の環境に合わせて「/cloudsql」固定です。
$ sudo mkdir /cloudsql $ sudo chmod 777 /cloudsql
作成したディレクトリを指定して cloud_sql_proxy コマンドを起動します。
$ cloud_sql_proxy -dir=/cloudsql &
現在有効な Cloud SQL インスタンスを調べて、そこに接続するソケットを自動的に /cloudsql に作成してくれます。
Cloud SQLにデータベースインスタンスを作成
第2回目で Cloud SQL の設定を行いましたが、ここにはまだ DB インスタンスが何もない状態ですので、これを作っていきます。
以下の設定で DB インスタンスを作成します。
まずは cloud_sql_proxy 経由で Cloud SQL の MySQL に接続します。<ROOT_PASSWORD> の部分は第2回の「Cloud SQLの設定」の時に生成したパスワードを使います。
$ mysql -u root -p<ROOT_PASSWORD> -S /cloudsql/wp-on-gae-187408:asia-northeast1:wp-on-gae-mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 144326 Server version: 5.7.14-google-log (Google) Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
無事に接続でき、mysql> プロンプトが表示されました。
まずは DB インスタンスを作成します。
mysql> create database my_wordpress_db;
次にユーザーを作成します。
mysql> create user my_wordpress_user;
作成したユーザに DB へのアクセス権限を与えます。
mysql> grant all on my_wordpress_db.* to my_wordpress_user@'%' identified by 'xxxxxxxx';
これで wp-config.php に記述した情報で、データベースにアクセスできるようになりました。
GAE へデプロイ
さて長くなりましたが、いよいよ GAE に WordPress をデプロイします。
$ gcloud app deploy Services to deploy: descriptor: [/home/koyama/work/appengine-php-wordpress-starter-project/app.yaml] source: [/home/koyama/work/appengine-php-wordpress-starter-project] target project: [wp-on-gae-187408] target service: [default] target version: [20171212t084527] target url: [https://wp-on-gae-187408.appspot.com] Do you want to continue (Y/n)?
プロンプトに「y」と入力すると、作業中のプログレスバーが徐々に伸びていき、問題がなければ無事にデプロイが完了します。
Do you want to continue (Y/n)? y Beginning deployment of service [default]... Some files were skipped. Pass `--verbosity=info` to see which ones. You may also view the gcloud log file, found at [/home/koyama/.config/gcloud/logs/2017.12.12/08.45.25.627575.log]. ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 1732 files to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════File upload done. Updating service [default]...done. Updating service [default]...Waiting for operation [apps/wp-on-gae-187408/operations/9b5abc74-6bda-4c10-aae8 -2c6c00b6497f] to complete...done. Updating service [default]...done. Deployed service [default] to [https://wp-on-gae-187408.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s default To view your application in the web browser run: $ gcloud app browse
表示されている URL にアクセスすると、無事に WordPress のインストール画面が出てくることを確認できます。