Google App Engine(GAE)でWordPressを構築する

公式ページのアップデート版（非公式）です。
[App Engine フレキシブル環境での WordPress のホスティング](https://cloud.google.com/php/tutorials/wordpress-app-engine-flexible?hl=ja)

# 作業手順
1. GCPプロジェクト作成
2. Cloud SQLインスタンス作成と設定
3. WordPressプロジェクトの設定
4. App Engine環境へのデプロイ

## 1. GCPプロジェクト作成

1. GCPプロジェクトの課金が有効になっているか確認
2. [必要なAPIが有効になっているか確認](https://console.cloud.google.com/flows/enableapi?apiid=sqladmin%2Ccompute_component&hl=ja&_ga=2.199275054.-1879444014.1553154869)
3. [Cloud SDKをインストール](https://cloud.google.com/sdk/docs/?hl=ja)
4. [サービスアカウントを作成](https://console.cloud.google.com/apis/credentials/?hl=ja&_ga=2.40940194.-1879444014.1553154869)
5. [PHP](http://php.net/manual/en/install.php)と[Composer](https://getcomposer.org/)をインストール
6. [Cloud SQLプロキシ](https://cloud.google.com/sql/docs/mysql-connect-proxy?hl=ja#install)をダウンロード
7. [MySQLクライアント](https://www.mysql.com/)をインストール

## 2. Cloud SQLインスタンス作成と設定

* Cloud SQLインスタンスを作成する

```shell
gcloud sql instances create [インスタンス名] \
    --activation-policy=ALWAYS \
    --tier=db-n1-standard-1
    --region=asia-northeast1
```

* Cloud SQLプロキシを実行

```shell
./cloud_sql_proxy \
    -dir /tmp/cloudsql \
    -instances=[プロジェクトID]:asia-northeast1:[インスタンス名]=tcp:3306 \
    -credential_file=[サービスアカウントのJSONファイル]
```

以下のエラーが発生した場合は、ポート番号を変更してください。
`listen tcp 127.0.0.1:3306: bind: address already in use`

* 新しいデータベースとユーザを作成

```sql
mysql -h 127.0.0.1 -u root --password=[パスワード]
mysql> create database [データベース名];
mysql> create user '[ユーザ名]'@'%' identified by '[パスワード]';
mysql> grant all on [データベース名].* to '[ユーザ名]'@'%';
mysql> exit
```

## 3. WordPressプロジェクトの設定

* Githubからリポジトリをクローン

```shell
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
```

* サンプルディレクトリに移動（今回はフレキシブル環境の例です）

```shell
cd php-docs-samples/appengine/flexible/wordpress
```

* 依存関係をインストール

```shell
composer install
```

* ヘルパースクリプトを実行

```shell
php wordpress.php setup -n \
    --dir [WordPressのプロジェクト名] \
    --db_instance=[インスタンス名] \
    --db_name=[データベース名] \
    --db_user=[ユーザ名] \
    --project_id=[プロジェクトID] \
    --db_password=[パスワード] \
    --db_region=asia-northeast1
```

ヘルパースクリプトがwordpress/wp-config.phpに以下の内容を書き込みます。

```php
if ($onGae) {
    / Production environment */
    define('DB_HOST', ':/cloudsql/[プロジェクトID]:asia-northeast1:[インスタンス名]');
    / The name of the database for WordPress /
    define('DB_NAME', '[データベース名]');
    / MySQL database username */
    define('DB_USER', '[ユーザ名]');
    / MySQL database password /
    define('DB_PASSWORD', '[パスワード]');
} else {
    / Local environment */
    define('DB_HOST', '127.0.0.1');
    / The name of the database for WordPress /
    define('DB_NAME', '[データベース名]');
    / MySQL database username */
    define('DB_USER', '[ユーザ名]');
    / MySQL database password /
    define('DB_PASSWORD', '[パスワード]');
}
```

## App Engine環境へのデプロイ

* WordPressプロジェクトへ移動

```shell
cd wordpress-project
```

* デプロイを実行

```shell
gcloud app deploy -q \
    --promote --stop-previous-version app.yaml cron.yaml
```

* サイトにアクセスして、表示を確認

```shell
gcloud app browse
```

# Tips

## GAE上のファイル、ディレクトリ権限を変更したい場合

* app.yamlファイルで、skip_lockdown_document_rootをtrueにする

```yaml
runtime_config:
  document_root: wordpress
  skip_lockdown_document_root: true
```

## 管理画面の言語を日本語に変更したい場合

* [日本語版WordPressをダウンロード](https://ja.wordpress.org/download/)
* languageディレクトリ配下を全て日本語版に置き換える

# （追記）AppEngineの罠

* AppEngineでWordPressをデプロイすると、AppEngine側で1日1回ロールバックするひどい目に遭った
    * つまりWordPressで更新した内容が元に戻ってしまう
* File System公式）です。
[App Engine フレキシブル環境での WordPress のホスティング](https://cloud.google.com/php/tutorials/wordpress-app-engine-flexible?hl=ja)