設定私人服務存取權

本頁面說明如何在虛擬私有雲網路中設定私人服務連線。

私人服務連線會以虛擬私有雲對接連線的形式運作,連結您的虛擬私有雲網路與 Cloud SQL 執行個體所在的基礎 Google Cloud 虛擬私有雲網路。私人連線提供內部 IP 位址,可讓虛擬私有雲網路中的 VM 執行個體和您存取的服務進行專屬通訊。VM 執行個體不需要網際網路存取權或外部 IP 位址,即可透過私人服務存取權存取服務。

事前準備

Cloud SQL 必須為用於私人 IP 連線的每個虛擬私有雲網路,啟用私人服務存取。

啟用必要的 API

在 Cloud SQL 執行個體所在的專案中,啟用 Service Networking API (servicenetworking.googleapis.com) 和 Compute Engine API (compute.googleapis.com)。如果您使用 Shared VPC 虛擬私有雲網路,也必須在 Shared VPC 主機專案中啟用下列 API:

gcloud services enable servicenetworking.googleapis.com compute.googleapis.com --project=PROJECT_ID

將 PROJECT_ID 替換為專案 ID (或 Shared VPC 主機專案 ID)。

如果未啟用 Service Networking API,建立使用私人 IP 的 Cloud SQL 執行個體時會失敗,並顯示 SERVICE_NETWORKING_NOT_ENABLED。

所需角色和權限

