通常はrds proxyを介してRDSに接続を行っていたが、今回はrds proxyを介さずに直接RDSに接続を行った。
その際に、
failed to initialize database, got error tls: failed to verify certificate: x509: certificate signed by unknown authority
が発生した。
これを解決するために以下公式ドキュメントを参照して証明書バンドルをインストールした。
自身のリージョンによる証明書のバンドルをダウンロードし、作業ディレクトリに配置する。
CA証明書を読み込み、カスタムTLS設定に登録を行う。
import (
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"log"
"sample/domain"
"sample/handler"
mysqlDriver "github.com/go-sql-driver/mysql"
"github.com/labstack/echo/v4"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// DSN(Data Source Name)の作成
dsn := "sample_user:sampleHogeHoge@tcp(XXXXX-instance-1.hogehogehoge.ap-northeast-1.rds.amazonaws.com:3306)/mydb?tls=custom&allowCleartextPasswords=true&parseTime=true&loc=Asia%2FTokyo"
// CA証明書を読み込む
rootCertPool := x509.NewCertPool()
pem, err := ioutil.ReadFile("../ap-northeast-1-bundle.pem") // ダウンロードした証明書のパスに変更
if err != nil {
log.Fatal(err)
}
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
log.Fatal("Failed to append PEM.")
}
// カスタムTLS設定を登録
err = mysqlDriver.RegisterTLSConfig("custom", &tls.Config{
RootCAs: rootCertPool,
})
if err != nil {
log.Fatal(err)
}
fmt.Println(dsn)
// データベースに接続
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("データベースへの接続に失敗しました")
}
// Userテーブルの自動マイグレーション
db.AutoMigrate(&domain.User{}, &domain.Article{})
// Echo インスタンスの作成
e := NewEchoRouter(db)
// サーバーの起動
e.Logger.Fatal(e.Start(":8080"))
}
その後にいつも通りにDB接続する処理を行うことで接続することができた。
DSNについては
tls=true
としていた設定を
tls=custom
と変更することで先ほど行った設定に則って接続を行ってくれる。
(tls=trueの設定の場合、デフォルトの認証局を使用する設定となる)