透過 Private Service Connect 連線至 CloudSQL (Terraform)

1. 總覽

如要從其他專案或虛擬私有雲連線至「私人」Cloud SQL 執行個體,有幾種做法。Private Service Connect (PSC) 可讓服務供應商透過服務連結公開服務。消費者可以在環境中建立 PSC 端點和/或 PSC 後端,並透過指定的私人 IP 連線至這些生產者服務,使用這些服務連結。

Cloud SQL 可使用 PSC 服務連結,允許私人連線。在本實驗室中,您可以設定及測試這項選項。

在本實驗室中,您將建構簡單的架構,說明如何搭配使用 PSC 端點存取權和 Cloud SQL。

圖 1。

1893f48fe1298ea2.png

本實驗室需要兩個專案,或同一專案中的兩個虛擬私有雲。

目標

在本實驗室中,您將瞭解如何執行下列工作:

  • 建立含有 PSC 服務連結的 Cloud SQL 執行個體。
  • 建立靜態 IP 位址
  • 在消費者虛擬私有雲中建立 PSC 端點,連線至 Cloud SQL 資料庫
  • 透過 PSC 端點 IP,從用戶端網路中的測試 VM 驗證 SQL 資料庫的存取權。

2. 設定和需求

自修實驗室環境設定

  1. 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新。
  • 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常標示為 PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試使用自己的名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間會維持不變。
  • 請注意,有些 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成這個程式碼研究室的費用不高,甚至可能完全免費。如要關閉資源,避免在本教學課程結束後繼續產生費用,請刪除您建立的資源或專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

啟動 Cloud Shell

雖然可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。

Google Cloud 控制台中,點選右上工具列的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業需要一些時間才能完成。完成後,您應該會看到如下的內容:

7ffe5cbb04455448.png

這部虛擬機器搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。您可以在瀏覽器中完成本程式碼研究室的所有作業。您不需要安裝任何軟體。

3. 工作 1:使用 (Terraform) 設定資料庫專案的環境

資料庫專案中,我們將建立含有防火牆規則和子網路的自訂虛擬私有雲。開啟 Cloud 控制台,然後選取要用於資料庫的專案。

  1. 開啟控制台右上方的 Cloud Shell,確認 Cloud Shell 中顯示資料庫專案的資料庫專案 ID,並確認允許存取的任何提示。4261e776f64ea978.png
  2. 建立名為 terraform-db 的資料夾,然後移至該資料夾
mkdir terraform-db  && cd terraform-db
  1. 建立 main.tf、variable.tfdatabase.tf 檔案。
touch main.tf variable.tf database.tf 
  1. 切換至 Cloud Shell 編輯器檢視畫面。選取「編輯器」,並允許所有必要提示,確保介面可以載入。
  2. 載入後,依序前往「File」>「Open Folder」,然後前往「/home/your-user-name/terraform-db」,並選取「Ok」,在編輯器中開啟資料夾。78f5eb9f2f82f1b0.png
  3. 選取 variable.tf 檔案,然後新增下列內容。將 your-database-project-id-here 文字替換為實際的資料庫專案 ID (以半形引號括住)。將 your-consumer-project-id-here 文字替換為實際的消費者專案 ID (以半形引號括住)。
variable "project_id" {
  type = string
  default = "your-database-project-id-here"
}

variable "project_id_consumer" {
  type = set(string)
  default = ["your-consumer-project-id-here"]
}

variable "network_id" {
  type = string
  default = "database-net"
}

variable "region_id" {
  type = string
  default = "us-east1"
}

variable "db_password" {
  type = string
  default = "cloudsql24"
}
  1. 接著開啟 main.tf 檔案。我們將新增一些 Terraform 程式碼,執行下列各種動作。

啟用 API

resource "google_project_service" "default"

建立虛擬私有雲

resource "google_compute_network" "default"

新增防火牆規則

