管理受出站访问保护的环境中的库

Microsoft Fabric 允许管理员控制和限制从工作区项到外部资源的出站连接。 当出站网络安全处于打开时,它会阻止访问 PyPI 和 conda 等公共存储库。 这可以防止安装公共库或下载自定义包的依赖项。

本文介绍如何在为工作区启用出站访问保护时从 PyPI 安装库。

在具有受限出站访问的环境中,服务无法连接到公共存储库来下载库及其依赖项。 建议 将包及其依赖项作为环境中的自定义包直接上传

步骤 1:先决条件

若要开始,需要准备库规范,该规范requirement.txt是可用于生成 Python 虚拟环境的计算资源,以及 Fabric 运行时的安装程序文件。

重要

  • 运行时安装文件包含一些Microsoft托管的专用库,无法识别这些库。 请确保 将其从安装程序文件中删除
  • 由 Microsoft 托管的库:“library-metadata-cooker”、“mmlspark”、“azureml-synapse”、“notebookutils”、“flt-python”、“synapse-jupyter-notebook”、“synapse-jupyter-proxy”、“azure-synapse-ml-predict”、“fsspec_wrapper”、“horovod”、“sqlanalyticsconnectorpy”、“synapseml”、“control-script”、“impulse-python-handler”、“chat-magics”、“ds-copilot”、“fabric-connection”、“chat-magics-fabric”、“dscopilot-installer”、“sqlanalyticsfabricconnectorpy”、“geoanalytics-fabric”、“spark-mssql-connector-fabric35”、“flaml”、“semantic-link-sempy”、“synapseml-*”、“prose-pandas2pyspark”、“prose-suggestions”、“kqlmagiccustom”

显示运行时安装文件示例的屏幕截图。

步骤 2:在计算资源中设置虚拟 Python 环境

通过运行以下脚本,在计算资源中创建虚拟 Python 环境,该环境与 Fabric 运行时的 Python 版本保持一致。

wget https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-x86_64.sh
bash Miniconda3-py310_24.1.2-0-Linux-x86_64.sh
chmod 755 -R /usr/lib/miniforge3/
export PATH="/usr/lib/miniforge3/bin:$PATH"
sudo apt-get update
sudo apt-get -yq install gcc g++
conda env create -n <custom-env-name> -f Python311-CPU.yml
source activate <custom-env-name>

步骤 3:识别并下载所需的轮子

以下脚本可用于传递 requirements.txt 文件,该文件包含要安装在 spark 运行时中的所有包和版本。 它打印输入库要求的新 wheel 文件/依赖项的名称。

pip install -r <input-user-req.txt> > pip_output.txt
cat pip_output.txt | grep "Using cached *"

现在,可以从 PyPI 下载列出的轮子,并将其直接上传到 Fabric 环境。

在 Azure 存储帐户上托管 PyPI 镜像

PyPI 镜像是官方 PyPI 存储库的副本。 该副本可以是 PyPI 的完整副本,也可以是部分副本,并且可以在 Azure 中以多种方式进行托管。 建议使用 Azure 存储帐户。 存储帐户在组织 vNet 后面受到保护,因此只有已批准的目标/终结点可以访问它。

重要

主机 PyPI 镜像非常适合依赖于大量 PyPI 库且不想手动管理单个滚轮文件的组织。 此方法要求组织承担设置成本,并且定期监视和更新,以保持镜像与 PyPI 同步。

步骤 1:先决条件

  • 计算资源:Linux 系统、适用于 Linux 的 Windows 子系统或 Azure VM
  • Azure 存储帐户:存储镜像包。
  • 其他实用工具:Bandersnatch,即用于处理同步的 PyPI 镜像工具。 Az CLI 或 Blobefuse2 或 Azcopy,即用于高效文件同步的实用工具

初始设置

整个 PyPI 存储库的大小很大,并且不断增加。 设置整个 PyPI 存储库需要一次性初始设置工作。 请参阅 PyPI 统计信息

Maintenance

若要使镜像与 PyPI 保持同步,需要定期监视和更新。

注释

以下是计算资源的各种因素,有助于设置和维护工作:

  • 网络速度
  • 服务器资源:运行 Bandersnatch 的计算资源的 CPU、内存、磁盘 I/O 会影响同步速度
  • 磁盘速度:存储系统的速度可能会影响 Bandersnatch 将数据写入磁盘的速度。
  • 初始设置与维护同步:初始同步(首次设置 Bandersnatch 时)在下载整个存储库时通常需要更长的时间。 在具有体面网络和硬件的典型设置中,它的范围可能从 8 小时到 48 小时不等。 后续同步仅更新新增或变更的包,因此速度更快。

步骤 2:在计算资源上设置 Python

运行以下脚本以设置相应的 Python 版本。

wget https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-x86_64.sh
bash Miniconda3-py310_24.1.2-0-Linux-x86_64.sh
chmod 755 -R /usr/lib/miniforge3/

# Add Python executable to PATH
export PATH="/usr/lib/miniforge3/bin:$PATH"

步骤 2:配置 Bandersnatch

Bandersnatch 是一种 PyPI 镜像工具,可在 本地文件系统上下载所有 PyPI 和相关索引文件。 可以参考 本文 来创建 bandersnatch.conf 文件。

运行以下脚本以设置 Bandersnatch。 该命令使用 PyPI 执行一次性同步。 初始同步需要时间完成。

# Install Bandersnatch
pip install bandersnatch

# Execute mirror command
bandersnatch --config <path-to-bandersnatch.conf> mirror

注释

镜像筛选工具支持通过允许列表等插件进行部分镜像,从而更有效地管理依赖项。 通过筛选不必要的包,它有助于减小完整镜像的大小,最大限度地减少成本和维护工作量。 例如,如果镜像仅用于 Fabric,则可以排除 Windows 二进制文件以优化存储。 建议根据特定的用例评估这些筛选选项。

成功执行命令后,将创建本地文件系统上的镜像目录中的子文件夹。

显示由 bandersnatch 创建的 PyPI 镜像的屏幕截图。

步骤 3:验证本地镜像设置(可选)

可以使用 HTTP 服务器为本地 PyPI 镜像提供服务。 此命令在端口 8000 上启动 HTTP 服务器,该服务器提供镜像目录的内容。

cd <directory-to-mirror>
python -m http.server 8000

# Configure pip to Use the Local PyPI Mirror
pip install <package> -index-url http://localhost:8000/simple

步骤 4:在存储帐户上上传镜像

在 Azure 存储帐户上启用静态网站。 此步骤允许在此示例中托管静态内容,如 PyPI 索引页。 它还自动生成名为$web的容器。

显示存储帐户示例的屏幕截图。

然后,可以使用 az CLI 或 azcopy of blobfuse2 将本地镜像从 devbox 上传到 Azure 存储帐户。\

  • 将包文件夹上传到存储帐户中您所选的容器
  • 将 simple、pypi、local-stats 和 json 文件夹上传到存储帐户的 $web 容器中

步骤 5:在 Fabric 环境中使用此镜像

若要访问 Azure 存储帐户,请在 Fabric 工作区中添加两个专用托管终结点。

显示专用终结点示例的屏幕截图。

然后,可以通过在环境中提供 YAML 文件或在 Notebook 会话中使用内联命令 %pip install ,从 Azure 存储帐户中安装库。

  • YAML 文件示例:
dependencies:
  - pip
  - pip:
    - pytest==8.2.2
    - --index-url https://<storage-account-name>.z5.web.core.windows.net/simple
  • %pip 命令示例
%pip install pytest --index-url https://<storage-account-name>.z5.web.core.windows.net/simple