动态挂载 AgenticFS

更新时间:
复制 MD 格式

创建 Sandbox 时,可通过 metadata 将 AgenticSpace Access Point 或其子目录挂载到 Sandbox 内的本地目录,无需预先创建 Volume。

功能介绍

创建 Sandbox 时,可以通过 metadata 将 AgenticSpace Access Point 或其子目录挂载到 Sandbox 内,无需预先创建 Volume。挂载后,应用通过本地挂载目录访问数据。

如需向运行中的 Sandbox 增加挂载,请参见追加挂载 AgenticFS。

适用范围

AgenticFS 的产品说明参见什么是 AgenticFS,相关资源在 NAS 控制台创建和管理。

  • 已创建 AgenticFS、AgenticSpace 和启用 RAM(Resource Access Management,访问控制)认证的 AgenticSpace Access Point(以下简称 Access Point),并确认 Access Point 处于 active 状态。

  • 已获取 Access Point 地址,例如 ap-<ACCESS-POINT-ID>.<FILE-SYSTEM-ID>-<SUFFIX>.<REGION>.nas.aliyuncs.com:/。

  • 已准备与 Access Point 网络连通的 VPC(Virtual Private Cloud,专有网络)、交换机和安全组。

  • 已准备智能体沙箱 API Key 和可用模板。

  • 已准备 RAM 角色,信任策略允许函数计算服务扮演,并具备目标存储所需的访问权限。角色创建方法参见创建 RAM 角色,存储权限策略参见创建 AgenticFS Volume。

第二代运行时镜像要求

使用第二代运行时(MicroVM)自定义模板时,需在构建模板前预装存储客户端。客户端安装、镜像构建和验证方法参见挂载 AgenticFS Volume。

安装 SDK

创建并激活 Python 虚拟环境,然后安装 E2B SDK:

python3 -m venv .venv
source .venv/bin/activate
pip install e2b==2.31.0

挂载配置

创建 Sandbox 时,在 metadata 中提供以下配置:

metadata 键

值的格式

说明

fc.sandbox.storage.agenticfs

JSON 字符串

AgenticFS 挂载配置,字段见下表。

fc.sandbox.network.vpc

JSON 字符串

完整 VPC 配置,包含 vpcId、securityGroupId 和非空的 vSwitchIds。

fc.sandbox.auth.role

字符串

访问目标存储的有效 RAM 角色 ARN(Alibaba Cloud Resource Name,资源名称),必须提供且不能为空字符串。

创建时直接挂载,需同时通过 fc.sandbox.network.vpc 提供完整 VPC 配置,值为 JSON 字符串。模板或同一请求中 Volume 的 VPC 配置不能替代该 metadata。

fc.sandbox.storage.agenticfs 的 JSON 结构如下。提交时需将其序列化为字符串,不能直接传入 Python 字典或 JavaScript 对象:

{
  "userID": 1000,
  "groupID": 1000,
  "mountPoints": [
    {
      "serverAddr": "ap-<ACCESS-POINT-ID>.<FILE-SYSTEM-ID>-<SUFFIX>.<REGION>.nas.aliyuncs.com:/project-a",
      "mountDir": "/mnt/agenticfs"
    }
  ]
}

字段

类型

是否必填

说明

userID

整数

否

挂载使用的用户 ID,取值范围为 -1~65534。同一个配置中的所有挂载点共用该值。

groupID

整数

否

挂载使用的用户组 ID,取值范围为 -1~65534。同一个配置中的所有挂载点共用该值。

mountPoints

对象数组

是

AgenticFS 挂载点列表,至少包含一个挂载点。

mountPoints[].serverAddr

字符串

是

Access Point 地址,最长 128 个字符。不能使用普通 NAS 挂载地址或带协议前缀的 URL;可以在 :/ 后指定 Access Point 下的远端子目录。

mountPoints[].mountDir

字符串

是

Sandbox 内的本地挂载目录,最长 128 个字符,必须是规范化的绝对 Unix 路径,例如 /mnt/agenticfs。

metadata 键必须使用全小写的 fc.sandbox.storage.agenticfs。配置中的字段名也区分大小写,必须使用 userID、groupID、serverAddr 和 mountDir。平台自动启用 TLS,不要传入 enableTLS;配置采用严格 JSON 解析,readOnly 等未声明字段会导致请求失败。

挂载 Access Point 下的子目录

在 serverAddr 的 :/ 后指定远端目录,可以只挂载 Access Point 下的子目录,例如 ap-<ACCESS-POINT-ID>.<FILE-SYSTEM-ID>-<SUFFIX>.<REGION>.nas.aliyuncs.com:/project-a。子目录不存在时,系统会在首次挂载时自动创建。

