rakumoコンサルティング部 Tech Blog

GCPの構築ノウハウをそろりと公開 コンサル部によるテックブログ

構築済のWordPressをGoogle App Engineに移行する(3)

rakumoコンサルティング部の小山(@koyhoge)です。

既存のWordPressGCPに移行する解説記事の3回目です。

前回の作業で 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環境でも良いでしょう。

 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

参考diff

これは 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つの方法があります。

  • 送信元IPアドレスによって承認する
  • cloud_sql_proxy コマンドを用いてトンネルを作成する

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 インスタンスを作成します。

  • ユーザ: my_wordpress_user
  • パスワード: xxxxxxxx
  • データベース名: my_wordpress_db

まずは cloud_sql_proxy 経由で Cloud SQLMySQL に接続します。<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 のインストール画面が出てくることを確認できます。

WordPressインストール画面

次回はデプロイされた WordPress の設定と既存のデータのインポートを行います。