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

Zennの記事でPlanetScaleを知る

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

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

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

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

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

https://planetscale.com/blog/introducing-new-planetscale-pricing

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

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

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

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

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

https://crieit.net/posts/Prisma-PlanetScale

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

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

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

  • 例えばWordPressは2020年に対応済み

https://planetscale.com/blog/announcing-vitess-8

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

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

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

https://blog.hidenori.biz/1313

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に対応しているらしい

https://docs.planetscale.com/concepts/database-imports

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と比べて圧倒的に安価に運用できる。

SPAを安全で安価に構築するために、AWS Cognito, Azure AD B2C, Firebase Authentication, SuperTokens, Auth0, を比較する

JWTトークンでの認証をコストを最小化して安全に運用したい

SPAの構築でJWTでの認証をどのように構築するべきか、コストを最小化して運用上のリスクが少ないシステム設計を検証している。

Webで検索したところ、主要な認証サービスについてそれぞれの情報は豊富に見つかるのだが、コストを比較した情報が少なかったので一覧表を作成して備忘録に残します。


JWTトークンを発行する認証サービスを提供している主要サービスの一覧

サービス名 無料プラン 主な料金1 主な料金2 料金情報URL
AWS Cognito UserPool 50000MAUまで無料 10万MAUまで$0.0055/MAU 100万MAUまで$0.0046/MAU https://aws.amazon.com/jp/cognito/pricing/
Microsoft Azure AAD B2C 50000MAUまで無料 PREMIUM P1=$0.00325/MAU(AD登録が必要) PREMIUM P2=$0.01625/MAU(AD登録が必要) https://azure.microsoft.com/en-us/pricing/details/active-directory/external-identities/
Firebase Authentication 10000MAUまで無料 無料枠内でも電話SMS認証は有料$0.06/件 Firebaseの無料枠が利用可能だが、10000MAU内でも無料枠を超えると料金が発生 https://firebase.google.com/pricing
SuperTokens 5000MAUまで無料 5000MAU毎に月$29追加課金 ※OSS版をホスティングすれば継続して無料利用可能 https://supertokens.com/pricing
Auth0 試用期間22日間 ユーザDBなし・1000MAUまで$15/月~ ユーザDBあり・1000MAUまで$49/月~ https://auth0.com/pricing


コストを抑えて運用リスクも低減したい場合

SaaSでの構築運用はAWS CognitoとAzure ADB2Cのコスパが突出している

AWS CognitoとAzure ADB2Cどちらも50000アカウントまで無料利用できてコスパが突出している。但し、Cognitoを使うにはAWSを契約してIAMやSESの知識が必要になるし、AzureADを使う場合はAzureを契約してAD構築と管理の知識が必要になる。
大手クラウドの中ではFirebaseの無料枠はAWSやAzureの1/5しかなく、単位コストも割高なのだが、FirebaseでWebアプリケーションを構築する人はFirebase Authenticationが候補になるだろう。


コスト最小化を優先する場合

SuperTokensだけがOSSで自前でホスティングが可能

候補の中でSuperTokensだけがOSSで自前でもホスティングして構築運用できるので、万全に運用ができるなら、SuperTokensを構築することで無制限に無料でアカウント認証の運用が可能になる。SaaS版でも5000MAUまでなら継続的に無料利用が可能。
但し、SDKはJava,Node.js,Pythonの3種類しか提供されておらず、Node.js系はReactのサンプルが中心なのでOSSを扱うための制約も大きい。更に公開エンドポイントとデータストアも自前管理する必要があるのでリスクも大きくなる。


構築の容易さやSDKやサービスの情報の入手し易さを優先する場合

Auth0であれば大手クラウドサービスに依存せずSDKも殆どのプログラム言語に対応している

コストよりも、大手クラウドサービスに依存せずにJWT認証を簡単に構築したい場合はAuth0が適しているかもしれない。
但し、無料利用枠が実質的に存在しておらず、安価なプランでは1000MAUまでしかサポートされないので、不特定多数へ提供する公開サービスで利用するのはリスクが高い。


まとめ

既に大手のクラウドサービス、AWS Cognito・Azure ADB2C・Firebase Authentication、3社いずれかを使っている場合は利用中のプラットフォームを選択することが最もコスト対効果が高いと思われる。

  • AWS Cognito
    CognitoはAmplifyとIDプールを不自然に推していたので良い印象がないのだが、ユーザープール単体のサービス価格で考えるとコスパは非常に高い。そして全てのプログラム言語のSDKも揃っているしWebから参考情報も得やすい。

  • Azure AD
    AzureもCognitoと同レベルでコスパが高いのだが、AD構築のコストとADの特殊性を理解して導入する必要がある。

  • Firebase Authentication
    良くも悪くもFirebaseの作法に従う必要がある。GCPとの連携も他のサービスよりも有利だが、Google系のサービスでよくある「できそうに見えてできない」事があったり「Googleなのでサポートは一切なし」だったりする場合もある。

  • SuperTokens
    OSSなので独自ホスティングしてゼロコストで構築運用が可能で、OSSをCloneして解析して独自に改良してForkすることもできる。しかし、情報が少ないのでリスクは高い。(※Apache2.0ライセンス)

  • Auth0
    公式の情報が豊富でSaaSとして非常によいサービスなのだが、無料枠がなくて高額な料金と複雑な料金プランしかない点は契約前に確認したほうがいい。1000MAU未満で運用できるなら候補になるかも。

  • 独自実装も場合によって検討する価値はある
    主要なプログラミング言語であればJWTを構築できるパッケージは多数存在しているので、開発チームに余力があるなら独自実装をしてセキュリティの堅牢化や最適化をする選択肢もありえる。


AWS Cognitoで構築するシステム構成案