Closed6

node-mysql2からTiDB Serverlessへの接続について (解決済み)

bohnenbohnen

リポジトリにある .env.example をコピーして、.env を作成。内容をTiDB Serverlessの接続画面に合わせて修正。

# (Option 1) Connect to TiDB cluster with connection options
TIDB_HOST='{host}'
TIDB_PORT='4000'
TIDB_USER='{user}'
TIDB_PASSWORD='{password}'
TIDB_DATABASE='test'
# Weather enable TLS (SSL) connection. (**MUST** set up to `true` for connecting TiDB Serverless Cluster via Public Endpoint)
TIDB_ENABLE_SSL='false' # ここはtrueにする

# Provide SSL CA certificate to overwrite the default CA certificate. (Optional for TiDB Serverless Cluster)
# TIDB_CA_PATH='/path/to/ca.pem'

Serverlessでは TIDB_CA_PATH は設定しなくても良いようだ。

bohnenbohnen

src/index.js の49行のsslを修正。ここに 'Amazon RDS' と書くとAmazon RDSのCAが設定され、オブジェクトを設定するとそれを使うようだ。

        const options = {
            host: process.env.TIDB_HOST || '127.0.0.1',
            port: process.env.TIDB_PORT || 4000,
            user: process.env.TIDB_USER || 'root',
            password: process.env.TIDB_PASSWORD || '',
            database: process.env.TIDB_DATABASE || 'test',
            ssl: process.env.TIDB_ENABLE_SSL === 'true' ? {
                minVersion: 'TLSv1.2',
                ca: process.env.TIDB_CA_PATH ? fs.readFileSync(process.env.TIDB_CA_PATH) : undefined
            } : null,
            // ssl: 'Amazon RDS',
        }
bohnenbohnen

sslを'Amazon RDS'に設定して実行。接続に失敗する。

> npm start

> tidb-nodejs-mysql2-quickstart@1.0.0 start
> node src/index.js

file:///Users/bohnen/Project/Twitter/tidb-nodejs-mysql2-quickstart/src/index.js:59
        throw new Error(`Failed to connect to TiDB cluster: ${err.message}`);
              ^
Error: Failed to connect to TiDB cluster: unable to get local issuer certificate
    at connectWithOptions (file:///Users/bohnen/Project/Twitter/tidb-nodejs-mysql2-quickstart/src/index.js:59:15)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async main (file:///Users/bohnen/Project/Twitter/tidb-nodejs-mysql2-quickstart/src/index.js:159:68)

Node.js v18.15.0
bohnenbohnen

デフォルトに戻して実行。試して見たところ、デフォルトの記載(CAをファイルから読み込む、今回はファイルを設定していないのでundefined)でも、ssl:{} としてもOK。空のオブジェクトを指定した場合どうなるかだが、これは最終的にはnodejsのtlsパッケージのssl接続の実装に行き着いて、デフォルトではMozillaのCAを利用すると記載があった。MozillaのCAはLet's EncryptのCAを含むよく使われるCAを含むため、空オブジェクトを指定しても問題ないはずだ。

> npm start

> tidb-nodejs-mysql2-quickstart@1.0.0 start
> node src/index.js

🔌 Connected to TiDB cluster! (TiDB version: 5.7.28-TiDB-v7.1.1-serverless)
⏳  Loading sample game data...
✅  Loaded sample game data.

🆕 Created a new player with ID 12.
ℹ️ Got Player 12: Player { id: 12, coins: 100, goods: 100 }
🔢 Added 50 coins and 50 goods to player 12, updated 1 row.
🚮 Deleted 1 player data.
このスクラップは2ヶ月前にクローズされました