iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
自我挑戰組

和AI學習gcp - 建立對話代理系列 第 8

Day 8 Cloud SQL 與 GCS

  • 分享至 

  • xImage
  •  

Cloud SQL 為全託管式關聯式資料庫 同時支援三種引擎 MySQL, PostgreSQL, SQL Server, 並且同時支援關聯式與向量搜尋 不用兩處查詢後合併, 我們在之後會用來進行語意查詢

GCS(gogle cloud storage)則是存放靜態檔案的檔案櫃, 類似aws的s3

Cloud SQL收費

Cloud SQL 是按**「租用資源」**計費,只要執行個體運行中就要收費。

  • 執行個體費用 (Instance):根據你選的 CPU 和 記憶體大小(vCPU & RAM)按小時計費。
    • 省錢攻略:POC 階段選最小的 db-f1-microdb-custom-1-3840 即可。
  • 儲存空間費用 (Storage):根據你配置的硬碟大小(GB)計費。
    • 特性:它是按「配置量」收費,如果你設 10GB,即便只存 1MB,也會收 10GB 的錢。
  • IP 費用
    • 公網 IP:如果開啟公網存取且沒在使用,會收一個小額費用。
    • 私有 IP (我們的方案):走內網不額外收 IP 租借費。

總結: Cloud SQL 是你專案中最固定的成本開銷(每個月約 $10~30 USD 起,視規格而定)。

GCS收費

GCS 是按**「使用量」**計費,就像水費,用多少收多少。

  • 儲存費 (Storage):按每 GB/月 計費。
    • 標準型 (Standard):大約 $0.02 USD / GB。你的 Excel 檔案頂多幾百 MB,這部分每個月可能連 $0.1 USD (台幣 3 元) 都不到。
  • 網路傳輸費 (Network)
    • 上傳:免費。
    • 下載/讀取:如果從外網下載要錢;但如果是在 GCP 內部(Cloud Run 讀取 GCS)且在同區域,則是免費的
  • 操作費 (Operations):每進行 10,000 次讀取或寫入收一小筆錢(幾乎可以忽略不計)。

總結: GCS 對於存放爬蟲產出的 Excel 來說,成本近乎為零

比較多的費用會在cloud sql的實體開機收費

本日實作

今天會有三項設定

  • Google 私有網路連接 (建立一條專屬內網給 SQL 使用)。
  • Cloud SQL PostgreSQL 實例 (開啟 pgvector 支持)。
  • GCS Bucket (存放原始 Excel)。

1. Google 私有網路連接 (Private Service Access)

  • 目的:這是一場「網路握手」。Cloud SQL 雖然在 Google 內部運行,但它其實是住在 Google 管理的另一個隱藏 VPC 裡。
  • 動作:我們要在你的 bank-ai-vpc 裡「畫出一塊保留區 (IP Range)」,然後告訴 Google:「請把我的 VPC 和你的 SQL VPC 接起來」。
  • 結果:你的 Cloud Run 才能透過那條 VPC Connector 隧道,看到這台沒有公網 IP 的資料庫。

2. Cloud SQL PostgreSQL 實例 (存放向量與摘要)

  • 目的:蓋出 AI 的「大腦儲存區」。
  • 動作
    • 指定最小規格(db-f1-micro + 10GB SSD)。
    • 設定為「私有 IP 模式」(停用 Public IP)。
    • 資料庫初始化:建立一個名為 chatbot_db 的資料庫與使用者。
  • 亮點:我們會選用 PostgreSQL,因為它支援 pgvector(這是你明天之後要做向量查詢的靈魂)。

3. GCS Bucket (存放原始 Excel)

  • 目的:蓋出 AI 的「檔案櫃」。
  • 動作
    • 建立一個唯一命名的 Bucket(例如 bank-ai-knowledge-assets-xxxx)。
    • 安全性設定:開啟「統一權限管理 (Uniform bucket-level access)」,並禁止所有公網存取
  • 結果:爬蟲產出的 Excel 就有一個安全的地方可以存放,且只有你的 Service Account 讀得到。

需要enable service networking api

https://console.cloud.google.com/apis/library/servicenetworking.googleapis.com?project=

我們會在 /terraform 建立一個 database.tf

# ==========================================
# 私有服務存取 (Private Service Access)
# ==========================================

# A. 在 VPC 中畫出一塊保留的內部 IP 區段給 Google 服務使用
resource "google_compute_global_address" "private_ip_alloc" {
  name          = "google-managed-services-range"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16  # 這會保留一個 /16 的區段
  network       = google_compute_network.main_vpc.id # 本專案的 VPC
}

