WordPress on GAEのチュートリアルをやってみた件


# なぜやったのか

元々は[さくらのVPS](https://vps.sakura.ad.jp/)の安価なプランにWordPressを乗っけてサービスを運用していましたが、

アクセス数の急増により、プラン変更かサーバー移行の選択を迫られました。

なるべく無停止かつ安全にスケーリングしたいので、GCPのApp Engine（以下、GAE）を採用しました。

（さくらのVPSだとインスタンスを停止しないとプラン変更できない）

# 対象となる人

WordPressをGAE Flexible乗せたい人

GAEに乗せたものの、画像アップロードに失敗する人



# やること

GAEにWordPressを載せる



# やらないこと

スケーリングの設定

# 前提条件

- [Composer](https://getcomposer.org/)インストール
- GCPプロジェクトの作成
- プロジェクトでの[請求を有効](https://cloud.google.com/billing/docs/how-to/modify-project)にする
- [Cloud SQL API の有効化](https://console.cloud.google.com/flows/enableapi?apiid=sqladmin,compute_component&_ga=2.232001375.-1527620176.1557476835)
- Google Cloud SDKのインストール
- MySQL-Clientコマンドラインツールのインストール



# プロジェクトの準備

Google Cloud SDKの初期設定を行います。適切なプロジェクトとアカウントを設定します。

```
$ gcloud init
```



プロジェクト内にApp Engineアプリケーションを作成します。

```shell
$ gcloud app create
```



WordPressから上げたファイルや画像を保存できるようにGCSバケットの設定をします。

```shell
$ gsutil defacl ch -u AllUsers:R gs://YOUR_PROJECT_ID.appspot.com
```



# Cloud SQLインスタンス作成

記事やサイト情報を保存するためのDBはCloud SQLです。

ここでは `wp`をリソース名に使用していきます。



Cloud SQLの第2世代インスタンスを作成します。

パスワードは強固なものにしましょう。

```bash
$ gcloud sql users set-password root --host=% \
  --instance wp --password=YOUR_INSTANCE_ROOT_PASSWORD
```



このMySQLインスタンスにアクセスするには、Cloud SQL Proxyを使用します。

Cloud SQL Proxyのインストール方法は少し複雑ですのでここでは参考URLだけとし、割愛させて頂きます。

https://cloud.google.com/sql/docs/mysql/connect-external-app#install

「プロキシを使用して外部アプリケーションから接続する」1. ~ 4.を行ってください。



プロキシを実行しましょう。

鍵を作成していない場合は -credential_fileオプションは不要です。

```shell
$ ./cloud_sql_proxy \
  -dir /tmp/cloudsql \
    -instances=YOUR_PROJECT_ID:us-central1:wp=tcp:3306 \
      -credential_file=PATH_TO_YOUR_SERVICE_ACCOUNT_JSON_FILE
```



プロキシが実行されると、ローカルでMySQLサーバー立てた時と同じようにアクセスができるようになります。

```shell
$ mysql -h 127.0.0.1 -u root -p
```



```shell
couldn't connect to "~": ensure that the account has access to "~" (and make sure there's no typo in that name). Error during createEphemeral for ~ googleapi: Error 403: The client is not authorized to make this request., notAuthorized
^C2019/07/08 10:38:34 Received TERM signal. Waiting up to 0s before terminating.
```

こういったエラーが出る場合は、**認証情報の作成が上手く出来ていない**可能性がありますので、見直してみましょう。



それでは、WordPressのデータベースを作成しましょう。

```mysql
mysql> create database wp;
mysql> create user 'wp'@'%' identified by 'PASSWORD'; // Don't use this password!
mysql> grant all on wp.* to 'wp'@'%';
mysql> exit
```



# コマンドラインツールの使い方

App Engine FlexibleにWordPressを乗せる為のコマンドラインツールが公式で配布されていますので、こちらを使っていきます。

リポジトリのクローンをします。

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



WordPressのサンプルの場所まで移動します。

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



Composerで必要なライブラリをインストールします。

```shell
$ composer install
```



GAE用に変換してくれるスクリプトがあるので、自身の環境のパラメータを併せ込んで実行します。

```shell
$ php wordpress.php setup -n \
    --dir=./wordpress-project \
    --db_instance=wp \
    --db_name=wp \
    --db_user=wp \
    --project_id=[YOUR_PROJECT_ID] \
    --db_password=[YOUR_DATABASE_PASSWORD]
```



変換が完了したら、WordPressプロジェクトディレクトリに移動します。

```shell
$ cd wordpress-project
```



さあ、いよいよデプロイです。5~10分ほど時間が掛かりますので、ティーでも嗜みながら待ちましょう。

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



デプロイが完了すると、実際にアクセスできるようになっています。

```shell
https://[YOUR_PROJECT_ID].appspot.com
```



これでGAEにWordPressを乗っけることができました。やったね！

よ〜し、画像もアップロードしてイケイケな記事を書くぞ〜〜〜〜。

![スクリーンショット 2019-07-08 14.30.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410115/0c2fc5da-fbf3-bdd4-9c98-a9839cc82538.png)


```
Unable to create directory wp-content/uploads/2019/07. Is its parent directory writable by the server?
```

なん・・・だと・・・。画像がアップロードできない。



実はこれ、GCPの公式チュートリアルには載っておらずコマンドラインツールのREADME.mdに書いてあります。

```markdown
Go to the Dashboard at https://PROJECT_ID.appspot.com/wp-admin. On the Plugins page, activate the following plugins:

GCS media plugin
After activating the plugins, try uploading a media object in a new post and confirm the image is uploaded to the GCS bucket by visiting the Google Cloud console's Storage page.
```

https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/appengine/flexible/wordpress



WordPressの管理画面に行って「GCS media plugin」を有効化と設定をする必要あります。

<img width="1503" alt="スクリーンショット 2019-07-08 14.35.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410115/abaec8eb-134d-9bf0-08f9-b1fb6ed8f256.png">




Google Cloud Storage pluginを有効化し、設定をしていきます。

<img width="1271" alt="スクリーンショット 2019-07-08 14.36.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410115/40e80118-b0bf-ba25-bda1-9ebc71a95f16.png">

Bucket name for media upload にGCSバケットの名前を入力し、保存すればオッケーです！



# まとめ

GAEを使うことによって、インフラの知識が無くても、簡単かつ安全にスケーリングできるWordPressサイトを作成出来ます。

今回、スケーリングの詳細設定は行いませんでしたが、ある程度のスパイクが来てもGAEの自動スケーリングが対処してくれます。

良いことづくめですね！GCP万歳！！

# 参考文献

- https://cloud.google.com/php/tutorials/wordpress-app-engine-flexible
- https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/appengine/flexible/wordpress