如要取得管理私人服務連線所需的權限,請要求管理員在代管 Cloud SQL 執行個體的專案中,授予您「Compute 網路管理員 」(roles/compute.networkAdmin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這個預先定義的角色具備管理私人服務存取連線所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要管理私人服務連線,您必須具備下列權限:

  • compute.addresses.create
  • compute.addresses.list
  • compute.globalAddresses.create
  • compute.globalAddresses.createInternal
  • compute.globalAddresses.list
  • compute.networks.list
  • compute.networks.use
  • servicenetworking.services.addPeering
  • serviceusage.services.list

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

如果您使用 Shared VPC 網路,也必須在 Shared VPC 主專案中,將 Compute 網路管理員 (roles/compute.networkAdmin) 角色授予使用者。

設定 Cloud SQL 的私人服務存取權

私人服務連線設定程序分為兩個部分:

  • 選取現有 IP 位址範圍,或分配新的 IP 位址範圍。

    你也可以選擇讓 Google 為你分配範圍。在這種情況下,Google 會自動分配前置長度為 /24 的 IP 範圍,並以「default-ip-range」命名。

    如果您要在多個區域中建立執行個體,或是建立不同資料庫類型的執行個體,則每個區域或資料庫類型都必須有至少 /24 範圍的可用 IP 位址。包括 Filestore 或 Memorystore 等其他應用程式。如果是新區域或資料庫類型,Cloud SQL 必須有免費的 /24 範圍。

  • 從虛擬私有雲網路建立連至底層服務供應商網路的私人連線。

分配 IP 位址範圍

控制台

  1. 前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。

    前往虛擬私有雲網路

  2. 選取要使用的虛擬私有雲網路。
  3. 選取「私人服務存取權」分頁標籤。
  4. 選取「分配的服務 IP 範圍」分頁標籤。
  5. 按一下「分配 IP 範圍」。
  6. 在分配範圍的「名稱」中,指定 google-managed-services-VPC_NETWORK_NAME,其中 VPC_NETWORK_NAME 是您要連線的虛擬私有雲網路名稱 (例如 google-managed-services-default)。「說明」為選填。
  7. 選取「自訂」選項,然後以 CIDR 標記法輸入要分配的 IP 位址範圍。
  8. 按一下 [Allocate] (分配),建立已分配範圍。

gcloud

執行下列其中一個步驟:

  • 如要指定位址範圍和前置字串長度 (子網路遮罩),請使用 addresses 和 prefix-length 旗標。舉例來說,如要分配 CIDR 區塊 192.168.0.0/16,請為位址指定 192.168.0.0,並為前置字串長度指定 16。
  •         gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \
            --global \
            --purpose=VPC_PEERING \
            --addresses=192.168.0.0 \
            --prefix-length=16 \
            --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
            
  • 如要只指定前置字元長度 (子網路遮罩),請使用 prefix-length 標記。如果省略位址範圍, Google Cloud會自動選取虛擬私有雲網路中未使用的位址範圍。以下範例選取前置長度為 16 位元的未使用 IP 位址範圍。
  •         gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \
            --global \
            --purpose=VPC_PEERING \
            --prefix-length=16 \
            --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
            

將 VPC_NETWORK_NAME 替換為虛擬私有雲網路名稱,例如 my-vpc-network。

以下範例會分配 IP 範圍,允許虛擬私有雲網路 my-vpc-network 中的資源使用私人 IP 連線至 Cloud SQL 執行個體。

    gcloud compute addresses create google-managed-services-my-vpc-network \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=16 \
    --network=projects/myprojectid/global/networks/myvpcnetwork \
    --project=my-project
    

Terraform

如要分配 IP 位址範圍,請使用 Terraform 資源。

resource "google_compute_global_address" "private_ip_address" {
  name          = "private-ip-address"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16
  network       = google_compute_network.peering_network.id
}

套用變更

如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節的步驟。

準備 Cloud Shell

  1. 啟動 Cloud Shell。
  2. 設定要套用 Terraform 設定的預設 Google Cloud 專案。

    每個專案只需要執行一次這個指令,而且可以在任何目錄中執行。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 設定檔中設定明確值,環境變數就會遭到覆寫。

準備目錄

每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。

  1. 在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱的副檔名必須為 .tf,例如 main.tf。在本教學課程中,這個檔案稱為 main.tf。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您正在學習教學課程,可以複製每個章節或步驟中的程式碼範例。

    將程式碼範例複製到新建立的 main.tf 中。

    (選用) 從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議使用這個方法。

  3. 請檢查並修改範例參數,然後套用至您的環境。
  4. 儲存變更。
  5. 初始化 Terraform。每個目錄只需執行一次。
    terraform init

    如要使用最新版 Google 供應商,請視需要加入 -upgrade 選項:

    terraform init -upgrade

套用變更

  1. 查看設定,確認 Terraform 即將建立或更新的資源符合您的預期:
    terraform plan

    視需要修正設定。

  2. 執行下列指令,並在提示中輸入 yes,套用 Terraform 設定:
    terraform apply

    等待 Terraform 顯示「Apply complete!」訊息。

  3. 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。

刪除變更

執行下列指令,並在提示中輸入 yes,即可移除先前透過 Terraform 設定套用的資源:

terraform destroy

建立私人連線

控制台

  1. 前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。

    前往虛擬私有雲網路

  2. 選取要使用的虛擬私有雲網路。
  3. 選取 [Private service connection] (私人服務連線) 分頁標籤。
  4. 選取「Private connections to services」(私人服務連線) 分頁。
  5. 按一下「建立連線」,在您的網路與服務供應商之間建立私人連線。
  6. 針對「Assigned allocation」(已指派的分配範圍),選取尚未由其他服務供應商使用的一或多個現有分配範圍。
  7. 按一下 [Connect] (連線) 建立連線。

gcloud

  1. 建立私人連線。

    gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-VPC_NETWORK_NAME \
    --network=VPC_NETWORK_NAME \
    --project=PROJECT_ID

    這個指令會啟動長時間執行的 Cloud SQL 執行個體作業,並傳回作業 ID。

  2. 確認作業是否已經成功完成。

    gcloud services vpc-peerings operations describe \
    --name=OPERATION_ID

您可以在建立私人連線時指定多個分配範圍,舉例來說,如果範圍已用盡,您可以指派額外的分配範圍。服務會按照您指定的順序,使用所有提供的範圍中的 IP 位址。

Terraform

如要建立私人連線,請使用 Terraform 資源。

resource "google_service_networking_connection" "default" {
  network                 = google_compute_network.peering_network.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}

建立私有連線時,系統會將 servicenetworking.serviceAgent 角色授予 service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com 格式的服務帳戶,因為帳戶是即時佈建。

如果看到專案的 compute.globalAddresses.list 權限或 compute.projects.get 權限錯誤訊息,請執行以下 gcloud 指令:

gcloud projects add-iam-policy-binding HOST_PROJECT_NAME \
    --member=serviceAccount:service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com \
    --role=roles/servicenetworking.serviceAgent

變更私人服務存取設定

您可以變更私人服務連線的已分配位址範圍,不必修改任何現有的 Cloud SQL 執行個體。如要變更現有 Cloud SQL 執行個體的私人 IP 位址,請按照這些步驟操作。

如要變更分配的位址範圍,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。

    前往虛擬私有雲網路

  2. 選取要使用的虛擬私有雲網路。
  3. 選取 [Private service connection] (私人服務連線) 分頁標籤。
  4. 選取「分配的服務 IP 範圍」分頁標籤。
  5. 選取要刪除的範圍名稱。

  6. 按一下「發布」。

  7. 按一下「分配 IP 範圍」。

  8. 建立同名的新範圍和新範圍

    這個名稱很重要,因為私人連線已使用該位址名稱建立。

gcloud services vpc-peerings update \
--network=VPC_NETWORK_NAME \
--ranges=ALLOCATED_RANGES \
--service=servicenetworking.googleapis.com \
--force

變更現有 Cloud SQL 執行個體的私人 IP 位址

如要變更現有 Cloud SQL 執行個體的私人 IP 位址,請將執行個體從原始網路移至臨時虛擬私有雲網路。然後變更執行個體原始網路的私人服務存取設定,並將 Cloud SQL 執行個體移回原始網路。

如要改用其他虛擬私有雲網路,請按照下列程序操作,但最後一個步驟 (將執行個體移回) 除外。在本例中,TEMPORARY_VPC_NETWORK_NAME 是新的虛擬私有雲網路。此外,請刪除舊的私人連線。刪除的私人連線可能要過幾天,才會從Google Cloud 控制台中消失。

如果 Cloud SQL 執行個體託管於 Shared VPC 網路,下列操作說明中使用的 VPC_NETWORK_NAME 變數必須是主專案的虛擬私有雲網路名稱。如要指定使用 Shared VPC 網路的網路,請使用網路的完整網址,例如 projects/HOST_PROJECT/global/networks/NETWORK_NAME。

控制台

  1. 前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。

    前往虛擬私有雲網路

  2. 建立暫時性虛擬私有雲網路。
  3. 在臨時虛擬私有雲網路中建立 IP 分配。
  4. 在臨時虛擬私有雲網路中建立私人連線。
  5. 將 Cloud SQL 執行個體移至臨時虛擬私有雲網路。

    gcloud beta sql instances patch INSTANCE_ID \
      --project=PROJECT_ID \
      --network=projects/PROJECT_ID/global/networks/TEMPORARY_VPC_NETWORK_NAME \
      --no-assign-ip
  6. 變更原始網路中的私人服務連線設定,新增或刪除已分配的範圍。

  7. 將 Cloud SQL 執行個體移回原始 VPC 網路。

    gcloud beta sql instances patch INSTANCE_ID \
      --project=PROJECT_ID \
      --network=projects/PROJECT_ID/global/networks/ORIGINAL_VPC_NETWORK_NAME \
      --no-assign-ip