远端目录须使用规范化的绝对路径,不能包含空白字符、控制字符、重复分隔符、. 或 ..。除根目录 / 外,路径不能以 / 结尾。

AgenticFS 的权限边界由 Access Point 决定。其下的远端子目录只用于选择挂载位置,不能进一步收窄 STS(Security Token Service,安全令牌服务)临时凭证的访问范围。需要隔离数据时,应使用独立的 Access Point。

本地挂载目录

mountDir 表示 Sandbox 内的本地挂载目录,远端目录通过存储配置单独指定。建议使用 /home、/mnt、/tmp 或 /data 的子目录,避免覆盖模板内已有内容。目录限制参见使用限制。

环境变量说明

环境变量

用途

取值来源或填写方式

E2B_API_KEY

调用智能体沙箱接口的 API Key。

在智能体沙箱控制台创建,使用目标 Team 的 API Key。

E2B_API_URL

智能体沙箱 E2B API 地址。

https://api.<REGION>.sandbox.aliyuncs.com,将 <REGION> 替换为目标地域。

E2B_DOMAIN

SDK 访问 Sandbox 的域名。

<REGION>.sandbox.aliyuncs.com,与 API 地址使用相同地域,不含协议或 api. 前缀。

E2B_TEMPLATE

创建 Sandbox 使用的模板 ID 或别名。

在智能体沙箱控制台选择满足本文客户端要求的模板。

AGENTICFS_SERVER_ADDR

Access Point 地址及远端目录。

在 NAS 控制台获取 Access Point 地址,在 :/ 后指定其下的目录。

AGENTICFS_USER_ID

挂载使用的 UID。

根据 Sandbox 内访问数据的用户设置;示例为 1000。

AGENTICFS_GROUP_ID

挂载使用的 GID。

根据 Sandbox 内访问数据的用户组设置;示例为 1000。

SANDBOX_VPC_ID

Sandbox 所在的 VPC。

在专有网络控制台获取,需与目标存储网络连通。

SANDBOX_SECURITY_GROUP_ID

Sandbox 使用的安全组。

在 ECS 控制台获取,需属于所选 VPC,并允许访问目标存储。

SANDBOX_VSWITCH_ID

Sandbox 使用的交换机。

在专有网络控制台获取,需属于所选 VPC。

SANDBOX_ROLE_ARN

访问目标存储的 RAM 角色 ARN。

创建 RAM 角色后,在 RAM 控制台的角色详情中获取。

挂载并验证

先设置环境变量,替换示例中的占位符;API 地址、模板和存储需使用匹配的地域及网络配置:

export E2B_API_KEY="<YOUR-E2B-API-KEY>"
export E2B_API_URL="https://api.<REGION>.sandbox.aliyuncs.com"
export E2B_DOMAIN="<REGION>.sandbox.aliyuncs.com"
export E2B_TEMPLATE="<TEMPLATE-ID>"

export AGENTICFS_SERVER_ADDR="ap-<ACCESS-POINT-ID>.<FILE-SYSTEM-ID>-<SUFFIX>.<REGION>.nas.aliyuncs.com:/"
export AGENTICFS_USER_ID="1000"
export AGENTICFS_GROUP_ID="1000"

export SANDBOX_VPC_ID="vpc-xxxxxxxx"
export SANDBOX_SECURITY_GROUP_ID="sg-xxxxxxxx"
export SANDBOX_VSWITCH_ID="vsw-xxxxxxxx"
export SANDBOX_ROLE_ARN="acs:ram::<ACCOUNT-ID>:role/<ROLE-NAME>"

示例会在挂载目录中创建带随机标识的独立测试文件,写入并读取校验后删除该文件,再释放本次创建的 Sandbox。请使用具备读写权限的挂载配置。

将以下代码保存为 12_sandbox_agenticfs.py:

import json
import os
from uuid import uuid4

from e2b import Sandbox


def require_env(name: str) -> str:
    value = os.environ.get(name, "").strip()
    if not value:
        raise RuntimeError(f"缺少环境变量: {name}")
    return value


mount_dir = "/mnt/agenticfs"
marker_path = f"{mount_dir}/hello-agenticfs-{uuid4().hex}.txt"
agenticfs_config = {
    "userID": int(require_env("AGENTICFS_USER_ID")),
    "groupID": int(require_env("AGENTICFS_GROUP_ID")),
    "mountPoints": [
        {
            "serverAddr": require_env("AGENTICFS_SERVER_ADDR"),
            "mountDir": mount_dir,
        }
    ],
}
vpc_config = {
    "vpcId": require_env("SANDBOX_VPC_ID"),
    "securityGroupId": require_env("SANDBOX_SECURITY_GROUP_ID"),
    "vSwitchIds": [require_env("SANDBOX_VSWITCH_ID")],
}

