1. 總覽
如要從其他專案或 VPC 網路連線至私人 Cloud SQL 執行個體,有幾種做法。您可以使用私人服務存取權 (PSA),透過私人連線存取 Google 和第三方服務的內部 IP 位址。如要擴充資料庫的存取權,現在也可以啟用 Private Service Connect (PSC)。
Private Service Connect (PSC) 可讓服務供應商透過服務連結公開服務,供消費者在環境中建立 PSC 端點和/或 PSC 後端。透過這些 PSC 端點,他們可以透過使用者指定的私人 IP 連線至生產者服務。
在本實驗室中,您可以設定及測試這項選項。
在本實驗室中,您將建構簡單的架構,說明如何搭配 Cloud SQL 使用 PSA 和 PSC 端點存取權。
圖 1。

本實驗室需要兩個專案,或同一專案中的兩個虛擬私有雲。
目標
在本實驗室中,您將瞭解如何執行下列工作:
- 啟用服務聯網
- 設定 PSA
- 使用 PSA 建立 Cloud SQL 執行個體
- 啟用 PSC 服務連結。
- 在消費者虛擬私有雲中建立 PSC 端點,連線至 Cloud SQL 資料庫
- 在供應商和用戶端虛擬私有雲中,從測試 VM 驗證 SQL 資料庫的存取權
2. 設定和需求
自修實驗室環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



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

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

這部虛擬機器搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。您可以在瀏覽器中完成本程式碼研究室的所有作業。您不需要安裝任何軟體。
3. 工作 1:使用 (Terraform) 設定資料庫專案的環境
在資料庫專案中,我們將啟用服務網路、建立虛擬私有雲、建立 PSA 範圍、建立服務網路對等互連,以及建立防火牆規則。開啟 Cloud 控制台,然後選取要用於資料庫的專案。
- 開啟控制台右上方的 Cloud Shell,確認 Cloud Shell 中顯示資料庫專案的資料庫專案 ID,並確認允許存取的任何提示。

- 建立名為 terraform-db-psc 的資料夾,然後移至該資料夾
mkdir terraform-db-psc && cd terraform-db-psc
- 建立 main.tf、variable.tf、nat-vm.tf 和 database.tf 檔案。
touch main.tf variable.tf nat-vm.tf database.tf
- 切換至 Cloud Shell 編輯器檢視畫面。選取「編輯器」,並允許所有必要提示,確保介面可以載入。
- 載入後,依序前往「File」>「Open Folder」,然後前往「/home/your-user-name/terraform-db-psc」,並選取「Ok」,在編輯器中開啟資料夾。

