适用于内部暂存区的 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 支持使用 Azure Private Endpoint 进行内部暂存区访问之前,有必要在 Azure VNet 中创建一个代理场,以便安全访问 Snowflake 内部暂存区。通过增加对适用于 Snowflake 内部暂存区的 Azure Private Endpoint 的支持,用户和客户端应用程序现在可以通过专用 Azure 网络访问 Snowflake 内部暂存区。下图总结了这一新支持:

使用 Azure 专用链接连接到内部暂存区

请注意以下有关 BEFORE 图中数字的说明:

  • 用户可通过两种方式连接到 Snowflake 内部暂存区:

    • 选项 A 可通过本地连接直接连接到内部暂存区,如数字 1 所示。

    • 选项 B 可通过代理场连接到内部暂存区,如数字 2 和 3 所示。

  • 如果使用代理场,用户还可以直接连接到 Snowflake,如数字 4 所示。

请注意以下有关 AFTER 图中数字的说明:

  • 为清楚起见,该图显示了一个 Azure VNet 指向单个 Snowflake 内部暂存区(6 和 7)的单个 Azure Private Endpoint。

    请注意,可以配置多个 Azure Private Endpoint,它们分别位于不同的 VNet 中,且指向同一 Snowflake 内部暂存区。

  • 此功能更新后,无需通过代理场即可连接到 Snowflake 或 Snowflake 内部暂存区。

  • 本地用户可以直接连接到 Snowflake,如数字 5 所示。

  • 若要连接到 Snowflake 内部暂存区,本地用户连接到编号 6 的 Azure Private Endpoint,然后使用 Azure 专用链接连接到 Snowflake 内部暂存区,如数字 7 所示。

在 Azure 中,每个 Snowflake 账户都有一个专用的存储账户,用作内部暂存区。存储账户 URIs 会有所不同,具体取决于与存储账户的连接是否使用专用连接(即 Azure 专用链接)。专用连接 URL 包括 privatelink 中的 URL 段。

公共存储账户 URI:

<storage_account_name>.blob.core.windows.net

专用连接存储账户 URI:

<storage_account_name>.privatelink.blob.core.windows.net

为您账户的内部暂存区:ref:配置 Azure Private Endpoint 连接<label-private_internal_stages_azure_configure_endpoints>`后,Microsoft Azure 会自动在公共 DNS 服务中创建一条 CNAME 记录,该服务将存储账户主机指向其 Azure 专用链接对应项。此对应项是 `.privatelink.blob.core.windows.net``。

优势

实施专用连接以访问 Snowflake 内部暂存区具有以下优势:

  • 内部暂存区数据不会遍历公共互联网。

  • 在 Azure VNet 外部运行的客户端和 SaaS 应用程序(如 Microsoft PowerBI)可以安全地连接到 Snowflake。

  • 管理员无需修改防火墙设置即可访问内部暂存区数据。

  • 管理员可以对用户连接到存储账户的方式实施一致的安全性和监控。

限制

