Lambda(Go)でTiDB Cloud(Serverless)にSQLを実行してみた

2023.06.30

こんにちは、ゲームソリューショングループのsoraです。
今回は、Lambda(Go)でTiDB Cloud(Serverless)にSQLを実行してみたことについて書いていきます。

はじめに

TiDBはクラウドネイティブな分散型のNewSQLデータベースです。
TiDB CloudはTiDBをフルマネージドでクラウド上で使えるサービスです。
詳細については、以下記事をご参照ください。

TiDB Cloudでの接続準備

データインポート

ClusterはServerlessで既に起動していることとして、そのClusterにテスト用のデータをインポートします。
Clusterを選択>Importで、CSVファイルやS3からデータをアップロードしてデータのインポートができます。
今回は以下のCSVファイルをインポートしました。

prefectual.csv

prefecturename,prefecturalcapital,region
Hokkaido,Sapporo,Hokkaido
Tokyo,Tokyo,Kanto
Aichi,Nagoya,Chubu
Osaka,Osaka,Kansai
Hukuoka,Hakata,Kyushu

インポートすると、カラム名やデータタイプ、プライマリーキーの確認が出てきます。
選択した後に[Start Import]を押下すると、インポートが始まります。 Chat2QueryにてSQLで確認すると正常にインポートされていることが確認できます。

接続情報取得

接続するためのコードは、Clusterを選択>Connectで確認することができます。
今回はLambda(Go)から接続するため、Connect WithでGoを選択しています。
このコードはLambdaにて使用するため、メモしておきます。

Lambda作成

次にLambdaを作成します。
先ほど取得した接続情報を使ってDBに接続し、SELECTを実行しています。

tidb-operation.go

package main

import(
	"database/sql"
	"github.com/go-sql-driver/mysql"
    "github.com/aws/aws-lambda-go/lambda"
	"fmt"
	"crypto/tls"
)

func TiDBOperation() () {
	// TiDBへの接続
	mysql.RegisterTLSConfig("tidb", &tls.Config{
		MinVersion: tls.VersionTLS12,
		ServerName: "[TiDB Cloudで表示された接続コード]",
	})
	db, err := sql.Open("mysql", "[TiDB Cloudで表示された接続コード]")
	if err != nil {
		fmt.Println("DB connection error")
	}
	defer db.Close()

  // SQL実行
	rows, err := db.Query("SELECT * from PrefecturesTable")
	if err != nil {
		fmt.Println("SQL error")
	}
	defer rows.Close()

	fmt.Println("都道府県名, 県庁所在地, 地域")
	for rows.Next() {
		var prefecturename, prefecturalcapital, region string
		err := rows.Scan(&prefecturename, &prefecturalcapital, ®ion)
		if err != nil {
			fmt.Println("Scan error")
			return
		}
		fmt.Printf("%s, %s, %s\n", prefecturename, prefecturalcapital, region)
	}
}

func main() {
    lambda.Start(TiDBOperation)
}

LambdaからTiDB Cloud上のDBへ接続

Lambdaを実行してデータベース内のデータが返ってくることを確認できました。

最後に

今回は、Lambda(Go)でTiDB Cloud(Serverless)にSQLを実行してみたことを記事にしました。
どなたかの参考になると幸いです。