适用于内部暂存区的 Azure Private Endpoint¶
本主题提供有关通过 Microsoft Azure Private Endpoint 连接到 Snowflake 内部暂存区的概念和详细说明。
本主题内容:
概述¶
Azure Private Endpoint (https://docs.microsoft.com/en-us/azure/private-link/private-endpoint-overview) 和 Azure 专用链接 (https://docs.microsoft.com/en-us/azure/private-link/private-link-overview) 可以组合在一起,以提供可连接至 Snowflake 内部暂存区的安全连接。此设置可确保 Snowflake 内部暂存区的数据加载和数据卸载操作使用 Azure 内部网络,而不会占用公共网络。
在 Microsoft 支持使用 Private Endpoint 进行内部暂存区访问之前,有必要在 Azure VNet 中创建一个代理场,以便安全访问 Snowflake 内部暂存区。通过增加对适用于 Snowflake 内部暂存区的 Private Endpoint 的支持,用户和客户端应用程序现在可以通过专用 Azure 网络访问 Snowflake 内部暂存区。下图总结了这一新支持:
请注意以下有关 BEFORE 图中数字的说明:
用户可通过两种方式连接到 Snowflake 内部暂存区:
选项 A 可通过本地连接直接连接到内部暂存区,如数字 1 所示。
选项 B 可通过代理场连接到内部暂存区,如数字 2 和 3 所示。
如果使用代理场,用户还可以直接连接到 Snowflake,如数字 4 所示。
请注意以下有关 AFTER 图中数字的说明:
为清楚起见,该图显示了一个 Azure VNet 指向单个 Snowflake 内部暂存区(6 和 7)的单个 Private Endpoint。
请注意,可以配置多个 Private Endpoint,它们分别位于不同的 VNet 中,且指向同一 Snowflake 内部暂存区。
此功能更新后,无需通过代理场即可连接到 Snowflake 或 Snowflake 内部暂存区。
本地用户可以直接连接到 Snowflake,如数字 5 所示。
若要连接到 Snowflake 内部暂存区,本地用户连接到编号 6 的 Private Endpoint,然后使用 Azure 专用链接连接到 Snowflake 内部暂存区,如数字 7 所示。
在 Azure 中,每个 Snowflake 账户都有一个专用的存储账户,用作内部暂存区。存储账户 URIs 会有所不同,具体取决于与存储账户的连接是否使用专用连接(即 Azure 专用链接)。专用连接 URL 包括 URL 中的 privatelink
段。
- 公共存储账户 URI:
<storage_account_name>.blob.core.windows.net
- 专用连接存储账户 URI:
<storage_account_name>.privatelink.blob.core.windows.net
优势¶
实施 Private Endpoint 以访问 Snowflake 内部暂存区具有以下优势:
内部暂存区数据不会穿过公共互联网。
在 Azure VNet 外部运行的客户端和 SaaS 应用程序(如 Microsoft PowerBI)可以安全地连接到 Snowflake。
管理员无需修改防火墙设置即可访问内部暂存区数据。
管理员可以对用户连接到存储账户的方式实施一致的安全性和监控。
限制¶
Microsoft Azure 定义了 Private Endpoint 如何与 Snowflake 进行交互:
单个 Private Endpoint 可以与单个 Snowflake 服务端点通信。您可以有多个一对一配置连接到同一个 Snowflake 内部暂存区。
您的存储账户中可以连接到 Snowflake 内部暂存区的 Private Endpoint 的最大数量是固定的。有关详细信息,请参阅 标准存储账户限制 (https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#standard-storage-account-limits)。
配置 Private Endpoint 以访问 Snowflake 内部暂存区¶
若要将 Private Endpoint 配置为访问 Snowflake 内部暂存区,必须获得组织中以下三个角色的支持:
Snowflake 账户管理员(即具有 Snowflake ACCOUNTADMIN 系统角色的用户)。
Microsoft Azure 管理员。
网络管理员。
根据组织的不同,可能需要与多个人员或团队协调配置工作,以实施以下配置步骤。
完成以下步骤,通过 Azure Private Endpoint 配置和实现对 Snowflake 内部暂存区的安全访问:
验证 Azure 订阅是否已注册到 Azure 存储资源管理器。此步骤允许您从 Private Endpoint 连接到内部暂存区。
作为 Snowflake 账户管理员,在 Snowflake 账户中执行以下语句,并记录
privatelink_internal_stage
键定义的内部暂存区存储账户的ResourceID
。有关更多信息,请参阅 ENABLE_INTERNAL_STAGES_PRIVATELINK 和 SYSTEM$GET_PRIVATELINK_CONFIG。use role accountadmin; alter account set ENABLE_INTERNAL_STAGES_PRIVATELINK = true; select key, value from table(flatten(input=>parse_json(system$get_privatelink_config())));
作为 Azure 管理员,通过 Azure 门户创建 Private Endpoint。
查看 Private Endpoint 属性并记录资源 ID 值。此值将是下一步中的
privateEndpointResourceID
值。验证该 Target sub-resource 值是否设置为
blob
。有关更多信息,请参阅 Microsoft Azure 专用链接 文档 (https://docs.microsoft.com/en-us/azure/private-link/)。
作为 Snowflake 管理员,使用
privateEndpointResourceID
值作为函数实参调用 SYSTEM$AUTHORIZE_STAGE_PRIVATELINK_ACCESS 函数。此步骤通过 Private Endpoint 授权访问 Snowflake 内部暂存区。use role accountadmin; select system$authorize_stage_privatelink_access('<privateEndpointResourceID>');
如有必要,请完成以下步骤以 撤消 对内部暂存区的访问权限。
作为网络管理员,请更新 DNS 设置以按如下方式解析 URLs:
<storage_account_name>.blob.core.windows.net
to<storage_account_name>.privatelink.blob.core.windows.net
在 Azure VNet 中使用专用 DNS 区域时,请为
<storage_account_name>.privatelink.blob.core.windows.net
创建别名记录。有关更多信息,请参阅 Azure Private Endpoint DNS 配置 (https://docs.microsoft.com/en-us/azure/private-link/private-endpoint-dns)。
小技巧
使用单独的 Snowflake 账户进行测试,并在测试 VNet 中配置专用 DNS 区域以测试功能,这样一来,测试是隔离的,且不会影响其他工作负载。
如果无法使用单独的 Snowflake 账户,请使用测试用户通过已更改 DNS 的测试 VPC 访问 Snowflake。
若要从本地应用程序进行测试,请使用 DNS 转发将请求转发到已设置 DNS 的 VNet 中的 Azure 专用 DNS。从客户端计算机执行以下命令,以验证返回的 IP 地址是否为存储账户的专用 IP 地址:
dig <storage_account_name>.blob.core.windows.net
阻止公共访问(可选)¶
通过 Azure 专用链接将 Private Endpoint 配置为访问内部暂存区后,您可以选择阻止从公共 IP 地址到内部暂存区的请求。阻止公共访问后,所有流量都必须通过 Private Endpoint。
控制对 Azure 内部暂存区的公共访问不同于控制对 Snowflake 服务的公共访问。您可以使用该 SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS 函数(而不是网络策略)来阻止对内部暂存区的请求。与网络策略不同,此函数不能阻止某些公共 IP 地址,而允许其他地址。当您调用 SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS 时, 所有 公共 IP 地址都会被阻止。
重要
在阻止公共访问 之前,确认通过专用连接的流量已成功到达内部暂存区。在不配置专用连接的情况下阻止公共访问可能会导致意外中断,包括干扰 Azure 数据工厂等托管服务。
SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS 函数通过更改内部暂存区所在的 Azure 存储账户的 Networking 设置来强制实施其限制。这些 Azure 设置通常称为“存储账户防火墙设置”。执行该 Snowflake 函数会在 Azure 中执行以下操作:
将 Public network access 字段设置为 Enabled from selected virtual networks and IP addresses。
将 Snowflake VNet 子网 ID 添加到该 Virtual Networks 部分。
从 Firewall 部分清除所有 IP 地址。
要阻止从公共 IP 地址到内部暂存区的所有流量,请执行:
SELECT SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS();
该函数可能需要几分钟才能完成执行。
确保阻止公共访问¶
您可以通过执行 SYSTEM$INTERNAL_STAGES_PUBLIC_ACCESS_STATUS 函数来确定公共 IP 地址是否能够访问内部暂存区。
如果 Azure 设置目前阻止了所有公共流量,则该函数将返回 Public Access to internal stages is blocked
。这将验证,此设置在执行 SYSTEM$BLOCK_INTERNAL_STAGES_PUBLIC_ACCESS 函数后尚未更改。
如果至少有一些公共 IP 地址可以访问内部暂存区,则该函数将返回 Public Access to internal stages is unblocked
。
解除对公共访问的阻止¶
您可以执行该 SYSTEM$UNBLOCK_INTERNAL_STAGES_PUBLIC_ACCESS 函数以允许对先前被阻止的内部暂存区进行公共访问。
执行该函数会更改内部暂存区所在的 Azure 存储账户的 Networking 设置。它将 Azure Public network access 字段设置为 Enabled from all networks。
撤消 Private Endpoint 以访问 Snowflake 内部暂存区¶
完成以下步骤,通过 Microsoft Azure Private Endpoint 撤消对 Snowflake 内部暂存区的访问权限:
作为 Snowflake 管理员,使用最初用于授权访问 Private Endpoint 的相同
privateEndpointResourceID
值,将 ENABLE_INTERNAL_STAGES_PRIVATELINK 参数设置为FALSE
并调用 SYSTEM$REVOKE_STAGE_PRIVATELINK_ACCESS 函数,以撤消对 Private Endpoint 的访问权限。use role accountadmin; alter account set enable_internal_stages_privatelink = false; select system$revoke_stage_privatelink_access('<privateEndpointResourceID>');
作为 Azure 管理员,请通过 Azure 门户删除 Private Endpoint。
作为网络管理员,删除用于解析存储账户 URLs 的 DNS 和别名记录。
此时,对 Private Endpoint 的访问权限现已撤销,调用 SYSTEM$GET_PRIVATELINK_CONFIG 函数的查询结果不应返回 privatelink_internal_stage
键及其值。
故障排除¶
如本主题中所述,如果与 Snowflake 暂存区建立了 Private Endpoint 连接,则通过公共网络访问暂存区并使用专用 DNS 服务解析服务主机名的 Azure 应用程序无法访问 Snowflake暂存区。
创建 Private Endpoint 连接后,Microsoft Azure 会自动在公共 DNS 服务中创建一条 CNAME 记录,该服务将存储账户主机指向其 Azure 专用链接对应项(即 .privatelink.blob.core.windows.net
)。如果任何应用程序为同一域配置了专用 DNS 区域,则 Microsoft Azure 会尝试通过查询专用 DNS 服务来解析存储账户主机。如果在专用 DNS 服务中找不到存储账户的条目,则会发生连接错误。
解决此问题的选择有两个:
从应用程序移除专用 DNS 区域或取消其与应用程序的关联。
在专用 DNS 服务中为存储账户专用主机名(即
<storage_account_name>.privatelink.blob.core.windows.net
)创建 CNAME 记录,并将其指向此命令的输出所指定的主机名:dig CNAME <storage_account_name>.privatelink.blob.core.windows.net