在共用虛擬私有雲主機專案中設定連接器

如果貴組織使用共用虛擬私有雲,您可以在服務專案或主專案中設定 Serverless VPC Access 連接器。本指南說明如何在主機專案中設定連接器。

如果您需要在服務專案中設定連接器,請參閱「在服務專案中設定連接器」。如要瞭解各個方法的優點,請參閱「連線至共用虛擬私有雲網路」一文。

事前準備

  1. 檢查目前使用的帳戶的 身分與存取權管理 (IAM) 角色。有效帳戶必須在主機專案中具備下列角色:

  2. 在偏好的環境中選取主專案。

控制台

  1. 開啟 Google Cloud 控制台資訊主頁。

    前往 Google Cloud 控制台資訊主頁

  2. 在資訊主頁頂端的選單列中,按一下專案下拉式選單,然後選取主機專案。

gcloud

在終端機中執行下列指令,將 gcloud CLI 中的預設專案設為主機專案:

gcloud config set project HOST_PROJECT_ID

更改下列內容:

  • HOST_PROJECT_ID:共用虛擬私有雲主專案的 ID

建立 Serverless VPC Access 連接器

如要向虛擬私人雲端網路傳送要求並接收相應回應,您必須建立無伺服器虛擬私人雲端存取連接器。您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 建立連接器:

主控台

  1. 為專案啟用 Serverless VPC Access API。

    啟用 API

  2. 前往「Serverless VPC Access」(無伺服器虛擬私人雲端存取) 總覽頁面。

    前往「Serverless VPC Access」(無伺服器虛擬私人雲端存取) 頁面

  3. 按一下 [Create connector] (建立連接器)

  4. 在「Name」欄位中,輸入連接器的名稱。名稱必須遵循 Compute Engine 命名慣例,且長度不得超過 21 個半形字元。連字號 (-) 算作兩個字元。

  5. 在「Region」(地區) 欄位中,選取連接器所在的地區。這必須與無伺服器服務的地區相符。

    如果您的服務位於 us-centraleurope-west 區域,請使用 us-central1europe-west1

  6. 在「Network」(網路) 欄位中,選取要附加連接器的虛擬私有雲網路。

  7. 按一下「Subnetwork」下拉式選單:

    選取未使用的 /28 子網路。

    • 子網路只能由連接器使用。其他資源 (例如 VM、Private Service Connect 或負載平衡器) 無法使用這些 IP 位址。
    • 如要確認子網路未用於 Private Service Connect 或 Cloud Load Balancing,請在 gcloud CLI 中執行下列指令,檢查子網路 purpose 是否為 PRIVATE
      gcloud compute networks subnets describe SUBNET_NAME
      
      SUBNET_NAME 替換為子網路名稱。
  8. (選用) 如要設定縮放選項以便進一步控制連接器,請按一下「Show Scaling Settings」,顯示縮放表單。

    1. 設定連接器的執行個體數量下限和上限,或使用預設值 (2 為下限,10 為上限)。隨著流量增加,連接器會向外擴充至指定的最大值,但連接器不會在流量減少時縮減。您必須使用介於 210 之間的值,且 MIN 值必須小於 MAX 值。
    2. 在「Instance Type」下拉式選單中,選擇要用於連接器的機器類型,或使用預設的 e2-micro。選擇執行個體類型時,請注意右側的費用側欄,這裡會顯示頻寬和費用預估值。
  9. 按一下 [建立]。

  10. 若連接器可供使用,其名稱旁邊會顯示一個綠色勾號。