- 選取 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"
}
- 接著開啟 main.tf 檔案。我們將新增一些 Terraform 程式碼,執行下列各種動作。
啟用 API |
|
建立虛擬私有雲 |
|
新增防火牆規則 |
|
建立 PSA 範圍 |
|
建立對等互連 |
|
- 複製下列程式碼並貼到 main.tf 檔案中。
resource "google_project_service" "default" {
for_each = toset([
"compute.googleapis.com",
"servicenetworking.googleapis.com",
"sqladmin.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 = true
mtu = 1460
routing_mode = "GLOBAL"
}
resource "google_compute_global_address" "psa_range" {
name = "psa-range-${google_compute_network.default.name}"
project = var.project_id
purpose = "VPC_PEERING"
address_type = "INTERNAL"
prefix_length = 20
address = "172.18.0.0"
network = google_compute_network.default.id
}
resource "google_service_networking_connection" "private_connection" {
network = google_compute_network.default.self_link
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [
google_compute_global_address.psa_range.name,
]
}
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", "172.18.0.0/20"] # Include PSA range
}
- 切換回 Cloud Shell 終端機,確認您位於 terraform-db-psc 目錄
cd terraform-db-psc,然後執行下列指令
terraform init
初始化工作目錄。這個步驟會下載指定設定所需的供應商。
terraform plan
產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。
- 現在請執行
terraform apply指令,然後輸入yes來建立資源。
4. 工作 2:使用 PSA 建立 Cloud SQL 執行個體 (Terraform)
我們將使用 Terraform 建立 Cloud SQL 執行個體,並啟用 PSA 選項來允許連線。請在資料庫專案中完成這項設定。
- 切換至 Cloud Shell 編輯器檢視畫面。確認您位於
terraform-db-psc資料夾。選取database.tf檔案,並新增下列內容。
resource "google_sql_database_instance" "default" {
name = "psc-psa-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 {
ipv4_enabled = "false"
private_network = google_compute_network.default.id
}
}
deletion_protection = false
}
resource "google_sql_user" "users" {
name = "testsql"
instance = google_sql_database_instance.default.name
password = var.db_password
}
- 切換回 Cloud Shell 終端機,確認您位於 terraform-db-psc 目錄。現在請執行
terraform apply指令,然後輸入yes來建立資源。使用 PSA 建立 Cloud SQL 執行個體最多可能需要 15 分鐘。
驗證資料庫
- 完成後,前往控制台中的「SQL」,選取新建立的 psc-psa-sql-db 資料庫執行個體。
- 在左側展開 SQL 選項的滑出式選單,然後選取「連線」
- 您可以在「摘要」分頁中查看連線資訊。
- 複製內部 IP 位址,並儲存到系統中的某處。如您所見,該 IP 位址是從我們保留的範圍指派。
- 您需要這個 IP 才能完成工作 3 的步驟 5。

