nato243 weblog.n-jitter brand iconweblog.n-jitter
テクノロジー

GoからTiDB ServerlessにつなぐときのParamsに注意

2024.11.23
TiDB Cloud ServerlessGolang

TiDB Cloud ServerlessはMySQL5.7互換のNew SQL DBです。
Goのmysql-driverから接続したときにTLS設定で怒られたのでメモ。

Error 1105: Connections using insecure transport are prohibited. See https://docs.pingcap.com/tidbcloud/secure-connections-to-serverless-tier-clusters

mysql.ConfigParams map[string]string が生えてるはずなので、そこに "tls" : "true"を適切に渡す必要がある。
うちだとラッパー書いてるのでこんな感じ

func createDao(conf config.Database) DB {
	mysqlConf := mysql.Config{
		User:                 conf.User,
		Passwd:               conf.Password,
		Net:                  conf.Net,
		Addr:                 conf.Addr,
		DBName:               conf.DBName,
		ParseTime:            true,
		Loc:                  conf.Location.GetTimeLocation(),
		AllowNativePasswords: true, 
		Params:               conf.Params, //++
	}

	dsn := mysqlConf.FormatDSN()
	gormDB, err := gorm.Open(conf.Dialect, dsn)
	if err != nil {
		log.Error(err)
		log.Panicf("DB connection failed. (%s)", conf.Name)
	}
	log.Debugf("DB connected. (%s)", conf.Name)
	c := []config.Database{
		{
			Name:                  "tidb-serverless",
			Dialect:               "mysql",
			Role:                  "master",
			Addr:                  fmt.Sprintf("%s:%s", conf.SecretEnv.DBHost, conf.SecretEnv.DBPort),
			DBName:                conf.SecretEnv.DBName,
			User:                  conf.SecretEnv.DBUser,
			Password:              conf.SecretEnv.DBPassword,
			Net:                   `tcp`,
			Location:              "UTC",
			MaxConnections:        10,
			MaxIdleConnections:    10,
			ConnectionMaxLifeTime: 120,
			Logging:               false,
			Params: map[string]string{
				"tls": "true",
			},
		},
	}

ローカルPCのmysql clientやSequelからは普通につながっていたのでちょっとハマったが、TLS設定をクライアント側がいい感じにやっていてくれたんだろう。