gcloud

  1. gcloud 元件更新至最新版本:

    gcloud components update
    
  2. 為專案啟用 Serverless VPC Access API:

    gcloud services enable vpcaccess.googleapis.com
    
  3. 建立無伺服器虛擬私有雲端存取連接器:

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
    --region=REGION \
    --subnet=SUBNET \
    --subnet-project=HOST_PROJECT_ID \
    # Optional: specify minimum and maximum instance values between 2 and 10, default is 2 min, 10 max.
    --min-instances=MIN \
    --max-instances=MAX \
    # Optional: specify machine type, default is e2-micro
    --machine-type=MACHINE_TYPE

    更改下列內容:

    • CONNECTOR_NAME:連接器名稱。名稱必須遵循 Compute Engine 命名慣例,且長度不得超過 21 個半形字元。連字號 (-) 算作兩個字元。
    • REGION:連接器的區域,必須與無伺服器服務的區域相符。如果您的服務位於 us-centraleurope-west 地區,請使用 us-central1europe-west1
    • SUBNET:未使用的 /28 子網路名稱。
      • 子網路只能由連接器使用。其他資源 (例如 VM、Private Service Connect 或負載平衡器) 無法使用這些 IP 位址。
      • 如要確認子網路未用於 Private Service Connect 或 Cloud Load Balancing,請在 gcloud CLI 中執行下列指令,檢查子網路 purpose 是否為 PRIVATE
        gcloud compute networks subnets describe SUBNET_NAME
        
        替換下列內容:
        • SUBNET_NAME:子網路名稱
    • HOST_PROJECT_ID:主機專案的 ID
    • MIN:連接器可使用的最少執行個體數量。請使用介於 29 之間的整數。預設值為 2。如要瞭解連接器資源調度,請參閱「吞吐量和資源調度」。
    • MAX:連接器可使用的執行個體數量上限。請使用介於 310 之間的整數。預設值為 10。如果流量需要,連接器會擴展至 [MAX] 執行個體,但不會縮減回來。如要瞭解連接器資源調度,請參閱「吞吐量和資源調度」。
    • MACHINE_TYPEf1-microe2-microe2-standard-4。如要瞭解連接器的傳輸量 (包括機器類型和資源調度),請參閱「傳輸量和資源調度」一文。

    如需更多詳細資料和選用引數,請參閱 gcloud 參考資料

  4. 先驗證您的連接器是否處於 READY 狀態,然後再使用:

    gcloud compute networks vpc-access connectors describe CONNECTOR_NAME \
    --region=REGION

    更改下列內容:

    • CONNECTOR_NAME:連接器名稱,也就是您在上一個步驟中指定的名稱
    • REGION:連接器的地區,也就是您在上一個步驟中指定的地區

    輸出內容應包含 state: READY 這一行。

Terraform

您可以使用 Terraform 資源啟用 vpcaccess.googleapis.com API。

resource "google_project_service" "vpcaccess-api" {
  project = var.project_id # Replace this with your project ID in quotes
  service = "vpcaccess.googleapis.com"
}

您可以使用 Terraform 模組建立 VPC 網路和子網路,然後建立連接器。

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 10.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "my-serverless-network"
  mtu          = 1460

  subnets = [
    {
      subnet_name   = "serverless-subnet"
      subnet_ip     = "10.10.10.0/28"
      subnet_region = "us-central1"
    }
  ]
}

module "serverless-connector" {
  source     = "terraform-google-modules/network/google//modules/vpc-serverless-connector-beta"
  version    = "~> 10.0"
  project_id = var.project_id
  vpc_connectors = [{
    name        = "central-serverless"
    region      = "us-central1"
    subnet_name = module.test-vpc-module.subnets["us-central1/serverless-subnet"].name
    # host_project_id = var.host_project_id # Specify a host_project_id for shared VPC
    machine_type  = "e2-standard-4"
    min_instances = 2
    max_instances = 7
    }
    # Uncomment to specify an ip_cidr_range
    #   , {
    #     name          = "central-serverless2"
    #     region        = "us-central1"
    #     network       = module.test-vpc-module.network_name
    #     ip_cidr_range = "10.10.11.0/28"
    #     subnet_name   = null
    #     machine_type  = "e2-standard-4"
    #     min_instances = 2
    #   max_instances = 7 }
  ]
  depends_on = [
    google_project_service.vpcaccess-api
  ]
}

