Microsoft Azure 上的外部网络访问和专用连接¶
本主题提供配置详细信息,通过 外部网络访问 设置对外部服务的出站专用连接。出站公共连接和出站专用连接配置之间的主要区别在于,使用专用连接时,您必须执行以下操作:
创建专用连接端点。此步骤需要 ACCOUNTADMIN 角色。
创建网络规则以使用
PRIVATE_HOST_PORT
属性。此属性包括 Azure URL 和端口号,这使得从 Snowflake 到 Microsoft Azure 的连接可以通过 Microsoft Azure 内部网络进行,从而避开公共互联网。
出站专用连接成本¶
您为每个专用连接端点以及处理的总数据量付费。有关这些项目的定价,请参阅 Snowflake 服务使用量表。
在 ACCOUNT_USAGE 和 ORGANIZATION_USAGE 架构中查询计费视图时,可以通过筛选以下服务类型来查看这些项目的成本:
OUTBOUND_PRIVATELINK_ENDPOINT
OUTBOUND_PRIVATELINK_DATA_PROCESSED
例如,您可以查询 USAGE_IN_CURRENCY_DAILY 视图并筛选这些服务类型。
配置外部网络访问¶
对于在 Microsoft Azure 上结合使用出站专用连接与外部网络访问,这些步骤是独一无二的:
调用 SYSTEM$PROVISION_PRIVATELINK_ENDPOINT 系统函数以在 Snowflake VNet 中预置专用连接端点,使 Snowflake 能够通过专用连接来连接到外部服务:
USE ROLE ACCOUNTADMIN; SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT( '/subscriptions/1111-22-333-4444-55555/resourceGroups/external-access/providers/Microsoft.Sql/servers/externalaccessdemo', 'externalaccessdemo.database.windows.net', 'sqlServer' );
在 Azure 门户中,作为 Azure API Management 资源的所有者,批准专用端点。有关更多信息,请参阅 Microsoft Azure 文档 (https://learn.microsoft.com/en-us/azure/private-link/manage-private-endpoint?tabs=manage-private-link-powershell#private-endpoint-connections)。
-
CREATE DATABASE ext_network_access_db; CREATE SCHEMA secrets; CREATE SCHEMA network_rules; CREATE SCHEMA procedures;
创建 网络规则,指定
PRIVATE_HOST_PORT
属性以启用专用连接:CREATE OR REPLACE NETWORK RULE ext_network_access_db.network_rules.azure_sql_private_rule MODE = EGRESS TYPE = PRIVATE_HOST_PORT VALUE_LIST = ('externalaccessdemo.database.windows.net');
创建 密钥,以安全存储访问凭据:
CREATE OR REPLACE SECRET ext_network_access_db.secrets.secret_password TYPE = PASSWORD USERNAME = 'my-username' PASSWORD = 'my-password';
创建 外部访问集成,指定上一步中的网络规则:
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION azure_private_access_sql_store_integration ALLOWED_NETWORK_RULES = (ext_network_access_db.network_rules.azure_sql_private_rule) ALLOWED_AUTHENTICATION_SECRETS = (ext_network_access_db.secrets.secret_password) ENABLED = TRUE;
创建 过程,以连接到外部服务:
CREATE OR REPLACE PROCEDURE ext_network_access_db.procedures.connect_azure_sqlserver() RETURNS TABLE() LANGUAGE PYTHON RUNTIME_VERSION = 3.10 HANDLER = 'connect_sqlserver' EXTERNAL_ACCESS_INTEGRATIONS = (azure_private_access_sql_store_integration) SECRETS = ('cred' = ext_network_access_db.secrets.secret_password) IMPORTS=('@demo/pytds.zip') PACKAGES = ('snowflake-snowpark-python','pyopenssl','bitarray','certifi') AS $$ import pytds import certifi import _snowflake from snowflake.snowpark import types as T def connect_sqlserver(session): server = 'externalaccessdemo.database.windows.net' database = 'externalaccess' username_password_object = _snowflake.get_username_password('cred'); # Create a connection to the database with pytds.connect(server, database, username_password_object.username, username_password_object.password, cafile=certifi.where(), validate_host=False) as conn: with conn.cursor() as cur: cur.execute(""" SELECT O.OrderId, O.OrderDate, O.SodName, O.UnitPrice, O.Quantity, C.Region FROM Orders AS O INNER JOIN Customers AS C ON O.CustomerID = C.CustomerID;""") rows = cur.fetchall() schema = T.StructType([ T.StructField("ORDER_ID", T.LongType(), True), T.StructField("ORDER_DATE", T.DateType(), True), T.StructField("SOD_NAME", T.StringType(), True), T.StructField("UNIT_PRICE", T.FloatType(), True), T.StructField("QUANTITY", T.FloatType(), True), T.StructField("REGION", T.StringType(), True) ]) final_df = session.createDataFrame(rows, schema) return final_df $$;
调用过程以连接到外部服务:
CALL ext_network_access_db.procedures.connect_azure_sqlserver();
对需要专用连接的每个外部网络访问配置重复这些步骤。
如果外部网络访问集成不再需要专用连接端点,请调用 SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT 系统函数。