PlanetScaleのエミュレートサービスとしてServerless MySQL HTTP(SMH)を作った話
はじめに
PlanetScaleというサーバーレスのMySQLサービスがあり、利用してみることにした。しかしPlanetScaleには、AWSのLocalStackやFirebaseのFirebase Local Emulator Suiteのような、いわゆるローカルの開発環境向けのエミュレートサービスがないみたいだった。。。
そこで、ないなら作ろう!という事で、今回Serverless MySQL HTTP(SMH)を作ってみたので、それについて取り上げたいと思う。
PlanetScaleとは?
他の方の記事が参考になると思います。
今回作ったServerless MySQL HTTP(SMH)について
PlaneScaleでは@planetscale/databaseというライブラリを利用することで、HTTPリクエストでPlanetScaleに対してリクエストを送り、データベースの操作ができる。
@planetscale/databaseを利用することで、エッジ環境でもPlanetScaleが利用できる反面、普段MySQLを利用しているときの開発手法が利用できないデメリットがある。
具体的には、基本的にMySQLを利用しているアプリであれば、DockerなどでMySQLサーバーをローカル環境で立てて、プロダクション環境のMySQL[1]には接続することなく開発を行うと思う。しかし、@planetscale/databaseを利用する場合、HTTPでPlanetScaleにリクエストをするため、そのリクエストをローカル環境のMySQLに向けても動作しない(以下の図のようにプロトコルが違う)。
そのため、HTTPリクエストをMySQLプロトコルに変換する(プロキシする)ようなサービスが必要になる。そのサービスがServerless MySQL HTTP(SMH)になる。
このサービスを利用することで、以下の図のようにPlanetScaleへのHTTPリクエストをSMHが受け取り、それをMySQLプロトコルに変換してくれる。それにより、@planetscale/databaseを利用していても、ローカル環境のMySQLで開発をすることができるようになる。
Serverless MySQL HTTP(SMH)自体はDockerイメージとして利用できるようにしています。
※上記の内容の通り、今回開発したSMHはPlanetScale serverless driver for JavaScriptでのPlanetScaleを利用する場合を対象にしている。
仕組みやポイントになった部分について
仕組み
仕組みはかなりシンプルで、SMHはHTTPリクエストを受け取るNode.jsのExpressサーバーとして実装している。そのエンドポイントでnode-mysql2を利用してMySQLに対してSQLをクエリしている。HTTPレスポンスは@planetscale/databaseが要求する形にコンバートする必要があるので、そこは少し実装する上でポイントになった。
ポイント
PlanetScaleは実は完全なMySQLではない[2]ので、型が若干違う。その型の返還についてはMySQLの型をVitessの型に変更する処理を実装して対応した。
また、@planetscale/databaseではHTTPのリクエストボディー・レスポンスボディーがBase64でエンコードされているようなので、そのあたりの対応もポイントになっている。
まとめとして
PlanetScaleを利用する際に、ローカルの開発環境に閉じて(本番サービスに接続せずに)開発できるようにするためのサービスとしてServerless MySQL HTTP(SMH)を開発したことを紹介させていただいた。やはり、ローカルの開発環境からは本番サービスに接続したくないという事はあると思う(そうでなければLocalStackやFirebase Local Emulator Suiteは開発されなかったと思う)ので、今回開発したServerless MySQL HTTP(SMH)がどなたかの役に立てばいいなと思っている。
-
AWSのRDSやAurora、AzureのAzure Database for MySQL、GCPのCloud SQL for MySQLなど ↩︎
-
Vitess(https://planetscale.com/vitess ) ↩︎
Discussion