TiDB Cloudに登録して30分以内にTROCCO®のHTTP・HTTPSコネクタでデータ転送してみた話

# はじめに

[【第一回】激突！データ基盤プロレス大会](https://connpass.com/event/320486/)という、TiDB、Databricks、TROCCO®が参加する謎イベント（笑）に参加していました。そのなかで、TROCCO®はDatabricksがコネクタとして存在しており、転送元／先としてDatabricksのデータ転送ができるのですが、TiDBはできないよねという話がありました。

いや、TiDBはMySQL互換ということなので、MySQLコネクタでできるのでは？と思いながらイベント時間内のタイムアタックに挑戦してみたところ、実はHTTP・HTTPSコネクタで転送元としてデータ転送ができたので、そのときの設定方法について記事にしておきます！

:::note info
- MySQLコネクタでもできました！
[「TROCCO®によるTiDB Cloudからのデータ転送はMySQLコネクタでもできた話」](https://qiita.com/SoySoySoyB/items/f4e21cb813736dec4562)

- データ投入もできました！
[「TROCCO®のMySQLコネクタでTiDB Cloudにデータを投入してみた話」](https://qiita.com/SoySoySoyB/items/4ebe1cd70798bef3eef9)
:::


# TiDBとは

その前に、TiDBとは何かについて簡単に説明しておきましょう。と思ったものの、TiDBの詳しい話は今回のイベントで初めて聞いたので、参加者のツイートで紹介します！

- NewSQLでOLAPとOLAPのハイブリッドで利用可能

https://x.com/foursue/status/1816777792761266527

https://x.com/foursue/status/1816778762694111657

- 加えてMySQL互換で、フルマネージド、スモールスタートが可能

https://x.com/holywater044/status/1816779210771562530

なるほど、なかなか強そうなDBですね。


# TiDBに登録する

[TiDBのHP](https://pingcap.co.jp/tidb/)にアクセスし、右上の「無料で始める」から利用開始できます。データ転送を行うまで、クレジットカードの登録もなく進めることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/bc55e546-f368-f625-f470-46dd3ac0d2f4.png)


# TiDBの設定

## TiDBでデータを準備する

TiDBのコンソールに入ると、自動でClusterというものができています。このなかでデータベースを作成し、テーブルを作っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/a7c921da-7eae-fd6d-3863-69c4771bedc8.png)


ImportでCSVファイルを指定し、データをインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/88169f3b-f9c6-9338-5298-10e1ac89ad26.png)

ファイルをアップロードし、作成するデータベースとテーブルを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/a00cd91c-6556-669a-14b2-0b394e0b9b03.png)

CSVファイルの場合、データを読み取って自動で型定義をしてくれます。なお、Titanicのデータでは、自動定義される型に合わないデータがあり、エラーで困ったので最終的には全部文字列で指定しました。（ここで無駄に時間を食った・・・）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/de188eb3-943a-f090-4888-7e7990cf864d.png)

取込が完了すると、SQL Editorからクエリが叩けるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/0e796e0f-200e-bfa9-9fd1-90e650d2cec9.png)


## Data Serviceを設定する

TiDBにはData Serviceという機能があり、ここでHTTPリクエストに応じてデータを抽出するためのAPIを設計することができます。

> TiDB Cloud Data Service is a fully managed low-code backend-as-a-service solution that simplifies backend application development, empowering developers to rapidly build highly scalable, secure, data-driven applications. Inside Data Services, your journey begins with a Data App, a container hosting REST Endpoints, forming the foundation of your project.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/3b94cbb7-5f59-9e69-7f36-e8c313a09a1c.png)

必要事項を記入して、Data Appを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/783d0b72-c405-5218-6ead-9ea7ea3698c2.png)

Settingsのタブは以下のような形で、ここに記載のあるBase URLがAPIとして叩くときのエンドポイントになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ed740400-fcb9-d045-3d8a-8cf222a9a2b7.png)

