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 上配置带有外部网络访问的出站专用连接,请执行以下步骤:
在 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', );
在 Google Cloud console 中,转至服务附件并接受新连接的 Snowflake 项目。
在 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');
在 Snowflake 中,创建 外部访问集成,指定上一步中的网络规则:
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION web_server_eai ALLOWED_NETWORK_RULES = (external_access_db.public.cloud_func_rule) ENABLED = TRUE;
在 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()); } } $$;
在 Snowflake 中,调用您在上一步中创建的函数:
SELECT call_func("snowflake"); -- Returns "Hello snowflake!"
如果外部网络访问集成不再需要专用连接端点,请调用 SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT 系统函数。