なぜやったのか
元々はさくらのVPSの安価なプランにWordPressを乗っけてサービスを運用していましたが、
アクセス数の急増により、プラン変更かサーバー移行の選択を迫られました。
なるべく無停止かつ安全にスケーリングしたいので、GCPのApp Engine(以下、GAE)を採用しました。
(さくらのVPSだとインスタンスを停止しないとプラン変更できない)
対象となる人
WordPressをGAE Flexible乗せたい人
GAEに乗せたものの、画像アップロードに失敗する人
やること
GAEにWordPressを載せる
やらないこと
スケーリングの設定
前提条件
- Composerインストール
- GCPプロジェクトの作成
- プロジェクトでの請求を有効にする
- Cloud SQL API の有効化
- Google Cloud SDKのインストール
- MySQL-Clientコマンドラインツールのインストール
プロジェクトの準備
Google Cloud SDKの初期設定を行います。適切なプロジェクトとアカウントを設定します。
$ gcloud init
プロジェクト内にApp Engineアプリケーションを作成します。
$ gcloud app create
WordPressから上げたファイルや画像を保存できるようにGCSバケットの設定をします。
$ gsutil defacl ch -u AllUsers:R gs://YOUR_PROJECT_ID.appspot.com
Cloud SQLインスタンス作成
記事やサイト情報を保存するためのDBはCloud SQLです。
ここでは wp
をリソース名に使用していきます。
Cloud SQLの第2世代インスタンスを作成します。
パスワードは強固なものにしましょう。
$ gcloud sql users set-password root --host=% \
--instance wp --password=YOUR_INSTANCE_ROOT_PASSWORD
このMySQLインスタンスにアクセスするには、Cloud SQL Proxyを使用します。
Cloud SQL Proxyのインストール方法は少し複雑ですのでここでは参考URLだけとし、割愛させて頂きます。
「プロキシを使用して外部アプリケーションから接続する」1. ~ 4.を行ってください。
プロキシを実行しましょう。
鍵を作成していない場合は -credential_fileオプションは不要です。
$ ./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サーバー立てた時と同じようにアクセスができるようになります。
$ mysql -h 127.0.0.1 -u root -p
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> 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を乗せる為のコマンドラインツールが公式で配布されていますので、こちらを使っていきます。
リポジトリのクローンをします。
$ git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
WordPressのサンプルの場所まで移動します。
$ cd php-docs-samples/appengine/flexible/wordpress
Composerで必要なライブラリをインストールします。
$ composer install
GAE用に変換してくれるスクリプトがあるので、自身の環境のパラメータを併せ込んで実行します。
$ 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プロジェクトディレクトリに移動します。
$ cd wordpress-project
さあ、いよいよデプロイです。5~10分ほど時間が掛かりますので、ティーでも嗜みながら待ちましょう。
$ gcloud app deploy \
--promote --stop-previous-version app.yaml cron.yaml
デプロイが完了すると、実際にアクセスできるようになっています。
https://[YOUR_PROJECT_ID].appspot.com
これでGAEにWordPressを乗っけることができました。やったね!
よ〜し、画像もアップロードしてイケイケな記事を書くぞ〜〜〜〜。
Unable to create directory wp-content/uploads/2019/07. Is its parent directory writable by the server?
なん・・・だと・・・。画像がアップロードできない。
実はこれ、GCPの公式チュートリアルには載っておらずコマンドラインツールのREADME.mdに書いてあります。
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.
WordPressの管理画面に行って「GCS media plugin」を有効化と設定をする必要あります。
![スクリーンショット 2019-07-08 14.35.48.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F410115%2Fabaec8eb-134d-9bf0-08f9-b1fb6ed8f256.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=988c09745cee69920990072415d671d3)
Google Cloud Storage pluginを有効化し、設定をしていきます。
![スクリーンショット 2019-07-08 14.36.44.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F410115%2F40e80118-b0bf-ba25-bda1-9ebc71a95f16.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=12c9818fc9ee39879baa3b3a7764651a)
Bucket name for media upload にGCSバケットの名前を入力し、保存すればオッケーです!
まとめ
GAEを使うことによって、インフラの知識が無くても、簡単かつ安全にスケーリングできるWordPressサイトを作成出来ます。
今回、スケーリングの詳細設定は行いませんでしたが、ある程度のスパイクが来てもGAEの自動スケーリングが対処してくれます。
良いことづくめですね!GCP万歳!!