左の＋ボタンを押し、Autogenerate Endpointをクリックすることで、具体の設定を作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/b8243e56-1eea-f2d2-b15b-264e4a391f88.png)

こんな画面になるので、Cluster、Database、Tableを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/fdac389b-e13c-b457-d2aa-64e27da0e8bf.png)

勝手にエンドポイントとクエリが設定されます。なにこれ便利。右上のDeployボタンでデプロイします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/34a06a00-cae9-aec7-70d2-d12e593a66cb.png)

これでData Serviceが作成できたので、認証のために再度Settingsの画面に戻り、AuthenticationからCreate API Keyでキーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ed740400-fcb9-d045-3d8a-8cf222a9a2b7.png)

必要事項を記入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/8230f4e9-64b5-407d-4fd6-8484fd551a85.png)

するとKeyが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/de779a6e-efee-7a0d-d248-bb933153a916.png)

これでTiDB側の設定は完了です。


# TROCCO®の設定

転送元HTTP・HTTPSと転送先として送りたいDWHを選択します。

HTTP・HTTPSのURLとして、作成したData Serviceのエンドポイントを記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/e54e985f-a589-cdf0-330c-4c15bccc46ed.png)


入力ファイル形式はJSONPathで、JSONPathとして$.data.rowsを指定します。ヘッダの認証の設定方法は後述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ebeb9a30-9ed7-175e-a6ce-ec3b70c51d8f.png)

TiDBのドキュメントによると、認証方式は下記のようになっています。
> TiDB Cloud Data API は基本認証とダイジェスト認証の両方をサポートします。
> - 基本認証 暗号化されていない Base64 エンコードを使用して、公開キーと秘密キーを送信します。 HTTPS により通信のセキュリティが確保されます。詳細については、 RFC 7617 - 「基本」HTTP 認証スキームを参照してください。
> - ダイジェスト認証 ネットワーク送信前に公開キー、秘密キー、サーバー提供の nonce 値、HTTP メソッド、および要求された URI をハッシュすることにより、追加のセキュリティレイヤーを提供します。これにより、秘密キーが暗号化され、平文で送信されるのを防ぎます。詳細については、 RFC 7616 - HTTP ダイジェスト アクセス認証を参照してください。

出典：[公式ドキュメント「データサービスの API キー」](https://docs.pingcap.com/ja/tidbcloud/data-service-api-key)


今回はひとまず基本認証を利用するので、この形式に合わせてヘッダーで設定する必要があります。ここでの入力形式は下記の通りです。

- キー: `Authorization`
- 値: `Basic {'Public Key:Private Key'をbase64でエンコードしたもの}`

値に入力するテキストを生成するには、'Public Key:Private Key'をTiDB_key.txtに保存し、Windows環境ではコマンドプロンプトで`certutil -f -encode TiDB_key.txt TiDB_key_encoded.txt`というコマンドを叩きます。これで生成されたものを先ほどの値として入力します。

そのほか、転送先の設定は適宜必要事項を入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/11178194-57d4-2a57-5d5b-73ba0d4b7013.png)

先に進むとデータプレビューが表示され、データが適切に取得できていることがわかります。なかなか面白いですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/5973a9f1-7f5d-b6c4-9be2-46e672a9303b.png)

ここに至るまで約30分間でしたが、イベント終了までには間に合いませんでした。残念！


# APIに変数を組み込める

ここまで試していてなにこれすごい！！！と思ったのが、このAPIを生成するときに、クエリに変数を組み込むことができ、HTTPで叩くときにクエリパラメータで指定できるというところです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/e1107d74-eaf2-27c0-db2e-d3299e6a3635.png)

普段使っているAPIをDB側でサクッと作成できるような機能で、非常にわくわくしますね！


## さいごに

1時間くらいでさっと記事にしてみました！個人的にはTiDBの理解も深まりなかなか面白かったですし、みなさんにもご参考いただけると嬉しいです。