适用于内部暂存区的 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 内部暂存区。下图总结了这一新支持:

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

请注意以下有关 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 内部暂存区,必须获得组织中以下三个角色的支持:

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

  2. Microsoft Azure 管理员。

  3. 网络管理员。

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

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

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

  2. 作为 Snowflake 账户管理员,在 Snowflake 账户中执行以下语句,并记录 privatelink_internal_stage 键定义的内部暂存区存储账户的 ResourceID。有关更多信息,请参阅 ENABLE_INTERNAL_STAGES_PRIVATELINKSYSTEM$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())));
    
    Copy
  3. 作为 Azure 管理员,通过 Azure 门户创建 Private Endpoint。

    查看 Private Endpoint 属性并记录资源 ID 值。此值将是下一步中的 privateEndpointResourceID 值。

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

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

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

    use role accountadmin;
    select system$authorize_stage_privatelink_access('<privateEndpointResourceID>');
    
    Copy

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

  5. 作为网络管理员,请更新 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
      
      Copy

阻止公共访问(可选)

通过 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();
Copy

该函数可能需要几分钟才能完成执行。

确保阻止公共访问

您可以通过执行 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 内部暂存区的访问权限:

  1. 作为 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>');
    
    Copy
  2. 作为 Azure 管理员,请通过 Azure 门户删除 Private Endpoint。

  3. 作为网络管理员,删除用于解析存储账户 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 服务中找不到存储账户的条目,则会发生连接错误。

解决此问题的选择有两个:

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

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

    dig CNAME <storage_account_name>.privatelink.blob.core.windows.net
    
    Copy
语言: 中文