🚀

PlanetScaleのエミュレートサービスとしてServerless MySQL HTTP(SMH)を作った話

2023/11/27に公開

はじめに

PlanetScaleというサーバーレスのMySQLサービスがあり、利用してみることにした。しかしPlanetScaleには、AWSのLocalStackやFirebaseのFirebase Local Emulator Suiteのような、いわゆるローカルの開発環境向けのエミュレートサービスがないみたいだった。。。

そこで、ないなら作ろう!という事で、今回Serverless MySQL HTTP(SMH)を作ってみたので、それについて取り上げたいと思う。

https://github.com/yutak23/serverless-mysql-http

PlanetScaleとは?

他の方の記事が参考になると思います。

https://qiita.com/tak001/items/cfbaa9dcb542929ff235

今回作った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イメージとして利用できるようにしています。

https://hub.docker.com/r/yutak23/serverless-mysql-http

※上記の内容の通り、今回開発した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)がどなたかの役に立てばいいなと思っている。

脚注
  1. AWSのRDSやAurora、AzureのAzure Database for MySQL、GCPのCloud SQL for MySQLなど ↩︎

  2. Vitess(https://planetscale.com/vitess↩︎

Discussion