sandbox = None
marker_written = False
try:
    sandbox = Sandbox.create(
        template=require_env("E2B_TEMPLATE"),
        timeout=300,
        api_key=require_env("E2B_API_KEY"),
        api_url=require_env("E2B_API_URL"),
        domain=require_env("E2B_DOMAIN"),
        metadata={
            "fc.sandbox.storage.agenticfs": json.dumps(agenticfs_config),
            "fc.sandbox.network.vpc": json.dumps(vpc_config),
            "fc.sandbox.auth.role": require_env("SANDBOX_ROLE_ARN"),
        },
    )

    sandbox.files.write(marker_path, "hello agenticfs\n")
    marker_written = True
    content = sandbox.files.read(marker_path)
    if content != "hello agenticfs\n":
        raise RuntimeError(f"文件内容不一致: {content!r}")
finally:
    try:
        if sandbox is not None and marker_written:
            sandbox.files.remove(marker_path)
    finally:
        if sandbox is not None:
            sandbox.kill()

print("AgenticFS 动态挂载读写验证成功")

运行示例:

python 12_sandbox_agenticfs.py

输出 AgenticFS 动态挂载读写验证成功 表示本次读写、测试文件清理和 Sandbox 释放已完成。

行为说明

释放 Sandbox 不会删除底层存储数据。测试文件由示例主动删除,其他数据的保留和清理需通过存储服务或挂载目录单独处理。

使用限制

  • 本地挂载目录必须是规范化的绝对 Unix 路径,不能为 /,不能包含前后空格、.、.. 或重复的路径分隔符。

  • 本地挂载目录不能使用 /bin、/opt、/var、/dev 等系统目录及其子目录,也不能包含 .cache 等隐藏目录。如需通过隐藏目录访问数据,可挂载到符合要求的目录后,再创建指向挂载目录的符号链接。

  • 同一个 Sandbox 中的本地挂载目录不能重复,包括不同存储类型的挂载目录。

  • 同一个 Sandbox 最多包含 5 个 AgenticFS 挂载点,按创建时与后续追加的挂载累计计算,包括直接配置和引用 Volume 的挂载。

  • 同一个 Sandbox 中的多个 AgenticFS 挂载点共用同一组 userID 和 groupID:单次挂载配置内的所有挂载点共用该组取值,追加挂载指定的 UID/GID 也不得与当前 Sandbox 已有配置冲突。

常见问题

已配置 VPC,为什么仍提示配置不完整

错误消息包含 mount requires complete VPC config,表示本次创建使用的 VPC 配置缺少必填项。

在本次创建请求的 metadata 中,通过 fc.sandbox.network.vpc 传入包含 vpcId、securityGroupId 和非空 vSwitchIds 的 JSON 字符串。直接提供挂载配置时,需同时提供这项 metadata,模板或同一请求中 Volume 的 VPC 配置均不能替代。

创建 Sandbox 提示缺少 RAM 角色

错误消息包含 AgenticFS mount requires Function role,表示本次创建未获得挂载所需的 RAM 角色。

按本文示例,在创建请求的 metadata 中通过 fc.sandbox.auth.role 提供有效的角色 ARN,然后重新提交创建请求。角色配置方法参见创建 RAM 角色。

metadata 提示未知字段

错误消息包含 json: unknown field 时,根据消息指出的字段核对配置。AgenticFS 只接受本文参数表中声明的字段,且字段名区分大小写。

例如,使用 userID 而非 userId,使用 serverAddr 而非 serveraddr;删除 enableTLS、readOnly 等不支持的字段。TLS 由平台启用,无需在挂载配置中设置。

Sandbox 创建超时或挂载失败

如果错误消息未指出具体参数问题,可按以下顺序排查实际挂载条件:

  1. 确认 Access Point 处于 active 状态,地址和远端目录填写正确。

  2. 检查 Sandbox 所用 VPC 的路由、安全组及与 Access Point 的连通性。

  3. 检查实际使用的 RAM 角色,确认信任策略允许函数计算服务扮演,且具备目标存储所需的访问权限。

  4. 使用第二代运行时自定义模板时,按本文镜像要求验证 AgenticFS 客户端。

如需进一步排查,请保留完整错误信息和请求 ID。