話題のPlanetScaleを調査して、実際にWP-CLIからWordPress用のDBを構築してみた

Zennの記事でPlanetScaleを知る

以下、Twitterにも投稿した内容ですが、備忘録としてブログにも書きました。

話題のPlanetScaleをAWS Lambdaから使ってみた

https://zenn.dev/taroman_zenn/articles/3d03c3030e3bf2

SaaS提供のMySQLについての記事でAWSのRDSと比較すると十分に代替になりそう。

しかも破壊的な価格設定で、
フルマネージドでスケーラブルなMySQLが10GBまで無料。

New PlanetScale pricing: Scaler plan upgrades and our new enterprise plan
We've updated our database plans to better meet your needs

他社のDB事業を破壊したAWSが追われる立場になるかもしれない。

Zennの記事では分からない注意点

LambdaやコンテナからRDBへ接続した時の不整合対策について

注意点として、LambdaやコンテナからRDBへ接続した時の不整合対策について触れられていない点が気になるのだが。

別のブログによるとPlanetScaleのMySQLは外部キーが使えないらしい

PrismaでPlanetScaleを使う時のエラーあれこれ - Crieit
PrismaをPlanetScaleで実際に利用している時にいくつかエラーが発生したのでその対処など。 routines:tls_process_server_certificate:certificate verify faile...

リレーションのないRDB=ほぼKVSですね。

リレーションの制限があるがWordPressにも対応している

PlanetScaleのMySQLはVitessという独自DBで、外部キーが必要な処理はアプリケーション単位で個別対応している。

  • 例えばWordPressは2020年に対応済み
Announcing Vitess 8.0
On behalf of the Vitess maintainers team, I am pleased to announce the general availability of Vitess 8 for MySQL.

コスパ重視でRDBを構築するなら

結局のところ、コスパ重視でRDBを構築するならSSDベースのVPSでMySQL専用のインスタンスを立ち上げるのがベストのように思える

MySQL5.7系のRDSをVPS上のMySQL8へリプレイスした備忘録

mysql5.7系のRDSをVPS上のmysql8へリプレイスした備忘録
目的MySQL5系のシステムをMySQL8系へ移行する後述するが、MySQL8は5.7から大幅に仕様が変更されていて、特にリモート接続で利用するときに従来にない追加の設定が必要になる。これまでMySQL5.7を採用して運用してきたが、MyS

PlanetScaleはWordPressのような特定用途や、SPAでKVS的に使うには貴重なSaaSになりそう。

検証していないけれど組み合わせで出来そうなこと

Heroku + PlanetScale

どちらも無料プランの範囲であれば恒久的に無料で利用し続けることができる組み合わせ。
特にWordPressを構築した場合は、Heroku無料プランの弱点であるメモリの少なさをカバーしてCrearDBにも依存せずに運用できる。

HerokuはRDS等の外部のMySQLへ接続する情報も多数出ており、PlanetScaleをMySQL用のアダプタで接続するハードルは低いと思うのだが。無料のHerokuはメモリ512MBしか使えないことや、ClearDBを前提にしているので外部への接続に制限があるかもしれないので、構築する場合は自己責任でお願いいたします。

WordPress用のVitess設定例

PlanetScaleの事例は見つからなかったのだが、PlanetScaleの中身のVitessデータベースをWordPressで使う記事を見つけたので、参考にさせて頂きたいと思う

アプリケーション側(WordPress)のインスタンス側に以下の環境変数を設定すればVitessが対応することになっているらしい。

https://blog.1q77.com/2020/02/wordpress-with-vitess/

※例にあるVitessの仕様がPlanetScaleに反映されているのかどうかは不明


実際にPlanetScaleでWordPressが使えるのか検証してみる

  • planetscale.comでアカウントを作成し、Web画面からデータベースを作成する

    サインアップは無料で、以下のMySQLへの接続情報が手に入る

    • HOST
    • USERNAME
    • PASSWORD
    • DATABASE

mysqlclientとMySQLWorkbenchで接続できることを確認

mysql8のmysqlclientを使用してmy.cnf内で鍵交換を必須に設定して、
PlanetScaleで取得したホストとユーザーとパスワード、データベースを指定すれば容易に接続できる。

mysql -D database_name -h xxxxxxxxxxxx.us-west-2.psdb.cloud -u xxxxxxxxxxxx -p

