這四個 labs 展示了 Cloud SQL PostgreSQL 作為企業級資料庫服務的強大功能,從資料遷移到安全管理再到災難恢復,形成完整的資料庫生命週期管理解決方案。特別是看到 Database Migration Service 如何無縫遷移資料,還有應用如何安全地連接到受保護的資料庫實例,真的很實用。

GSP918 - Migrate to Cloud SQL for PostgreSQL using Database Migration Service
GSP919 - Connect an App to a Cloud SQL for PostgreSQL Instance
GSP920 - Securing a Cloud SQL for PostgreSQL Instance
GSP922 - Configure Replication and Enable Point-in-Time Recovery for Cloud SQL for PostgreSQL

主要特色

➊ Database Migration Service (DMS) 讓資料遷移變得簡單,支援連續同步避免停機
➋ GKE 應用與 Cloud SQL 的安全連接,透過 Auth Proxy 實現零信任架構
➌ CMEK 客戶自管加密金鑰,提供資料靜態加密的完全控制權
➍ pgAudit 詳細記錄 SQL 操作,滿足合規與安全稽核需求
➎ IAM 資料庫認證整合,簡化身分管理與權限控制
➏ Point-in-time recovery 時間點恢復功能,精準回復到特定時間點的資料狀態

Labs 實作

➊ 準備來源 PostgreSQL 並安裝配置 pglogical 延伸模組
➋ 建立 Database Migration Service 連線設定檔和遷移作業
➌ 建立 GKE cluster 並部署容器化應用程式
➍ 配置 Kubernetes secrets 管理資料庫認證資訊
➎ 設定 Cloud KMS 金鑰環與 CMEK 加密金鑰
➏ 配置 pgAudit 與 Cloud SQL IAM 資料庫認證
➐ 啟用自動備份與 point-in-time recovery 功能
➑ 測試資料遷移同步與災難恢復機制

𝕂𝕖𝕖𝕡 𝕃𝕖𝕒𝕣𝕟𝕚𝕟𝕘. 𝕂𝕖𝕖𝕡 𝕙𝕒𝕔𝕜𝕚𝕟𝕘!


實作影片


指令整理

環境初始化

此部分設定 GCP 專案的基礎環境變數。這些變數在後續指令中被引用,確保所有操作都在正確的專案、區域、實例上執行。

export PROJECT_ID=$(gcloud config list --format 'value(core.project)')
export REGION=""      # 根據 lab 環境設定,影響資源部署位置
export ZONE=""        # 用於 Compute Engine 實例的特定可用區
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format 'value(projectNumber)')

資料庫遷移與複製

此部分涵蓋 Database Migration Service 的完整設定流程。DMS 解決了傳統資料庫遷移的停機問題,透過邏輯複製實現連續資料同步。

# 啟用必要 API
gcloud services enable databasemigration.googleapis.com
gcloud services enable servicenetworking.googleapis.com

# 建立遷移連線設定檔
gcloud database-migration connection-profiles create postgres-vm \
  --region=$REGION \
  --source-engine=postgresql \
  --host=10.128.0.2 \
  --port=5432 \
  --username=migration_admin \
  --password="DMS_1s_cool!"

# 建立遷移作業
gcloud database-migration migration-jobs create vm-to-cloudsql \
  --region=$REGION \
  --source=postgres-vm \
  --destination=postgresql-cloudsql \
  --type=CONTINUOUS

常見坑點:pglogical 延伸模組必須正確安裝並配置,否則遷移會失敗。來源資料庫的權限設定也很關鍵,migration_admin 使用者需要 REPLICATION 權限。
概念連結:此概念與「安全配置」相關,因為遷移過程需要處理敏感資料,確保連線安全至關重要。

應用部署與連接

此部分展示如何將容器化應用部署到 GKE 並安全連接到 Cloud SQL。解決了傳統應用架構中資料庫連接管理的複雜性。

