設定私人服務存取權

本頁面說明如何在虛擬私有雲網路中設定私人服務存取權

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

事前準備

Cloud SQL 必須為用於私人 IP 連線的每個虛擬私有雲網路,啟用私人服務存取權。如要管理私人服務存取權連線,使用者應具備下列 IAM 權限:

  • compute.networks.list
  • compute.addresses.create
  • compute.addresses.list
  • servicenetworking.services.addPeering

如果沒有這些權限,可能會發生權限不足錯誤。

如果您使用共用虛擬私有雲網路,則也必須:

  • 將使用者新增至主專案。
  • 在主專案中,將這四項權限指派給該使用者。
  • compute.globalAddresses.list IAM 權限授予使用者。

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

私人服務存取設定程序分為兩個部分:

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

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

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

  • 從虛擬私有雲網路建立與基礎服務供應商網路的私人連線。

分配 IP 位址範圍

主控台

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

    前往「VPC networks」(虛擬私有雲網路)

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

gcloud

執行下列其中一個步驟:

  • 如要指定位址範圍與前置字串長度 (子網路遮罩),請使用 addressesprefix-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」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 選取要使用的 VPC 網路。
  3. 選取 [Private service connection] (私人服務連線) 分頁標籤。
  4. 選取「Private connections to services」(私人服務連線) 分頁標籤。
  5. 按一下 [Create connection] (建立連線),在網路與服務生產端之間建立私人連線。
  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」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

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

  6. 按一下「發布」

  7. 按一下「Allocate IP range」(分配 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 位址,請將執行個體從原始網路移至臨時 VPC 網路。接著變更執行個體原始網路的私人服務存取權設定,然後將 Cloud SQL 執行個體移回原始網路。

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

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

控制台

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

    前往「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