今天目標是將 MySQL 建立起來,這邊我是用最簡單的 module 建立的。要注意 GCP 的 SQL 預設是會給予 Public IP,但儘管是 Public ,你一樣可以用 authorization 的方式限定取用的 SA。如果你想要只保持私人 IP,你可以設定 ipv4_enabled = false
module "safer-mysql-db" {
source = "terraform-google-modules/sql-db/google//modules/mysql"
version = "~> 21.0"
project_id = var.project_id
region = var.region
name = local.resource_names.sql
random_instance_name = true
deletion_protection = false
database_version = "MYSQL_8_0"
zone = "asia-east1-c"
tier = "db-n1-standard-1"
# ssl = false
ip_configuration = {
require_ssl = false # 設置為 false 允許非 SSL 連接
private_network = module.vpc.network_self_link
allocated_ip_range = module.private-service-access.google_compute_global_address_name
enable_private_path_for_google_cloud_services = true
ipv4_enabled = false // 關閉 IPv4(public ip)
authorized_networks = [] # 如果需要,可以在這裡添加授權網絡
}
# // Cloud SQL proxy.
additional_users = [
{
name = "alvinlin"
password = "123123"
host = "%"
type = "BUILT_IN"
random_password = false
},
]
// Optional: used to enforce ordering in the creation of resources.
module_depends_on = [module.private-service-access.peering_completed]
}
測試方法一樣是進入有 IPA 的 Instance,然後進行連線測試,這邊連線是直接使用 telnet,如果你看到 Connected to xxx,代表可以連線。
gcloud compute ssh bi-portal-test-vm-alvin \
--project=xxx \
--zone=asia-east1-a \
--tunnel-through-iap;
telnet 10.89.0.5 3306
Trying 10.89.0.5...
Connected to 10.89.0.5.
然後你可以使用 mysql -h -p,然後輸入密碼,帳密是剛剛設定的
additional_users = [
{
name = "alvinlin"
password = "xxxx"
host = "%"
type = "BUILT_IN"
random_password = false
},
]
要注意不要被 GPT 騙而設定到 host
"localhost"。這意味著該用戶只能從數據庫服務器本身進行本地連接,而不能從其他機器(如您的 VM)進行遠程連接。可惡!
還有就是 GCP 在 console 有很貼心的幫你建立一套工具叫 connectivity tests ,可以進行連線測試。這東西在 redis 的測試上省了很多時間。但是當你在測試 SQL,且你是走 direct access 的時候,他是一坨大便。我一直跑不過,然後跑出下圖。
但是我實際上新的 image 做連線測試,其實是可行的。多浪費我三個多小時排查防火墻,亙。
func initDB() {
dbHost := os.Getenv("DB_HOST")
if dbHost == "" {
dbHost = "10.89.0.8"
}
dbUser := os.Getenv("DB_USER")
if dbUser == "" {
dbUser = "xxxxx"
}
dbPass := os.Getenv("DB_PASSWORD")
if dbPass == "" {
dbPass = "123123"
}
dbName := os.Getenv("DB_NAME")
if dbName == "" {
dbName = "default" // 請替換為實際的數據庫名稱
}
dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", dbUser, dbPass, dbHost, dbName)
var err error
db, err = sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("Error opening database connection: %v", err)
}
// 測試數據庫連接
err = db.Ping()
if err != nil {
log.Fatalf("Error connecting to the database: %v", err)
}
log.Println("Successfully connected to the database")