resource "google_compute_firewall" "allow_icmp"

  1. 複製下列程式碼並貼到 main.tf 檔案中。
resource "google_project_service" "default" {
  for_each = toset([
    "compute.googleapis.com",
    "sqladmin.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = true
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-icmp"]
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}

resource "google_compute_firewall" "allow_sql" {
  name    = "allow-sql-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["3306"]
  }

  source_ranges = ["0.0.0.0/0"]
 }

resource "google_compute_firewall" "allow_internal" {
  name    = "allow-internal-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
    }


  allow {
    protocol = "tcp"
    ports    = ["0-65535"]
  }
  allow {
    protocol = "udp"
    ports    = ["0-65535"]
  }

  source_ranges = ["10.128.0.0/9"]
 }
  1. 切換回 Cloud Shell 終端機,確認您位於 terraform-db 目錄 cd terraform-db,然後執行下列指令:

terraform init

初始化工作目錄。這個步驟會下載指定設定所需的供應商。

terraform plan

產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。

  1. 現在請執行 terraform apply 指令,然後輸入 yes 來建立資源。

4. 工作 2:建立附加 PSC 的 Cloud SQL 執行個體 (Terraform)

我們將使用 Terraform 建立 Cloud SQL 執行個體,並透過 PSC 選項允許連線。請在資料庫專案中完成這項設定。

  1. 切換至 Cloud Shell 編輯器檢視畫面。確認您位於 terraform-db 資料夾。選取 database.tf 檔案,並新增下列內容。
resource "google_sql_database_instance" "default" {
  name             = "psc-sql-db"
  region           = var.region_id
  database_version = "MYSQL_8_0"
  settings {
    tier              = "db-f1-micro"
    availability_type = "REGIONAL"
    backup_configuration {
      enabled            = true
      binary_log_enabled = true
    }
    ip_configuration {
      psc_config {
        psc_enabled               = true
        allowed_consumer_projects = var.project_id_consumer
      }
      ipv4_enabled = false
    }
  }
  deletion_protection = false 
}

resource "google_sql_user" "users" {
  name     = "testsql"
  instance = google_sql_database_instance.default.name
  password = var.db_password 
}
  1. 切換回 Cloud Shell 終端機,確認您位於 terraform-db 目錄。現在請執行 terraform apply 指令,然後輸入 yes 來建立資源。建立附加 PSC 的 Cloud SQL 執行個體最多可能需要 5 分鐘。

驗證資料庫

  1. 完成後,前往控制台中的「SQL」,選取新建立的 psc-sql-db 資料庫執行個體。
  2. 在左側展開 SQL 選項的滑出式選單,然後選取「連線」
  3. 您可以在「摘要」分頁中查看連線資訊。
  4. 複製「服務附件地址」,並儲存在系統的某個位置。
  5. 您需要這項資訊才能完成工作 3 的步驟 8。

Cloud SQL (含 PSC 連結)

  1. 在左側展開 SQL 選項滑出式選單,然後選取「使用者」
  2. 您應該會看到名為 testsql 的使用者,密碼為 cloudsql24(稍後會用來存取資料庫)

5. 工作 3:設定用戶專案的環境 (Terraform)

用戶專案中,我們將建立設有防火牆規則和子網路的自訂虛擬私有雲。開啟 Cloud 控制台,然後選取要使用的專案。

  1. 在控制台頂端,點選 Google Cloud 圖示旁的下拉式選單,然後選取「全部」分頁標籤。

專案列專案列 2

  1. 從列出的專案中選取「消費者專案」ID,然後繼續操作。
  2. 開啟控制台右上方的 Cloud Shell,確認 Cloud Shell 中顯示消費者專案 ID,並確認允許存取的任何提示。
  3. 建立名為 terraform-consumer 的資料夾,然後移至該資料夾
mkdir terraform-consumer  && cd terraform-consumer
  1. 建立 main.tf、variable.tfpsc.tf 檔案。
