Google Cloud 上的外部网络访问和专用连接

本主题提供配置详细信息,通过 外部网络访问 设置对 Google Cloud 外部服务的出站专用连接。出站公共连接和出站专用连接配置之间的主要区别在于,使用专用连接时,您必须执行以下操作:

  • 创建专用连接端点。此步骤需要 ACCOUNTADMIN 角色。

  • 创建网络规则,以便将 TYPE 属性设置为 PRIVATE_HOST_PORT

出站专用连接成本

您为每个专用连接端点以及处理的总数据量付费。有关这些项目的定价,请参阅 Snowflake 服务使用量表

在 ACCOUNT_USAGE 和 ORGANIZATION_USAGE 架构中查询计费视图时,可以通过筛选以下服务类型来查看这些项目的成本:

  • OUTBOUND_PRIVATELINK_ENDPOINT

  • OUTBOUND_PRIVATELINK_DATA_PROCESSED

例如,您可以查询 USAGE_IN_CURRENCY_DAILY 视图并筛选这些服务类型。

配置外部网络访问

要在 Google Cloud 上配置带有外部网络访问的出站专用连接,请执行以下步骤:

  1. 在 Snowflake 中,调用 SYSTEM$PROVISION_PRIVATELINK_ENDPOINT 系统函数以在 Snowflake VNet 中预置专用连接端点,使 Snowflake 能够通过专用连接来连接到 Google Cloud 外部服务:

    USE ROLE ACCOUNTADMIN;
    
    SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
      'projects/<project_id>/regions/us-west2/serviceAttachments/cloud-func',
      'my-hello-echo-function.com',
    );
    
    Copy
  2. 在 Google Cloud console 中,转至服务附件并接受新连接的 Snowflake 项目。

  3. 在 Snowflake 中,创建 网络规则,指定 PRIVATE_HOST_PORT 属性以启用专用连接:

    CREATE DATABASE IF NOT EXISTS external_access_db;
    
    CREATE OR REPLACE NETWORK RULE external_access_db.public.cloud_func_rule
      MODE = EGRESS
      TYPE = PRIVATE_HOST_PORT
      VALUE_LIST = ('my-hello-echo-function:443');
    
    Copy
  4. 在 Snowflake 中,创建 外部访问集成,指定上一步中的网络规则:

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION web_server_eai
      ALLOWED_NETWORK_RULES = (external_access_db.public.cloud_func_rule)
      ENABLED = TRUE;
    
    Copy
  5. 在 Snowflake 中,执行以下 SQL 语句以创建可以使用外部访问集成的函数:

    CREATE OR REPLACE FUNCTION call_func(name VARCHAR)
      returns VARCHAR
      LANGUAGE JAVA
      EXTERNAL_ACCESS_INTEGRATIONS = (web_server_eai)
      HANDLER = 'UDFClient.call'
      AS
      $$
      import java.net.http.HttpClient;
      import java.net.http.HttpRequest;
      import java.net.http.HttpResponse;
      import java.net.URI;
      import java.io.IOException;
    
      public class UDFClient {
        private HttpClient client;
    
        public UDFClient() {
          this.client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
     }
    
      public String call(String name) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
             .header("Content-Type", "application/json")
             .uri(URI.create("http://my-hello-echo-function?name=" + name))
             .GET()
             .build();
    
        HttpResponse<String> response =
             client.send(request, HttpResponse.BodyHandlers.ofString());
    
        return String.valueOf(response.body());
       }
      }
      $$;
    
    Copy
  6. 在 Snowflake 中,调用您在上一步中创建的函数:

    SELECT call_func("snowflake");
    
    -- Returns "Hello snowflake!"
    
    Copy

如果外部网络访问集成不再需要专用连接端点,请调用 SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT 系统函数。

语言: 中文