wp-cliを使ってWordPressを構築する

PlanetScaleでWordPressを構築できるかどうか、wp-cliを使った一般的な手順で試してみた。
検証した環境はUbuntu20.04のVPS環境なので、WindowsのWSL環境やVirtualBoxのUbuntu環境でも同様に構築できる筈です。

※以降は参考までに、ubuntuを前提にwww-dataユーザーで実行する例

  • wp-cliのWordPressの"wp core download"でassetをダウンロードして配置する
export wpdir="myblog"
export dbname="dbname"
export sitename="blog.example.com"
sudo -u www-data wp core download --locale=ja --path="/var/www/$wpdir"
  • wp-cliの"wp core config"でWordPress設定の初期化
sudo -u www-data wp core config --dbname=$dbname --dbuser=xxxxxxxxxxxx --dbpass='pscale_pw_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' --dbhost=xxxxxxxxxxxx.us-west-2.psdb.cloud --dbprefix=wp_ --path=/var/www/$wpdir

以上の処理でwp-config.phpが生成される。

次の処理でPlanetScale上のDBに情報を書き込むのだが、wp-config.phpでSSL/TLS接続を強制する設定が必要になる。

  • wp-config.phpを編集して

    sudo vim /var/www/$wpdir/wp-config.php
    
  • 以下のオプションを追加する

    #define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
    

PlanetScaleのDBへWordPressの情報を書き込む

  • wp-cliの"wp core install"でインストールする
sudo -u www-data wp core install --url=http://localhost/ --title=$sitename --admin_user=xxxxxxxx --admin_password=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --admin_email="xxxx@gmail.com" --path=/var/www/$wpdir 

ここまでは順調に進める事ができるのだが、PlanetScaleのWeb管理画面で作成したDBのCharsetはutf8がデフォルトで、utf8mb4へ変更することができないことに気付いた。


PlanetScale自体はutf8mb4に対応しているらしい

Database Imports - Documentation - PlanetScale
Import your data from an external MySQL database into your PlanetScale database.

PlanetScale supports the following charsets: utf8, utf8mb4, utf8mb3. If your table uses any other charset, please consult the official MySQL documentation about charsets.


Databaseをutf8mb4に変更する項目が見当たらない

  • Alter database でutf8mb4へ変更すると1235エラーになるが、内部的には変更できているように見える
    show create database database_name;
    
  • DBを作り直してもcharsetを設定する項目はない
  • 絵文字や特殊文字を無視するなら、utf8のままWordPressを運用しても問題はない
  • Alter tableで個別にutf8mb4に設定することはできるので、念のために設定した方がいいかも
  • PlanetScale専用のCLIツールを利用すれば設定できるかもしれないが、そこまでは検証していない



構築完了

前述のような文字コードの懸念はあったのだが、通常のWordPressと同じようにnginxやapacheを設定すればエラーもなく構築することができた。

wordpress-with-planetscale

そして、構築後にアプリケーション側(WordPress)から見たPlanetScaleのMySQLデータベースの文字コードは

utf8mb4_unicode_520_ci

として表示されている。


まとめ

  • 外部キーが使えないDBと聞いて身構えていたのだが、概ね普通のWordPressの構築手順で問題なく設定できる
  • 今回は検証用のWordPressを構築したのだが、高性能なので本番運用のDBに使わないと勿体ないかもしれない
  • ただ、WordPressを構築できる手順が明確化されていれば、そういう需要は大きいように思える
  • 接続情報はMySQL8相当のsha2化したTLS接続が必須なので最低限のセキュリティも担保できる
  • セキュリティを考慮すると、PlanetScale側でクライアントの接続制限ができると良いのだが、MySQL8用の独自鍵での認証やFirewall的なIP制限、MySQLのGrant設定はできなかった(※何らかの方法があるのかもしれない)
  • SPAアプリケーションからPlanetScaleをKVS的に利用する場合でも、MySQLの運用ノウハウやツールが利用できるのはコスト効果が高い
  • 保存容量が10GBを超えた場合の有料プランは月額$29(※25GBを超過すると1GBあたり$1.25)で、MySQLとしては高いとも安いとも言えない価格だが。フルマネージドでスケーラブルなSaaSでKVSとしても使えるMySQLだと考えると、AWSやAzure,GCPと比べて圧倒的に安価に運用できる。