管理无服务器出口控制的网络策略

本文档介绍如何配置和管理网络策略,以控制 Azure Databricks 中无服务器工作负荷的出站网络连接。

要求

  • Azure Databricks 工作区必须位于高级层上。
  • 管理网络策略的权限仅限于帐户管理员。

访问网络策略

若要在帐户中创建、查看和更新网络策略,请执行以下操作:

  1. 在帐户控制台中,单击“云资源”。
  2. 单击“网络”选项卡。

网络策略列表。

创建新的网络策略

  1. 单击 创建新网络策略

  2. 选择网络访问模式:

    • 完全访问权限:不受限制的出站互联网访问。 如果选择 “完全访问”,出站 Internet 访问将保持不受限制。
    • 受限访问:出站访问仅限于指定的目标。 有关详细信息,请参阅 网络策略概述

    网络策略详细信息。

配置网络策略

以下步骤概述了受限访问模式的可选设置。

设置出口规则

  1. 若要授予对其他域的无服务器计算访问权限,请单击“允许的域”列表上方的“添加目标”

    添加 Internet 目标。

    FQDN 筛选器允许访问共享同一 IP 地址的所有域。 在将网络访问设置为受限时,通过端点进行的模型服务预配可防止互联网访问。 但是,无法通过 FQDN 过滤实现精细控制。

  2. 若要允许工作区访问其他 Azure 存储帐户,请单击“允许的 存储帐户”列表上方的“添加目标”按钮。

    添加存储目标。

注意

默认情况下,不允许从用户代码容器(如 REPLs 或 UDF)直接访问云存储服务。 若要启用此访问,请在策略中将存储资源的 FQDN 添加为 允许的域 。 仅添加存储资源的基域可能会无意中授予对该区域中所有存储资源的访问权限。

设置出口规则时,请注意:

  • 当 UC 外部位置的元存储和 Azure 存储帐户 Bucket 位于不同的区域时,必须将该 Bucket 显式添加到出口允许列表中才能成功进行访问。
  • 支持的最大目标数为 2500。
  • 添加为负载均衡器专用链接条目的域在网络策略中被隐式地列入允许名单。 删除域或删除专用终结点时,网络策略控制可能需要长达 24 小时才能完全强制实施更改。 请参阅 配置 VNet 中资源的专用连接

注意

Unity Catalog 连接的隐式加入允许列表已被弃用。 对于那些包含在弃用之前使用隐式白名单的工作区的帐户,这一行为将在有限的过渡期内继续有效。

政策执行

使用“试运行”模式可以测试策略配置并监视出站连接,而不会中断对资源的访问。 启用干运行模式后,将记录违反策略但未阻止的请求。 您可以选择以下选项:

  1. Databricks SQL:Databricks SQL 仓库在干运行模式下运行。

  2. AI 模型服务:为终结点提供服务的模型在干运行模式下运行。

  3. 所有产品:所有 Azure Databricks 服务都以干运行模式运行,覆盖所有其他选择。

    添加存储目标。

更新默认策略

每个 Azure Databricks 帐户都包含一个 默认策略默认策略 与没有显式网络策略分配的所有工作区(包括新创建的工作区)相关联。 可以修改此策略,但无法将其删除。 默认策略仅适用于至少具有高级层的工作区。

将网络策略关联到工作区

如果已使用其他配置更新了默认策略,它们将自动应用于没有现有网络策略的工作区。 工作区必须位于高级层中。

若要将工作区与其他策略相关联,请执行以下操作:

  1. 选择工作区。
  2. 网络策略中,单击 更新网络策略
  3. 从列表中选择所需的网络策略。

更新网络策略。

应用网络策略更改

大多数网络配置更新会在 10 分钟内自动传播到无服务器计算服务。 这包括:

  • 添加新的 Unity 目录外部位置或连接。
  • 将工作区附加到其他元存储。
  • 更改允许的存储或 Internet 目标。

注意

如果修改 Internet 访问或干运行模式设置,则必须重启计算。

重启或重新部署无服务器工作负荷

只需在切换 Internet 访问模式或更新试运行模式时更新。

若要确定适当的重启过程,请参阅以下按产品列出的列表:

  • Databricks ML 服务:重新部署 ML 服务终结点。 请参阅创建自定义模型服务终结点
  • 管道:停止并重启正在运行的 Lakeflow 声明性管道。 请参阅 在 Lakeflow 声明性管道中运行更新
  • 无服务器 SQL 仓库:停止并重启 SQL 仓库。 请参阅管理 SQL 仓库
  • 工作流:触发新作业运行或重新启动现有作业运行时,将自动应用网络策略更改。
  • 笔记本:
    • 如果笔记本不与 Spark 交互,可以终止并附加新的无服务器群集以刷新应用于笔记本的网络配置。
    • 如果笔记本与 Spark 交互,则无服务器资源会刷新并自动检测更改。 大多数更改将在 10 分钟内刷新,但切换 Internet 访问模式、更新干运行模式,或者在具有不同强制类型的附加策略之间更改最多可能需要 24 小时。 若要加快对这些特定类型的更改进行刷新,请关闭所有关联的笔记本和作业。

