Zennの記事でPlanetScaleを知る
以下、Twitterにも投稿した内容ですが、備忘録としてブログにも書きました。
話題のPlanetScaleをAWS Lambdaから使ってみた
https://zenn.dev/taroman_zenn/articles/3d03c3030e3bf2
SaaS提供のMySQLについての記事でAWSのRDSと比較すると十分に代替になりそう。
しかも破壊的な価格設定で、
フルマネージドでスケーラブルなMySQLが10GBまで無料。
他社のDB事業を破壊したAWSが追われる立場になるかもしれない。
Zennの記事では分からない注意点
LambdaやコンテナからRDBへ接続した時の不整合対策について
注意点として、LambdaやコンテナからRDBへ接続した時の不整合対策について触れられていない点が気になるのだが。
別のブログによるとPlanetScaleのMySQLは外部キーが使えないらしい
リレーションのないRDB=ほぼKVSですね。
リレーションの制限があるがWordPressにも対応している
PlanetScaleのMySQLはVitessという独自DBで、外部キーが必要な処理はアプリケーション単位で個別対応している。
- 例えばWordPressは2020年に対応済み
コスパ重視でRDBを構築するなら
結局のところ、コスパ重視でRDBを構築するならSSDベースのVPSでMySQL専用のインスタンスを立ち上げるのがベストのように思える
MySQL5.7系のRDSをVPS上のMySQL8へリプレイスした備忘録
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が対応することになっているらしい。
※例にある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に対応しているらしい
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)から見た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と比べて圧倒的に安価に運用できる。