# B. 建立私有連線 (Peering),將你的 VPC 與 Google 服務網路接通
resource "google_service_networking_connection" "private_vpc_connection" {
  network                 = google_compute_network.main_vpc.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_alloc.name]
}

# ==========================================
# Cloud SQL PostgreSQL 實例
# ==========================================

resource "google_sql_database_instance" "postgres_instance" {
  name             = "bank-ai-db-instance"
  database_version = "POSTGRES_15" # 支援 pgvector 的版本
  region           = "asia-east1"
  
  # 確保在私有連線建立後才開始建立資料庫
  depends_on = [google_service_networking_connection.private_vpc_connection]

  settings {
    tier = "db-f1-micro" # 最小規格,省錢首選
    disk_size         = 10
    disk_type         = "PD_SSD"
    disk_autoresize   = true

    ip_configuration {
      ipv4_enabled    = false # 重要:關閉公網 IP
      private_network = google_compute_network.main_vpc.id # 指定走內網
    }

    # 銀行級別建議:開啟備份
    backup_configuration {
      enabled = true
    }
  }

  # 防止誤刪:實務上建議設為 true,但在 POC 練習時可設為 false 方便砍掉重練
  deletion_protection = false 
}

# 建立資料庫本體
resource "google_sql_database" "chatbot_db" {
  name     = "chatbot_db"
  instance = google_sql_database_instance.postgres_instance.name
}

# 建立資料庫使用者
resource "google_sql_user" "db_user" {
  name     = "bff_user"
  instance = google_sql_database_instance.postgres_instance.name
  password = "your-password-here" # Day 15 我們會改用 Secret Manager
}

# ==========================================
# GCS Bucket (存放原始 Excel)
# ==========================================

resource "google_storage_bucket" "excel_storage" {
  name          = "bank-ai-excel-assets-${google_sql_database_instance.postgres_instance.project}" # 加上 project ID 確保名稱唯一
  location      = "ASIA-EAST1"
  force_destroy = true # 刪除 terraform 時一併刪除內容

  public_access_prevention = "enforced" # 強制禁止公網存取
  uniform_bucket_level_access = true    # 統一權限管理
}

然後 terraform apply

這個過程會滿久的 資料庫可能會跑上10分鐘的時間

接著驗證我們今天建立的東西

  1. Cloud SQL
    去到 Cloud SQL的instances可以看到新增的實體

https://ithelp.ithome.com.tw/upload/images/20260808/20154359wUIZjdzwGg.png

  1. GCS 檔案庫
    去到 cloud storage > buckets 可以看到新增的bucket

https://ithelp.ithome.com.tw/upload/images/20260808/20154359Dj2rDX7Vzp.png

  1. VPC peering
    去到 VPC networking > VPC networking peering, 可以看到我們建立的 network peering

https://ithelp.ithome.com.tw/upload/images/20260808/20154359Fwz9k5KFpp.png

不過因為cloud sql是以小時計費的

項目 每小時 (約) 每天 (約) 每月 (約)
運算資源 (vCPU/RAM) NT$ 0.35 NT$ 8.4 NT$ 252
儲存空間 (10GB SSD) NT$ 0.02 NT$ 0.5 NT$ 15
總計 (未含稅) NT$ 0.37 NT$ 8.9 NT$ 267

這是請gemini預估的費用

考量我的使用斷斷續續 我建立一個指令去刪除與重建實體

在根目錄新增 Makefile

# 指向你的 terraform 檔案夾路徑
TF_DIR=terraform
INSTANCE_TARGET=google_sql_database_instance.postgres_instance

# 1. 啟動/部署全部資源
up:
	terraform -chdir=$(TF_DIR) apply -auto-approve

# 2. 僅關閉資料庫 (節省成本)
db-off:
	terraform -chdir=$(TF_DIR) destroy -target=$(INSTANCE_TARGET) -auto-approve

# 3. 重新開啟資料庫
db-on:
	terraform -chdir=$(TF_DIR) apply -target=$(INSTANCE_TARGET) -auto-approve

# 4. 全部刪除
down:
	terraform -chdir=$(TF_DIR) destroy -auto-approve

最燒錢的就是sql, 所以驗證完後 我會跑 make db-off 去把資料庫刪掉 這樣運算資源和儲存空間就會停止計費
當我要繼續驗證實作時 在根目錄跑 make up 或是cd到 /terraformterraform apply 就會把所有的terraform設定復原

觀察看看如果以後覺得除了sql之外的花費也挺多的 我也會用 make down 來把terraform資料夾所有的實體包括connection都刪除


上一篇
# Day7 IAP > IAM based Auth
下一篇
Day9 Cloud NAT 與 Cloud Router
系列文
和AI學習gcp - 建立對話代理17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言