設定私人服務存取權

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

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

事前準備

對於用於私人 IP 連線的每個 VPC 網路,Cloud SQL 都需要私人服務存取權。如要管理私人服務存取權連線,使用者必須具備下列 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. 按一下「分配 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 已建立或更新這些資源。

刪除變更

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

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]
}

service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com 格式的服務帳戶會在建立私人連線時獲得 servicenetworking.serviceAgent 角色,因為帳戶已即時佈建。

如果您看到有關專案 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. 按一下「分配 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 執行個體移至臨時 VPC 網路。

    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