在共享 VPC 宿主项目中配置连接器

如果您的组织使用共享 VPC,则您可以在服务项目或宿主项目中设置无服务器 VPC 访问通道连接器。本指南介绍了如何在宿主项目中设置连接器。

如果您需要在服务项目中设置连接器,请参阅在服务项目中配置连接器。如需了解每种方法的优点,请参阅连接到共享 VPC 网络

准备工作

  1. 检查您使用的账号的 Identity and Access Management (IAM) 角色。活跃账号必须在宿主项目上具有以下角色:

  2. 选择您的首选环境中的宿主项目。

通过在终端中运行以下命令,将 gcloud CLI 中的默认项目设置为宿主项目:

gcloud config set project HOST_PROJECT_ID

替换以下内容:

  • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID

创建 Serverless VPC Access 连接器

如需向您的 VPC 网络发送请求并接收相应的响应,您必须创建无服务器 VPC 访问通道连接器。您可以使用 Google Cloud CLI 或 Terraform 创建连接器:

gcloud

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

    gcloud components update
    
  2. 为您的项目启用 Serverless VPC Access 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 子网的名称。
      • 子网必须专供连接器使用。其他资源(例如虚拟机、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 模块创建 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 functions

为服务项目启用 Cloud Run functions API。这是在后续步骤中添加 IAM 角色以及在服务项目中使用 Cloud Run functions 所必需满足的前提条件。

在终端中运行以下命令:

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

替换以下内容:

  • SERVICE_PROJECT_ID:服务项目的 ID

提供对连接器的访问权限

通过在宿主项目上向服务项目授予 Cloud Run functions Service Agent Serverless VPC Access User IAM 角色来提供对连接器的访问权限。您还必须向 Cloud Run Service Agent 授予相同的角色。

  1. 在终端中运行以下命令:

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

    请替换以下内容:

    • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID
    • SERVICE_PROJECT_NUMBER:与服务项目关联的项目编号。该编号与项目 ID 不同。您可以通过运行以下命令找到项目编号:

      gcloud projects describe SERVICE_PROJECT_ID
      
  2. 您还可以通过运行以下命令向 Cloud Run Service Agent 授予角色:

    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
    

将连接器设置为可被发现

在宿主项目的 IAM 政策中,您必须向部署 Cloud Run 服务的主账号授予以下两个预定义角色:

或者,您也可以使用提供 Serverless VPC Access Viewer (vpcaccess.viewer) 角色的所有权限的自定义角色或其他预定义角色。

  1. 在终端中运行以下命令:

    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:共享 VPC 宿主项目的 ID
    • PRINCIPAL:部署 Cloud Run 服务的主账号。详细了解 --member 标志

将函数配置为使用连接器

对于需要访问共享 VPC 的每个函数,您必须为函数指定连接器。以下步骤显示了如何配置您的函数以使用连接器。

  1. 设置 gcloud CLI 以使用包含该函数的项目:

    gcloud config set project PROJECT_ID
    替换以下内容:

    • PROJECT_ID:包含需要访问共享 VPC 的函数的项目 ID。如果该函数位于宿主项目中,则这是宿主项目 ID。如果该函数位于服务项目中,则这是服务项目 ID。
  2. 使用 --vpc-connector 标志并部署函数:

    gcloud functions deploy FUNCTION_NAME --vpc-connector=CONNECTOR_NAME
    

    替换以下内容:

    • FUNCTION_NAME:函数的名称
    • CONNECTOR_NAME:连接器的名称。从共享 VPC 服务项目(而不是宿主项目)进行部署时,请使用完全限定名称,例如:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      其中 HOST_PROJECT_ID 是宿主项目的 ID,CONNECTOR_REGION 是连接器的区域,CONNECTOR_NAME 是您为连接器指定的名称。

如需更好地控制通过连接器路由哪些请求,请参阅出站流量设置

后续步骤