Microsoft Azure 定义了 Azure Private Endpoint 如何与 Snowflake 进行交互:

  • 单个 Azure Private Endpoint 可以与单个 Snowflake 服务端点通信。您可以有多个一对一配置连接到同一个 Snowflake 内部暂存区。

  • 您的存储账户中可以连接到 Snowflake 内部暂存区的 Azure Private Endpoint 的最大数量是固定的。有关详细信息,请参阅 标准存储账户限制 (https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#standard-storage-account-limits)。

配置 Azure Private Endpoint 以访问 Snowflake 内部暂存区

若要将 Azure Private Endpoint 配置为访问 Snowflake 内部暂存区,您必须获得组织中以下三个角色的支持:

  1. Snowflake 账户管理员(即具有 Snowflake ACCOUNTADMIN 系统角色的用户)。

  2. Microsoft Azure 管理员。

  3. 网络管理员。

根据组织的不同,可能需要与多个人员或团队协调配置工作,以实施以下配置步骤。

完成以下步骤,通过 Azure Private Endpoint 配置和实现对 Snowflake 内部暂存区的安全访问:

  1. 验证 Azure 订阅是否已注册到 Azure 存储资源管理器。此步骤允许您从专用端点连接到内部暂存区。

  2. 作为 Snowflake 账户管理员,在 Snowflake 账户中运行以下命令,并记录 privatelink_internal_stage 键定义的内部暂存区存储账户的 ResourceID。有关更多信息,请参阅 ENABLE_INTERNAL_STAGES_PRIVATELINK 和 。

    USE ROLE ACCOUNTADMIN;
    ALTER ACCOUNT SET ENABLE_INTERNAL_STAGES_PRIVATELINK = true;
    SELECT KEY, VALUE FROM TABLE(flatten(input=>parse_json(system$get_privatelink_config())));
    
    Copy
  3. 作为 Azure 管理员,通过 Azure 门户创建 Azure Private Endpoint。

    查看 Azure Private Endpoint 属性并记录资源 ID 值。您将提供此值作为下一步中的 privateEndpointResourceID 函数实参。

    验证该 Target sub-resource 值是否设置为 blob

    有关更多信息,请参阅 Microsoft Azure 专用链接 文档 (https://docs.microsoft.com/en-us/azure/private-link/)。

    重要

    Before you proceed with the next step to authorize the private endpoint, you should be aware of the Microsoft Azure DNS behavior when a private endpoint is authorized on a storage location for the very first time.

    When the first private endpoint is connected and authorized, Azure automatically creates a CNAME record in its public DNS for storage-account-name.privatelink.blob.core.windows.net.

    Under normal circumstances, this DNS update should not affect existing public connectivity to the storage account. However, if your environment already has private DNS zones configured for .privatelink.blob.core.windows.net, this DNS update can lead to unintended behavior. Specifically, existing storage clients attempting to access the public endpoint storage-account-name.blob.core.windows.net may fail DNS resolution or be unable to reach the storage account using public IP.

    To avoid this issue, Microsoft recommends enabling the Fallback to Internet option in the private DNS zone configuration before authorizing the first private endpoint. This guidance also appears as a cautionary note in the Microsoft Azure DNS zone configuration documentation (https://learn.microsoft.com/en-us/azure/private-link/private-endpoint-dns#azure-services-dns-zone-configuration).

  4. 作为 Snowflake 管理员,使用 SYSTEM$AUTHORIZE_STAGE_PRIVATELINK_ACCESS 值作为函数实参调用 privateEndpointResourceID 函数。此步骤通过 Azure Private Endpoint 授权访问 Snowflake 内部暂存区。

    USE ROLE ACCOUNTADMIN;
    SELECT SYSTEM$AUTHORIZE_STAGE_PRIVATELINK_ACCESS('<privateEndpointResourceID>');
    
    Copy

    如有必要,请完成以下步骤以 撤消 对内部暂存区的访问权限。

  5. 让网络管理员参与更新专用 DNS 区域中的 DNS 设置。这些设置必须将专用链接 Blob URL <storage_account_name>.privatelink.blob.core.windows.net 解析到解析到连接您存储账户内部暂存区的 Azure Private Endpoint 的专用 IP 地址。

    有关更多信息,请参阅 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
      
      Copy

撤消 Azure Private Endpoint 以访问 Snowflake 内部暂存区

要通过 Microsoft Azure Private Endpoint 撤消对 Snowflake 内部暂存区的访问权限,请完成以下步骤:

  1. 作为 Snowflake 管理员,请确认 ENABLE_INTERNAL_STAGES_PRIVATELINK 参数已设置为 TRUE。例如:

    USE ROLE ACCOUNTADMIN;
    SHOW PARAMETERS LIKE 'enable_internal_stages_privatelink' IN ACCOUNT;
    
    Copy
  2. 作为 Snowflake 管理员,调用 SYSTEM$REVOKE_STAGE_PRIVATELINK_ACCESS 函数以撤销对专用端点的访问权限,并使用最初用于授权访问该专用端点的相同 privateEndpointResourceID 值。

    USE ROLE ACCOUNTADMIN;
    SELECT SYSTEM$REVOKE_STAGE_PRIVATELINK_ACCESS('<privateEndpointResourceID>');
    
    Copy
  3. 作为 Azure 管理员,请通过 Azure 门户删除专用端点。

  4. 作为网络管理员,删除用于解析存储账户 URLs 的 DNS 和别名记录。

此时,对专用端点的访问权限已撤销。调用 SYSTEM$GET_PRIVATELINK_CONFIG 函数的查询结果不应返回 privatelink_internal_stage 键及其值。

故障排除

如本主题中所述,如果与 Snowflake 暂存区建立了 Azure Private Endpoint 连接,则通过公共网络访问暂存区并使用专用 DNS 服务解析服务主机名的 Azure 应用程序无法访问 Snowflake 暂存区。

如果任何应用程序为同一域配置了专用 DNS 区域,则 Microsoft Azure 会尝试通过查询专用 DNS 服务来解析存储账户主机。如果在专用 DNS 服务中找不到存储账户的条目,则会发生连接错误。

要解决此问题,请使用以下两个选项之一:

  1. 从应用程序移除专用 DNS 区域或取消其与应用程序的关联。

  2. 在专用 DNS 服务中为存储账户专用主机名(即 <storage_account_name>.privatelink.blob.core.windows.net)创建 CNAME 记录,并将其指向此命令的输出所指定的主机名:

    dig CNAME <storage_account_name>.privatelink.blob.core.windows.net
    
    Copy