為服務專案啟用 Cloud Run

為服務專案啟用 Cloud Run API。這項操作是為了在後續步驟中新增 IAM 角色,以及讓服務專案使用 Cloud Run。

主控台

  1. 開啟 Cloud Run API 頁面。

    Cloud Run API

  2. 在資訊主頁頂端的選單列中,按一下專案下拉式選單,然後選取服務專案。

  3. 按一下「啟用」

gcloud

在終端機中執行下列指令:

gcloud services enable run.googleapis.com --project=SERVICE_PROJECT_ID

更改下列內容:

  • SERVICE_PROJECT_ID:服務專案的 ID

提供連接器存取權

在主機專案中,將 無伺服器虛擬私有雲存取使用者 IAM 角色授予服務專案的 Cloud Run 服務代理程式,即可提供連接器存取權。

主控台

  1. 開啟 IAM 頁面。

    前往身分與存取權管理頁面

  2. 按一下專案下拉式選單,然後選取主機專案。

  3. 按一下「新增」。

  4. 在「New principals」欄位中,輸入 Cloud Run 服務的 Cloud Run 服務代理程式電子郵件地址:

    service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

    更改下列內容:

    • SERVICE_PROJECT_NUMBER:與服務專案相關聯的專案編號。這與專案 ID 不同。您可以在Google Cloud 控制台的服務專案「Project Settings」頁面中找到專案編號。
  5. 在「Role」欄位中,選取「Serverless VPC Access User」

  6. 按一下 [儲存]

gcloud

在終端機中執行下列指令:

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=serviceAccount:service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \
--role=roles/vpcaccess.user

更改下列內容:

  • HOST_PROJECT_ID:共用虛擬私有雲主專案的 ID
  • SERVICE_PROJECT_NUMBER:與服務帳戶相關聯的專案編號。這與專案 ID 不同。您可以執行以下指令來找出專案編號:

    gcloud projects describe SERVICE_PROJECT_ID
    

讓連接器可供探索

在主機專案的 IAM 政策中,您必須將下列兩個預先定義的角色授予部署 Cloud Run 服務的主體:

或者,您也可以使用自訂角色或其他預先定義的角色,這些角色包含無伺服器虛擬私人雲端存取檢視者 (vpcaccess.viewer) 角色的所有權限。

主控台

  1. 開啟 IAM 頁面。

    前往身分與存取權管理頁面

  2. 按一下專案下拉式選單,然後選取主機專案。

  3. 按一下「新增」。

  4. 在「New principals」欄位中,輸入主體的電子郵件地址,該主體應可透過服務專案查看連接器。您可以在這個欄位中輸入多個電子郵件地址。

  5. 在「Role」欄位中,選取下列兩個角色:

    • 無伺服器虛擬私有雲存取檢視器
    • Compute 網路檢視器
  6. 按一下 [儲存]

gcloud

在終端機中執行下列指令:

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=PRINCIPAL \
--role=roles/vpcaccess.viewer

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=PRINCIPAL \
--role=roles/compute.networkViewer

更改下列內容:

  • HOST_PROJECT_ID:共用虛擬私有雲主專案的 ID
  • PRINCIPAL:部署 Cloud Run 服務的使用者。進一步瞭解 --member 標記

將服務設定為使用連接器

針對需要存取共用 VPC 的每個 Cloud Run 服務,您必須為服務指定連接器。部署新服務或更新現有服務時,您可以使用 Google Cloud 控制台、Google Cloud CLI、YAML 檔案或 Terraform 指定連接器。

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 從選單中選取「Services」(服務),然後按一下「Deploy container」(部署容器),即可設定新的服務。如果您要設定現有服務,請按一下該服務,然後點選「編輯並部署新修訂版本」

  3. 如果您要設定新服務,請填寫初始服務設定頁面,然後按一下「容器、磁碟區、網路與安全性」展開服務設定頁面。

  4. 按一下「連線設定」分頁標籤。

    圖片

    • 在「VPC Connector」(虛擬私有雲連接器) 欄位中,選取要使用的連接器,或選取「None」(無),將服務與虛擬私有雲網路中斷連線。
  5. 按一下 [Create] (建立) 或 [Deploy] (部署)

