はじめに
TiDBというMySQL互換のサービスがあり、それをserverless driverで利用してみることにした。しかしTiDBには、AWSのLocalStackやFirebaseのFirebase Local Emulator Suiteのような、いわゆるローカルの開発環境におけるserverless driver向けのエミュレートサービスがないみたいだった。
そこで、ないなら作ろう!という事で、今回Serverless MySQL HTTP(SMH)を作ってみたので、それについて取り上げたいと思う。
※TiDBのserverless driverはEdge環境(Cloudflare WorkersやVercel Edge Functionsで利用される)
TiDBとは?
以下のサイト等がわかりやすいかと思います。
今回作ったServerless MySQL HTTP(SMH)について
TiDBでは@tidbcloud/serverlessというライブラリを利用することで、HTTPリクエストでTiDBに対してリクエストを送り、データベースの操作ができる。
@tidbcloud/serverlessを利用することで、エッジ環境でもTiDBが利用できる反面、普段MySQLを利用しているときの開発手法が利用できないデメリットに直面する。
具体的には、基本的にMySQLを利用しているアプリであれば、DockerなどでMySQLサーバーをローカル環境で立てて、プロダクション環境のMySQL1には接続することなく開発を行うと思う。しかし、@tidbcloud/serverlessを利用する場合、HTTPでTiDBにリクエストをするため、そのリクエストをローカル環境のMySQLに向けても動作しない(以下の図のようにプロトコルが違う)。
そのため、HTTPリクエストをMySQLプロトコルに変換する(プロキシする)ようなサービスが必要になる。そのサービスがServerless MySQL HTTP(SMH)になる。
このサービスを利用することで、以下の図のようにTiDBへのHTTPリクエストをSMHが受け取り、それをMySQLプロトコルに変換してくれる。それにより、@tidbcloud/serverlessを利用していても、ローカル環境のMySQLで開発をすることができるようになる。
Serverless MySQL HTTP(SMH)自体はDockerイメージとして利用できるようにしています。
※上記の内容の通り、今回開発したSMHはTiDB Cloud Serverless Driver (Beta)でのTiDBを利用する場合を対象にしている。また、TiDBのserverless driverもサポートしている。
仕組みについて
仕組みはかなりシンプルで、SMHはHTTPリクエストを受け取るNode.jsのExpressサーバーとして実装している。そのエンドポイントでnode-mysql2を利用してMySQLに対してSQLをクエリしている。HTTPレスポンスは@tidbcloud/serverlessが要求する形にコンバートする必要があるので、そこは少し実装する上でポイントになった。
まとめとして
TiDBを利用する際に、ローカルの開発環境に閉じて(本番サービスに接続せず)開発できるようにするためのサービスとして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など ↩