なぜやったのか
元々はさくらの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」を有効化と設定をする必要あります。
Google Cloud Storage pluginを有効化し、設定をしていきます。
Bucket name for media upload にGCSバケットの名前を入力し、保存すればオッケーです!
まとめ
GAEを使うことによって、インフラの知識が無くても、簡単かつ安全にスケーリングできるWordPressサイトを作成出来ます。
今回、スケーリングの詳細設定は行いませんでしたが、ある程度のスパイクが来てもGAEの自動スケーリングが対処してくれます。
良いことづくめですね!GCP万歳!!