touch main.tf variable.tf psc.tf 
  1. 切換至「Cloud Shell 編輯器」檢視畫面,查看「消費者專案 ID」。選取「編輯器」,並允許所有必要提示,確保介面可以載入。
  2. 載入後,依序前往「File」>「Open Folder」,然後前往「/home/your-user-name/terraform-consumer」,並選取「Ok」,在編輯器中開啟資料夾。78f5eb9f2f82f1b0.png
  3. 選取 variable.tf 檔案,然後新增下列內容。將 your-consumer-project-id-here 文字替換為實際的消費者專案 ID (以半形引號括住)。將 your-psc-attachment-id-here 文字替換為 PSC 附件地址 (以半形引號括住)。這是您在工作 2 第 2-5 節複製的 ID d7ac9629a59abfc6.png
variable "project_id" {
  type = string
  default = "your-consumer-project-id-here"
}

variable "psc_attachment_id" {
  type = string
  default = "your-psc-attachment-id-here"
}

variable "network_id" {
  type = string
  default = "psc-endpoint-net"
}

variable "region_id" {
  type = string
  default = "us-east1"
}

variable "region_id2" {
  type = string
  default = "us-central1"
}
  1. 接著開啟 main.tf 檔案。我們將新增一些 Terraform 程式碼,執行下列各種動作。

啟用 API

resource "google_project_service"

建立虛擬私有雲

resource "google_compute_network"

建立 NAT 閘道

resource "google_compute_router"
resource "google_compute_router_nat"

新增防火牆規則

resource "google_compute_firewall"

  1. 複製下列程式碼並貼到 main.tf 檔案中。
