在 Shared VPC 主專案中設定連接器

如果貴機構使用 Shared VPC,您可以在服務專案或主專案中設定無伺服器 VPC 存取連接器。本指南說明如何在主專案中設定連接器。

如要在服務專案中設定連接器,請參閱「在服務專案中設定連接器」。如要瞭解各種方法的優點,請參閱「連線至 Shared VPC 網路」。

事前準備

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

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

控制台

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

    前往 Google Cloud 控制台資訊主頁

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

gcloud

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

gcloud config set project HOST_PROJECT_ID

更改下列內容:

  • HOST_PROJECT_ID:Shared VPC 主專案的 ID

建立無伺服器 VPC 存取連接器

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

控制台

  1. 為專案啟用無伺服器 VPC 存取 API。

    啟用 API

  2. 前往「Serverless VPC Access」(無伺服器 VPC 存取) 總覽頁面。

    前往「Serverless VPC Access」(無伺服器 VPC 存取)

  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 或負載平衡器) 無法使用這些子網路。
    • 如要確認子網路未用於 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. 點選「Create」(建立)

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

gcloud

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

    gcloud components update
    
  2. 為專案啟用無伺服器 VPC 存取 API:

    gcloud services enable vpcaccess.googleapis.com
    
  3. 建立無伺服器 VPC 存取連接器

    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 或負載平衡器) 無法使用這些子網路。
      • 如要確認子網路未用於 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 模組建立虛擬私有雲網路和子網路,然後建立連接器。

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 16.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    = "~> 16.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. 按一下「Enable」(啟用)

gcloud

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

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

更改下列內容:

  • SERVICE_PROJECT_ID:服務專案的 ID

提供連接器存取權

將主專案的無伺服器 VPC 存取使用者 IAM 角色授予服務專案的Cloud Run 服務代理程式,以提供連接器存取權。

控制台

  1. 開啟「IAM」頁面

    前往 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」(無伺服器 VPC 存取使用者)

  6. 按一下「Save」(儲存)

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:Shared VPC 主專案的 ID
  • SERVICE_PROJECT_NUMBER:與服務帳戶相關聯的專案編號。這與專案 ID 不同。您可以執行下列指令來找出專案編號:

    gcloud projects describe SERVICE_PROJECT_ID
    

讓連接器可供探索

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

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

控制台

  1. 開啟「IAM」頁面

    前往 IAM 頁面

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

  3. 按一下「新增」。

  4. 在「New principals」(新增主體) 欄位中,輸入應可從服務專案查看連接器的主體電子郵件地址。您可以在此欄位中輸入多個電子郵件地址。

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

    • 無伺服器 VPC 存取檢視者
    • Compute 網路檢視者
  6. 按一下「Save」(儲存)

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:Shared VPC 主專案的 ID
  • PRINCIPAL:部署 Cloud Run 服務的主體。進一步瞭解 --member 旗標

將服務設定為使用連接器

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

控制台

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

    前往 Cloud Run

  2. 從 Cloud Run 導覽選單中選取「服務」,然後點選「部署容器」,設定新服務。如要設定現有服務,請按一下該服務,然後按一下「編輯及部署新的修訂版本」

  3. 如要設定新服務,請填寫初始服務設定頁面,然後按一下「Containers, Networking, Security」(容器、網路、安全性) 展開服務設定頁面。

  4. 按一下「連結」分頁標籤。

    圖片

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

gcloud

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

    gcloud config set project PROJECT_ID
    更改下列內容:

    • PROJECT_ID:包含需要存取 Shared VPC 的 Cloud Run 資源專案 ID。如果 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:連結器的名稱。從 Shared VPC 服務專案 (而非主專案) 部署時,請使用完整名稱,例如:
      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:包含需要存取 Shared VPC 的 Cloud Run 資源專案 ID。如果 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:連結器的名稱。從 Shared VPC 服務專案 (而非主專案) 部署時,請使用完整名稱,例如:
      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"
    }
  }
}

後續步驟