验证网络策略执行

可以通过尝试从不同的无服务器工作负荷访问受限资源来验证网络策略是否正确强制实施。 验证过程因无服务器产品而异。

使用 Lakeflow 声明性管道进行验证

  1. 创建 Python 笔记本。 可以使用 Lakeflow 声明性管道维基百科 python 教程中提供的示例笔记本。
  2. 创建管道:
    1. 在工作区边栏中的“数据工程”下,单击“管道”。
    2. 单击“创建管道”
    3. 使用以下设置配置管道:
      • 管道模式:无服务器
      • 源代码:选择创建的笔记本。
      • 存储选项:Unity 目录。 选择所需的目录和架构。
    4. 单击 “创建”
  3. 运行管道。
  4. 在管道页中,单击“ 开始”。
  5. 等待管道完成。
  6. 验证结果
    • 受信任的目标:管道应成功运行,并将数据写入目标。
    • 不受信任的目标:管道应失败,并出现指示网络访问被阻止的错误。

使用 Databricks SQL 进行验证

  1. 创建 SQL 仓库。

  2. 在 SQL 编辑器中运行测试查询,该查询尝试访问由网络策略控制的资源。

  3. 验证结果:

    • 受信任的目标:查询应成功。
    • 不受信任的目标:查询应失败并出现网络访问错误。
  4. 若要使用标准 Python 库从 UDF 连接到网络,请运行以下 UDF 定义:

    CREATE OR REPLACE TEMPORARY FUNCTION ping_google(value DOUBLE)
    RETURNS STRING
    LANGUAGE python
    AS $$
    import requests
    
    url = "https://www.google.com"
    response = requests.get(url, timeout=5)
    
    if response.status_code == 200:
       return "UDF has network!"
    else:
     return "UDF has no network!"
    $$;
    

使用模型服务进行验证

在您开始之前

当创建模型服务端点时,会生成容器映像用于提供模型服务。 在此构建阶段执行网络策略。 将模型服务用于网络策略时,请考虑以下事项:

  • 依赖项访问: 您的网络策略必须允许任何外部构建依赖项,例如来自 PyPI 和 conda-forge 的 Python 包,基础容器镜像,或者模型环境或 Docker 上下文中所需的指定外部 URL 中的文件。
    • 例如,如果模型需要特定版本的 scikit-learn,需要在生成期间下载,则网络策略必须允许访问托管包的存储库。
  • 生成失败: 如果网络策略阻止访问必要的依赖项,则提供容器生成的模型将失败。 这会阻止服务终结点成功部署,并可能导致其无法正确存储或正常运行。

请参阅 检查拒绝日志

  • 拒绝处理分析:在构建阶段,会记录网络访问被拒绝的情况。 这些日志将包含一个具有network_source_type值的ML Build字段。 此信息对于确定必须添加到网络策略中的具体阻止资源,以便让构建成功完成而言至关重要。

验证运行时网络访问

