1. 總覽
您可以透過多種方式,從其他專案或 VPC 連線至私人 Cloud SQL 執行個體。Private Service Connect (PSC) 可讓服務供應商透過服務連結公開服務。使用者可以利用這些服務附件,在自己的環境中建立 PSC 端點和/或 PSC 後端,並透過指定的私人 IP 連線至這些供應端服務。
Cloud SQL 可使用 PSC 服務連結,允許私人連線。在本研究室中,您可以設定及測試該選項。
在本研究室中,您將建立簡單的架構,說明如何使用 PSC 端點存取權搭配 CloudSQL。
圖 1.
在本研究室中,您需要兩個專案,或在同一個專案中建立不同的虛擬私有雲。
目標
在本研究室中,您將瞭解如何執行下列工作:
- 建立含有 PSC 服務連結的 CloudSQL 執行個體。
- 建立靜態 IP 位址
- 在消費者 VPC 中建立 PSC 端點,以連線至 CloudSQL 資料庫
- 透過 PSC 端點 IP 驗證消費者網路中測試 VM 的 SQL 資料庫存取權。
2. 設定和需求
自助式環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請務必建立帳戶。
- 「Project name」是這個專案參與者的顯示名稱。這是 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 圖示:
佈建並連線至環境的作業需要一些時間才能完成。完成後,畫面應如下所示:
這個虛擬機器會載入您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,可大幅提升網路效能和驗證功能。您可以在瀏覽器中完成本程式碼研究室的所有工作。您不需要安裝任何東西。
3. 工作 1:使用 (Terraform) 設定資料庫專案的環境
在資料庫專案中,我們會建立含有防火牆規則和子網路的自訂虛擬私有雲。開啟 Cloud 控制台,然後選取要用於資料庫的專案。
- 開啟控制台右上方的 Cloud Shell,確認 Cloud Shell 中顯示資料庫專案 ID 資料庫專案,確認任何允許存取權的提示。
- 建立名為 terraform-db 的資料夾並移動到資料夾
mkdir terraform-db && cd terraform-db
- 建立 main.tf、variable.tf 和 database.tf 檔案。
touch main.tf variable.tf database.tf
- 切換至 Cloud Shell 編輯器檢視畫面。選取「編輯器」,確認您已允許所有必要提示,以便介面載入。
- 載入後,請依序前往「File」>「Open Folder」,然後前往 /home/your-user-name/terraform-db,並選取「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 |
|
建立虛擬私有雲 |
|
新增防火牆規則 |
|
- 複製並貼到 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"] }
- 切換回 Cloud Shell 終端機,確認您位於 terraform-db 目錄
cd terraform-db
中,然後執行下列指令
terraform init
初始化工作目錄。這個步驟會下載指定設定所需的供應器。
terraform plan
產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。
- 接著,請執行
terraform apply
指令來建立資源,然後輸入yes
即可執行。
4. 工作 2:使用 PSC 附件建立 CloudSQL 執行個體 (Terraform)
我們將使用 Terraform 建立 CloudSQL 執行個體,並使用 PSC 選項允許連線。在資料庫專案中完成這項設定。
- 切換至 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
}
- 切換回 Cloud Shell 終端機,確認您位於 terraform-db 目錄中。接著,請執行
terraform apply
指令來建立資源,然後輸入yes
即可執行。建立 PSC 附件 CloudSQL 執行個體最多可能需要 5 分鐘。
驗證資料庫
- 完成後,請前往控制台的 SQL,選取新建立的 psc-sql-db 資料庫執行個體。
- 在左側展開 SQL 選項滑出式選單,然後選取「Connections」
- 您可以在摘要分頁下方查看連線相關資訊。
- 複製服務附件地址,並儲存在系統中的某處。
- 您需要這項資訊才能完成工作 3 步驟 8。
- 在左側展開 SQL 選項滑出式選單,然後選取「使用者」。
- 您應該會看到名為 testsql 的使用者,密碼為 cloudsql24(這會用於稍後存取資料庫)
5. 工作 3:設定消費者專案的環境 (Terraform)
在消費者專案中,我們會建立內含防火牆規則和子網路的自訂虛擬私有雲。開啟 Cloud 控制台,然後選取要使用的專案。
- 在控制台頂端的 Google Cloud 圖示右側,點選下拉式選單,然後選取「全部」分頁。
- 從清單中的專案中選取消費者專案 ID 即可繼續操作。
- 開啟控制台右上方的 Cloud Shell,確認 Cloud Shell 中顯示消費者專案 ID,確認任何允許存取權的提示。
- 建立名為 terraform-consumer 的資料夾,並將檔案移至該資料夾
mkdir terraform-consumer && cd terraform-consumer
- 建立 main.tf、variable.tf 和 psc.tf 檔案。
touch main.tf variable.tf psc.tf
- 切換至 消費者專案 ID 的 Cloud Shell 編輯器檢視畫面。選取「編輯器」,確認您已允許所有必要提示,以便介面載入。
- 載入完成後,請依序點選「File」>「Open Folder」,然後前往 /home/your-user-name/terraform-consumer,接著選取「Ok」,即可在編輯器中開啟資料夾。
- 選取 variable.tf 檔案,然後新增以下內容。將
your-consumer-project-id-here
文字替換為實際的消費者專案 ID,並加上引號。將your-psc-attachment-id-here
文字替換為 psc 附件地址,並加上引號。這是您在工作 2 的 2-5 節複製的 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-net" } variable "region_id" { type = string default = "us-east1" } variable "region_id2" { type = string default = "us-central1" }
- 接著,開啟 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" { 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"] }
- 切換回 Cloud Shell 終端機,確認您位於消費端專案中的 terraform-consumer 目錄
cd terraform-consumer
,然後執行下列指令
terraform init
初始化工作目錄。這個步驟會下載指定設定所需的供應器。
terraform plan
產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。
- 接著,請執行
terraform apply
指令來建立資源,然後輸入yes
即可執行。
6. 工作 4:在消費者專案和測試 VM 中,建立 PSC 端點至 SQL DB 附件 (Terraform)
在消費者專案中完成這項設定。
- 切換回 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 }
- 切換回 Cloud Shell 終端機,確認您位於消費端專案中的 terraform-consumer 目錄
cd terraform-consumer
,然後執行下列指令
terraform plan
產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。
- 接著,請執行
terraform apply
指令來建立資源,然後輸入yes
即可執行 - 由於 VM 和端點位於不同區域,因此我們需要啟用 PSC 端點上的全球存取權。我們會透過控制台執行此操作
- 在使用者專案控制台中前往「Private Service Connect」,在「Connected Endpoint」分頁標籤的「Endpoint」部分下方,選取「psc-sql-endpoint」
- 接著選取「編輯」,然後點選「啟用全球存取權」和「儲存」選項旁的「核取方塊」。
- 繼續進行下一個步驟,驗證連線
7. 工作 5:透過 PSC IP 位址驗證 VM 的端點連線
在消費者專案中完成這項操作
- 前往「VM Instance」。選取「sql-test-vm」
- 選取「SSH」SSH選項,連線至 VM。
- 透過下列項目,透過端點連線至資料庫:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
- 連線建立完成後,請使用以下 psc-sql-db 建立資料庫。
CREATE DATABASE remotesqldb;
- 完成後,輸入 exit 即可退出連線。
8. 工作 6:驗證資料庫項目
在資料庫專案中完成這項驗證
- 在控制台頂端的 Google Cloud 圖示右側,按一下下拉式選單,然後選取「全部」分頁。
- 從列出的專案中選取「資料庫」專案 ID 即可繼續操作。
- 前往「SQL」,選取資料庫「psc-sql-db」,展開 SQL 選項,然後選取「資料庫」。您應該會在消費者專案 VM 中看到剛建立的資料庫,名稱為 remotesqldb**
.
**
9. 清除
在資料庫專案中完成這項操作
- 選取資料庫專案 ID
- 前往 Cloud Shell,確認您看到資料庫專案 ID
- 前往 terraform-db 目錄
cd terraform-db
並執行下列指令terraform destroy
,然後輸入yes
,您在資料庫專案中使用 Terraform 建立的所有資源都會移除。
在消費者專案中完成這項操作
- 選取消費者專案 ID
- 前往 Cloud Shell,確認您看到消費端專案 ID
- 前往 terraform-consumer 目錄
cd terraform-consumer
並執行以下指令terraform destroy
,然後輸入yes
,您在資料庫專案中使用 Terraform 建立的所有資源都會移除。
10. 恭喜
恭喜,您已成功設定 Cloud SQL 執行個體,並在另一個 VPC 中建立 Private Service Connect 端點。您已成功透過 PSC 端點,從遠端 VM 連線至資料庫。
瞭解詳情
如要進一步瞭解 Private Service Connect 和 Cloud SQL,