- 在左側展開 SQL 選項滑出式選單,然後選取「使用者」。
- 您應該會看到名為 testsql 的使用者,密碼為 cloudsql24(稍後會用來存取資料庫)
5. 工作 3:建立測試 VM,並從資料庫專案內連線至 SQL 執行個體 (Terraform)
我們來使用 Terraform 建立測試 VM 和 NAT 閘道。請在資料庫專案中完成這項設定。
- 切換至 Cloud Shell 編輯器檢視畫面。確認您位於
terraform-db-psc資料夾。選取nat-vm.tf檔案,並新增下列內容。
resource "google_compute_router" "default" {
name = "outbound-nat"
region = var.region_id
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_instance" "sql_net_vm" {
name = "db-vm-test"
machine_type = "e2-medium"
zone = "${var.region_id}-b"
project = var.project_id
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
network = google_compute_network.default.self_link
}
# 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
}
- 切換回 Cloud Shell 終端機,確認您位於 terraform-db-psc 目錄。現在請執行
terraform plan, then terraform apply指令,然後輸入yes來建立資源。這會建立 NAT 閘道和已安裝 MariaDB 的 VM。
驗證資料庫
在消費者專案中完成這項操作
- 前往「VM Instance」(VM 執行個體)。選取「db-vm-test」
- 選取「SSH」SSH選項,連線至 VM。
- 使用您先前複製的本機 IP,透過下列方式連線至資料庫:
mysql --host=172.18.0.2 --user=testsql --password=cloudsql24
附註:請將 IP 位址變更為實際 IP,以便連線。
- 建立連線後,請使用下列 localvpcsqldb 建立資料庫。
CREATE DATABASE localvpcsqldb;
- 完成後,請輸入 exit 結束連線。再次輸入 exit 即可關閉 VM。
6. 工作 4:在 Cloud SQL 執行個體上啟用 PSC
接著使用 gcloud 指令啟用 PSC 選項,允許連線。請在資料庫專案中完成這項設定。
- 切換至 Cloud Shell 檢視畫面。
- 在 Cloud Shell 中執行下列指令。
- 請將「Ensure
YOUR_DB_PROJECT_HERE」替換為資料庫專案 ID。 - 將「Ensure
YOUR_CONSUMER_PROJECT_HERE」替換為消費者專案 ID。
project_id=YOUR_DB_PROJECT_HERE
allowed_project=YOUR_CONSUMER_PROJECT_HERE
gcloud beta sql instances patch psc-psa-sql-db \
--project=$project_id \
--enable-private-service-connect \
--allowed-psc-projects=$allowed_project
- 這會更新現有資料庫,並附加 PSC。這項作業需要一段時間 (10 分鐘以上)。
如果發生等待逾時錯誤,系統也會提供指令,讓您繼續查看進度。例如:「You can continue waiting for the operation by running `gcloud beta sql operations wait –project」
請注意,您可以從一開始就部署啟用 PSA 和 PSC 的新資料庫 。
驗證資料庫
- 完成後,前往控制台中的「SQL」,選取「psc-psa-sql-db」資料庫執行個體。
- 在左側展開 SQL 選項的滑出式選單,然後選取「連線」
- 您可以在「摘要」分頁中查看連線資訊。
- 複製「服務附件」地址,並儲存在系統的某個位置。
- 您需要這項資訊才能完成下一個工作 5 的步驟 8。

7. 工作 5:設定用戶專案的環境 (Terraform)
在用戶專案中,我們將建立設有防火牆規則和子網路的自訂虛擬私有雲。開啟 Cloud 控制台,然後選取要使用的專案。
- 在控制台頂端,點選 Google Cloud 圖示旁的下拉式選單,然後選取「全部」分頁標籤。


- 從列出的專案中選取「消費者專案」ID,然後繼續操作。
- 開啟控制台右上方的 Cloud Shell,確認 Cloud Shell 中顯示消費者專案 ID,並確認允許存取的任何提示。
- 建立名為 terraform-consumer-psc 的資料夾,然後移至該資料夾
mkdir terraform-consumer-psc && cd terraform-consumer-psc
- 建立 main.tf、variable.tf 和 psc.tf 檔案。
touch main.tf variable.tf psc.tf
- 切換至「Cloud Shell 編輯器」檢視畫面,查看「消費者專案 ID」。選取「編輯器」,並允許所有必要提示,確保介面可以載入。
- 載入後,依序前往「File」>「Open Folder」,然後前往「/home/your-user-name/terraform-consumer-psc」,並選取「Ok」,在編輯器中開啟資料夾。

- 選取 variable.tf 檔案,然後新增下列內容。將
your-consumer-project-id-here文字替換為實際的消費者專案 ID (以半形引號括住)。將your-psc-attachment-id-here文字替換為 PSC 附件地址 (以半形引號括住)。這是您在工作 4 第 5-7 節複製的 ID
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-vpc"
}
variable "region_id" {
type = string
default = "us-east1"
}
- 接著開啟 main.tf 檔案。我們將新增一些 Terraform 程式碼,執行下列各種動作。
啟用 API |
|
建立虛擬私有雲 |
|
建立 NAT 閘道 |
|
新增防火牆規則 |
|
- 複製下列程式碼並貼到 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_pc" {
name = "vm-net"
ip_cidr_range = "192.168.80.0/24"
region = var.region_id
network = google_compute_network.default.name
project = var.project_id
}
resource "google_compute_subnetwork" "psc_subnet_ip" {
name = "psc-subnet"
ip_cidr_range = "192.168.100.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_id
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"]
}
- 切換回 Cloud Shell 終端機,確認您位於消費者專案的 terraform-consumer-psc 目錄
cd terraform-consumer-psc,然後執行下列指令
terraform init
初始化工作目錄。這個步驟會下載指定設定所需的供應商。
terraform plan
產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。
- 現在請執行
terraform apply指令,然後輸入yes來建立資源。
8. 工作 6:在消費者專案中建立 PSC 端點來附加至 SQL 資料庫,並測試 VM (Terraform)
請在消費者專案中完成這項設定。
- 切換回 Cloud Shell 編輯器,開啟 terraform-consumer-psc 目錄,然後選取
psc.tf檔案。在檔案中新增下列 Terraform 程式碼。這會建立靜態內部 IP、PSC 端點和已安裝 Maria DB 的測試 VM。
resource "google_compute_address" "default" {
name = "psc-ip-1"
region = var.region_id
address_type = "INTERNAL"
subnetwork = google_compute_subnetwork.psc_subnet_ip.name
address = "192.168.100.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 = "remote-sql-test-vm"
machine_type = "e2-medium"
zone = "${var.region_id}-b"
project = var.project_id
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
subnetwork = google_compute_subnetwork.vm_subnet_pc.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
}
- 切換回 Cloud Shell 終端機,確認您位於消費者專案的 terraform-consumer-psc 目錄
cd terraform-consumer-psc,然後執行下列指令
terraform plan
產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。
- 現在執行
terraform apply指令來建立資源,然後輸入yes來執行
9. 工作 7:透過 PSC IP 位址,從 VM 驗證端點連線
在消費者專案中完成這項操作
- 前往「VM Instance」(VM 執行個體)。選取「remote-sql-test-vm」remote-sql-test-vm
- 選取「SSH」SSH選項,連線至 VM。
- 透過端點連線至資料庫,方法如下:
mysql --host=192.168.100.100 --user=testsql --password=cloudsql24
- 建立連線後,請使用下列 psc-sql-db 建立資料庫。
CREATE DATABASE remotepscpsasqldb;
- 完成後,請輸入 exit 結束連線。再次輸入 exit 即可關閉 VM。
10. 工作 8:驗證資料庫項目
在資料庫專案中完成這項驗證
- 在控制台頂端,點選 Google Cloud 圖示旁的下拉式選單,然後選取「全部」分頁標籤。


- 從列出的專案中選取資料庫專案 ID,然後繼續操作。
- 前往「SQL」,選取資料庫「psc-psa-sql-db」,展開 SQL 選項並選取「資料庫」。您應該會看到剛才建立的資料庫,從消費者專案 VM 稱為 remotepscpsasqldb,以及從資料庫專案 VM 稱為 localvpcsqldb**
.**

11. 清除
在消費者專案中完成這項操作
- 選取消費者專案 ID
- 前往 Cloud Shell,確認您看到消費端專案 ID
- 前往 terraform-consumer-psc 目錄
cd terraform-consumer-psc,然後執行下列指令terraform destroy並輸入yes,即可移除您在用戶專案中以 Terraform 建立的所有資源。
在 Database 專案中完成這項操作
- 選取資料庫專案 ID
- 前往 Cloud Shell,確認您看到資料庫專案 ID
- 前往 terraform-db-psc 目錄
cd terraform-db-psc,然後執行下列指令terraform destroy並輸入yes,您在資料庫專案中以 Terraform 建立的大部分資源都會移除。服務網路可能無法刪除,並會顯示錯誤訊息。 - 接著,從 terraform-db-psc 資料夾刪除下列檔案。
rm -r terraform.tfstate terraform.tfstate.backup
- 接著前往控制台的「VPC networks」(虛擬私有雲網路)
- 選取 database-net 虛擬私有雲,然後選取「PRIVATE SERVICES ACCESS」(私人服務存取權)。在「Allocated IP Ranges for Services」(服務的已分配 IP 範圍) 下方,選取「psa-range-database-net」,然後選取「Release」(發布) 選項。

- 接著選取「VPC NETWORK PEERING」,選取「servicenetworking-googleapis-com」,然後選取「Delete」選項。

- 接著,選取「刪除虛擬私有雲網路」

12. 恭喜
恭喜!您已成功設定 Cloud SQL 執行個體,並附加 PSA 和 PSC,且在另一個 VPC 中建立 Private Service Connect 端點。
瞭解詳情
如要進一步瞭解 Private Service Connect 和 Cloud SQL,請參閱這篇文章。
其他相關程式碼研究室:https://codelabs.developers.google.com/codelabs/cloudsql-psc-terraform