以下步骤演示如何在运行时验证已部署模型的网络策略,特别是用于在推理期间尝试访问外部资源。 这假定已成功生成提供容器的模型,这意味着网络策略中允许任何生成时依赖项。

  1. 创建测试模型

    1. 在 Python 笔记本中,创建一个模型,该模型尝试在推理时访问公共 Internet 资源,例如下载文件或发出 API 请求。

    2. 运行此笔记本以在测试工作区中生成模型。 例如:

      import mlflow
      import mlflow.pyfunc
      import mlflow.sklearn
      import requests
      
      class DummyModel(mlflow.pyfunc.PythonModel):
          def load_context(self, context):
              # This method is called when the model is loaded by the serving environment.
              # No network access here in this example, but could be a place for it.
              pass
      
          def predict(self, _, model_input):
              # This method is called at inference time.
              first_row = model_input.iloc[0]
              try:
                  # Attempting network access during prediction
                  response = requests.get(first_row['host'])
              except requests.exceptions.RequestException as e:
                  # Return the error details as text
                  return f"Error: An error occurred - {e}"
              return [response.status_code]
      
      with mlflow.start_run(run_name='internet-access-model'):
          wrappedModel = DummyModel()
      
          # When this model is deployed to a serving endpoint,
          # the environment will be built. If this environment
          # itself (e.g., specified conda_env or python_env)
          # requires packages from the internet, the build-time SEG policy applies.
          mlflow.pyfunc.log_model(
              artifact_path="internet_access_ml_model",
              python_model=wrappedModel,
              registered_model_name="internet-http-access"
          )
      
  2. 创建服务终结点

    1. 在工作区导航中,选择 “AI/ML”。
    2. 单击“服务”选项卡。
    3. 单击“ 创建服务终结点”。
    4. 使用以下设置配置终结点:
      • 提供终结点名称:提供描述性名称。
      • 实体详细信息:选择 模型注册表模型
      • 模型:选择在上一步中创建的模型(internet-http-access)。
    5. 单击“确认” 。 在此阶段,模型服务容器的构建过程开始。 ML Build 的网络策略将被强制实施。 如果构建由于依赖项的网络访问被阻止而失败,则端点将无法就绪。
    6. 等待服务终结点到达 就绪 状态。 如果它无法准备就绪,请检查拒绝日志中是否有 network_source_type: ML Build 条目。

    请参阅 检查拒绝日志

  3. 查询终结点。

    1. 使用服务终结点页中的 “查询终结点 ”选项发送测试请求。

      { "dataframe_records": [{ "host": "[https://www.google.com](https://www.google.com)" }] }
      
  4. 验证运行时访问的结果:

    • 在运行时启用 Internet 访问:查询应成功并返回状态代码,如下所示 200
    • 运行时限制的 Internet 访问:查询应因网络访问错误而失败,例如来自模型代码中try-except块的错误消息,指示连接超时或主机解析失败。

更新网络策略

可以在创建网络策略后随时更新它。 若要更新网络策略,请执行以下操作:

  1. 在帐户控制台中网络策略的详细信息页上,修改策略:
    • 更改网络访问模式。
    • 为特定服务启用或禁用干运行模式。
    • 添加或删除 FQDN 或存储目标。
  2. 单击“更新”。
  3. 请参阅 应用网络策略更改,以验证更新是否应用于现有工作负荷。

检查拒绝日志

拒绝日志存储在 Unity 目录中的 system.access.outbound_network 表中。 这些日志跟踪出站网络请求被拒绝时间。 若要访问拒绝日志,请确保在 Unity 目录元存储上启用访问架构。 请参阅 Access 系统表

使用如下所示的 SQL 查询查看拒绝事件。 如果启用了干运行日志,查询将返回拒绝日志和干运行日志,可以使用 access_type 列进行区分。 拒绝日志显示 DROP 值,而试运行日志显示 DRY_RUN_DENIAL。

以下示例从过去 2 小时内检索日志:


select * from system.access.outbound_network
where event_time >= current_timestamp() - interval 2 hour
sort by event_time desc

对于试运行模式和外部生成式 AI 模型,以下情况属实:

  • 如果网络策略已阻止访问必要的依赖项,请先检查拒绝日志 system.access.outbound_network。 此外,为容器提供服务的模型生成日志可能会提供有关哪些域被阻止的有用信息。
  • 如果为容器生成提供服务的模型失败,请检查拒绝日志 system.access.outbound_network 以确定哪些域被阻止。
  • 即使在干运行模式下,马赛克 AI 服务对外部模型访问的强制执行仍会持续。

注意

访问时间与出现拒绝日志的时间之间可能存在可感知的延迟。

限制

  • 工件上传大小:使用 MLflow 的内部 Databricks 文件系统和dbfs:/databricks/mlflow-tracking/<experiment_id>/<run_id>/artifacts/<artifactPath>格式时,通过log_artifactlog_artifactslog_modelAPI上传的工件限制为 5GB。
  • 模型服务:在生成模型服务的映像时,流出量控制不适用。
  • 短生存期垃圾回收(GC)工作负载的拒绝日志传送:对于持续时间小于 120 秒的短生存期 GC 工作负载,由于日志记录的延迟,拒绝日志可能无法在节点终止之前被传送。 尽管仍强制实施访问,但可能缺少相应的日志条目。
  • Databricks SQL 用户定义的函数(UDF)的网络连接:若要在 Databricks SQL 中启用网络访问,请联系 Databricks 帐户团队。
  • DLT Eventhook 日志记录:不会记录面向另一个工作区的 Lakeflow 声明性管道事件hook。 这适用于为跨区域工作区及同一区域内工作区配置的 Eventhook。
  • 跨云的网络访问:目前,使用 S3 存储桶作为 Unity Catalog 外部位置的 Azure 工作区不被无服务器网络策略所允许。