resource "google_project_service" "default" {
  for_each = toset([
    "compute.googleapis.com",
    "cloudresourcemanager.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = false
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_subnetwork" "vm_subnet" {
  name          = "vm-subnet"
  ip_cidr_range = "192.168.50.0/24"
  region        = var.region_id2
  network       = google_compute_network.default.name
  project       = var.project_id
}

resource "google_compute_subnetwork" "psc_subnet" {
  name          = "psc-subnet"
  ip_cidr_range = "192.168.90.0/24"
  region        = var.region_id
  network       = google_compute_network.default.name
  project       = var.project_id
}

resource "google_compute_router" "default" {
  name    = "outbound-nat"
  region  = var.region_id2
  network = google_compute_network.default.id

 bgp {
  asn = 64514
  }
}

resource "google_compute_router_nat" "default" {
  name = "outbound-nat-gw"
  router = google_compute_router.default.name
  region = google_compute_router.default.region
  nat_ip_allocate_option = "AUTO_ONLY"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"

  log_config {
    enable = true
    filter = "ERRORS_ONLY"
  }
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}


resource "google_compute_firewall" "allow_internal" {
  name    = "allow-internal-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
    }


  allow {
    protocol = "tcp"
    ports    = ["0-65535"]
  }
  allow {
    protocol = "udp"
    ports    = ["0-65535"]
  }

  source_ranges = ["192.168.0.0/16"]
 }
  1. 切換回 Cloud Shell 終端機,確認您位於消費端專案的 terraform-consumer 目錄 cd terraform-consumer,然後執行下列指令

terraform init

初始化工作目錄。這個步驟會下載指定設定所需的供應商。

terraform plan

產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。

  1. 現在請執行 terraform apply 指令,然後輸入 yes 來建立資源。

6. 工作 4:在消費者專案中建立 PSC 端點來附加至 SQL 資料庫,並測試 VM (Terraform)

請在消費者專案中完成這項設定。

  1. 切換回 Cloud Shell 編輯器,開啟 terraform-consumer 目錄,然後選取 psc.tf 檔案。在檔案中新增下列 Terraform 程式碼。這會建立靜態內部 IP、PSC 端點和已安裝 Maria DB 的測試 VM。
resource "google_compute_address" "default" {
  name = "psc-ip"
  region = var.region_id
  address_type = "INTERNAL"
  subnetwork = google_compute_subnetwork.psc_subnet.name
  address = "192.168.90.100" 
}

resource "google_compute_forwarding_rule" "default" {
  name = "psc-sql-endpoint"
  region = var.region_id
  network = google_compute_network.default.name
  ip_address = google_compute_address.default.self_link
  load_balancing_scheme = ""
  target = var.psc_attachment_id
}


resource "google_compute_instance" "sql_test_vm" {
  name         = "sql-test-vm"
  machine_type = "e2-medium"
  zone         = "${var.region_id2}-b"
  project      = var.project_id

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  network_interface {
    subnetwork = google_compute_subnetwork.vm_subnet.name
  }

  # No external IP address
  network_performance_config {
    total_egress_bandwidth_tier = "DEFAULT"
  }

  tags = ["allow-icmp", "allow-ssh", "allow-internal", "allow-health-check"]

  # Install MariaDB at startup
  metadata_startup_script = <<EOF
#!/bin/bash
apt-get update
apt-get install -y mariadb-server
systemctl enable mariadb
EOF
}
  1. 切換回 Cloud Shell 終端機,確認您位於消費端專案的 terraform-consumer 目錄 cd terraform-consumer,然後執行下列指令

terraform plan

產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。

  1. 現在執行 terraform apply 指令來建立資源,然後輸入 yes 來執行
  2. 由於 VM 和端點位於不同區域,我們需要在 PSC 端點上啟用 全域存取權。我們透過控制台
  3. 在消費者專案控制台中,前往「Private Service Connect」。在「已連線的端點」分頁中,找到「端點」部分並選取「psc-sql-endpoint」
  4. 選取「編輯」,然後按一下「啟用全域存取權」旁的核取方塊,並選取「儲存」選項。7eeb5a4162f5f79d.png
  5. 繼續進行下一個步驟,驗證連線

7. 工作 5:透過 PSC IP 位址,從 VM 驗證端點連線

在消費者專案中完成這項操作

  1. 前往「VM Instance」(VM 執行個體)。選取「sql-test-vm」
  2. 選取「SSH」SSH選項,連線至 VM。
  3. 透過端點連線至資料庫,方法如下:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. 建立連線後,請使用下列 psc-sql-db 建立資料庫。
CREATE DATABASE remotesqldb;
  1. 完成後,請輸入 exit 結束連線。

8. 工作 6:驗證資料庫項目

資料庫專案中完成這項驗證

  1. 在控制台頂端,點選 Google Cloud 圖示旁的下拉式選單,然後選取「全部」分頁標籤。

專案列專案列 2

  1. 從列出的專案中選取資料庫專案 ID,然後繼續操作。
  2. 前往「SQL」,選取資料庫「psc-sql-db」,展開 SQL 選項並選取「Databases」remotesqldb

Cloud SQL 資料庫

9. 清除

在 Database 專案中完成這項操作

  1. 選取資料庫專案 ID
  2. 前往 Cloud Shell,確認您看到資料庫專案 ID
  3. 前往 terraform-db 目錄 cd terraform-db,然後執行下列指令 terraform destroy 並輸入 yes,即可移除您在資料庫專案中透過 Terraform 建立的所有資源。

在消費者專案中完成這項操作

  1. 選取消費者專案 ID
  2. 前往 Cloud Shell,確認您看到消費端專案 ID
  3. 前往 terraform-consumer 目錄 cd terraform-consumer,然後執行下列指令 terraform destroy 並輸入 yes,您在資料庫專案中以 Terraform 建立的所有資源都會移除。

10. 恭喜

恭喜!您已成功設定具有 PSC 連結的 Cloud SQL 執行個體,並在另一個虛擬私有雲中建立 Private Service Connect 端點。您已成功透過 PSC 端點從遠端 VM 連線至資料庫。

瞭解詳情

如要進一步瞭解 Private Service Connect 和 Cloud SQL,請參閱這篇文章