# 建立 GKE cluster
gcloud container clusters create postgres-cluster --zone=$ZONE --num-nodes=2

# 建立 Kubernetes secrets
kubectl create secret generic cloudsql-instance-credentials --from-file=credentials.json=$SERVICE_ACCOUNT_KEY.json
kubectl create secret generic cloudsql-db-credentials --from-literal=username=postgres --from-literal=password=supersecret!

# 建立負載平衡器服務
kubectl expose deployment gmemegen --type="LoadBalancer" --port 80 --target-port 8080

常見坑點:Cloud SQL Auth Proxy 的連接字串格式必須完全正確,否則應用程式無法連接到資料庫。容器映像也要正確推送到 Artifact Registry。
概念連結:此概念與「安全配置」緊密相關,因為應用連接需要適當的身分認證和權限管理。

安全配置

此部分實現 Cloud SQL 的全方位安全保護。CMEK 和 IAM 認證解決了資料加密和存取控制的核心問題。

# 建立 Cloud SQL 專用服務帳號
gcloud beta services identity create --service=sqladmin.googleapis.com --project=$PROJECT_ID

# 建立 KMS 金鑰環和金鑰
gcloud kms keyrings create cloud-sql-keyring --location=$REGION
gcloud kms keys create cloud-sql-key --location=$REGION --keyring=cloud-sql-keyring --purpose=encryption

# 綁定金鑰到服務帳號
gcloud kms keys add-iam-policy-binding cloud-sql-key \
  --location=$REGION \
  --keyring=cloud-sql-keyring \
  --member=serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-cloud-sql.iam.gserviceaccount.com \
  --role=roles/cloudkms.cryptoKeyEncrypterDecrypter

# 建立具 CMEK 的 Cloud SQL 實例
gcloud sql instances create secure-postgres \
  --database-version=POSTGRES_13 \
  --cpu=2 \
  --memory=7680MB \
  --region=$REGION \
  --root-password=supersecret! \
  --disk-encryption-key=projects/$PROJECT_ID/locations/$REGION/keyRings/cloud-sql-keyring/cryptoKeys/cloud-sql-key \
  --backup-encryption-key=projects/$PROJECT_ID/locations/$REGION/keyRings/cloud-sql-keyring/cryptoKeys/cloud-sql-key

常見坑點:CMEK 金鑰遺失將導致資料無法存取,務必妥善備份金鑰。IAM 權限設定不正確會造成連線失敗。
概念連結:安全配置與「應用部署」和「備份恢復」都相關,因為所有操作都需要適當的權限控制。

備份與恢復

此部分實現資料保護和災難恢復。Point-in-time recovery 解決了資料意外損失的問題,提供精準的時間點回復能力。

# 啟用自動備份
gcloud sql instances patch postgres-orders --backup-start-time=13:00

# 啟用時間點恢復
gcloud sql instances patch postgres-orders \
  --enable-point-in-time-recovery \
  --retained-transaction-log-days=1

# 執行時間點恢復
gcloud sql instances restore-backup postgres-orders-restore \
  --backup-instance=postgres-orders \
  --restore-time="2023-11-01 14:30:00"

常見坑點:備份開始時間必須早於當前時間,否則設定會失敗。恢復操作會建立新實例,無法覆蓋現有實例。
概念連結:備份恢復與「安全配置」相關,因為加密的金鑰也必須用於備份資料的保護。

驗證與測試

整合上述概念,展示如何驗證整個架構的正確性。確保所有組件協調運作,提供可靠的資料庫服務。

# 驗證遷移狀態
gcloud database-migration migration-jobs describe vm-to-cloudsql --region=$REGION --format="value(status)"

# 測試應用連線
gcloud sql connect secure-postgres --user=postgres --quiet

# 檢查備份配置
gcloud sql instances describe postgres-orders --format='value(settings.backupConfiguration)'

Google Cloud AI Study Jam 2025 學習系列 25