gcloud

  1. 將 gcloud CLI 設為使用包含 Cloud Run 資源的專案:

    gcloud config set project PROJECT_ID
    取代下列內容:

    • PROJECT_ID:專案 ID,其中包含需要存取共用虛擬私有雲的 Cloud Run 資源。如果 Cloud Run 資源位於主機專案中,則為主機專案 ID。如果 Cloud Run 資源位於服務專案中,則為服務專案 ID。
  2. 使用 --vpc-connector 標記。

  • 現有服務:
    gcloud run services update SERVICE --vpc-connector=CONNECTOR_NAME
  • 新服務:
    gcloud run deploy SERVICE --image=IMAGE_URL --vpc-connector=CONNECTOR_NAME
    替換下列內容:
    • SERVICE:服務名稱
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest
    • CONNECTOR_NAME:連接器的名稱。從共用虛擬私有雲服務專案 (而非主專案) 部署時,請使用完整的名稱,例如:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      其中 HOST_PROJECT_ID 是主機專案的 ID,CONNECTOR_REGION 是連接器的區域,而 CONNECTOR_NAME 則是您為連接器指定的名稱。

YAML

將 gcloud CLI 設為使用包含 Cloud Run 資源的專案:

gcloud config set project PROJECT_ID

更改下列內容:

  • PROJECT_ID:專案 ID,其中包含需要存取共用虛擬私有雲的 Cloud Run 資源。如果 Cloud Run 資源位於主機專案中,則為主機專案 ID。如果 Cloud Run 資源位於服務專案中,則為服務專案 ID。
  1. 如果您要建立新服務,請略過這個步驟。如果您要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 在頂層 spec 屬性下方,新增或更新 annotations 屬性下的 run.googleapis.com/vpc-access-connector 屬性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/vpc-access-connector: CONNECTOR_NAME
          name: REVISION

    更改下列內容:

    • SERVICE:Cloud Run 服務名稱。
    • CONNECTOR_NAME:連接器的名稱。從共用虛擬私有雲服務專案 (而非主專案) 部署時,請使用完整的名稱,例如:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      其中 HOST_PROJECT_ID 是主機專案的 ID,CONNECTOR_REGION 是連接器的區域,而 CONNECTOR_NAME 則是您為連接器指定的名稱。
    • REVISION 並使用新的修訂版本名稱,或刪除該版本 (如有)。如果您提供新的修訂版本名稱,則該名稱必須符合下列條件:
      • 開頭為 SERVICE-
      • 只能包含小寫英文字母、數字和 -
      • 結尾不是 -
      • 長度不得超過 63 個半形字元
  3. 使用下列指令,將服務替換為新設定:

    gcloud run services replace service.yaml

Terraform

您可以使用 Terraform 資源建立服務,並將服務設為使用連接器。

# Cloud Run service
resource "google_cloud_run_v2_service" "gcr_service" {
  name     = "mygcrservice"
  location = "us-west1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
      resources {
        limits = {
          cpu    = "1000m"
          memory = "512Mi"
        }
      }
      # the service uses this SA to call other Google Cloud APIs
      # service_account_name = myservice_runtime_sa
    }

    scaling {
      # Limit scale up to prevent any cost blow outs!
      max_instance_count = 5
    }

    vpc_access {
      # Use the VPC Connector
      connector = google_vpc_access_connector.connector.id
      # all egress from the service should go through the VPC Connector
      egress = "ALL_TRAFFIC"
    }
  }
}

後續步驟