追加挂载 AgenticFS

更新时间:
复制 MD 格式

Sandbox 处于运行中状态时,可通过追加挂载接口增加 AgenticFS 挂载,无需重新创建 Sandbox。

功能介绍

Sandbox 处于运行中(running)状态时,可以增加 AgenticFS 挂载,无需重新创建 Sandbox。追加时可以直接提供 AgenticFS 挂载配置,也可以按名称引用已有 AgenticFS Volume。

本文介绍运行后追加挂载。创建 Sandbox 时直接提供挂载配置的方法,参见动态挂载 AgenticFS。

适用范围

  • Sandbox 处于运行中状态。已暂停的 Sandbox 需要先恢复运行。

  • 请求使用的 API Key 与目标 Sandbox 属于同一 Team。

  • 已准备启用 RAM(Resource Access Management,访问控制)认证且处于 active 状态的 AgenticSpace Access Point(以下简称 Access Point)。

  • Sandbox 已配置 RAM 角色和可访问目标 Access Point 的完整 VPC(Virtual Private Cloud,专有网络)信息。该角色需具备目标 AgenticFS 的挂载和读写权限。

  • 引用已有 Volume 时,已在同一 Team 中创建 AgenticFS Volume,并获取可用 Volume 的名称。

完整 VPC 配置包含 vpcId、securityGroupId 和非空的 vSwitchIds。追加挂载沿用 Sandbox 当前的 RAM 角色和 VPC 配置。追加接口不会设置或更换这些配置;引用已有 Volume 时,其 mountConfig 也不会替换当前配置。

角色配置方法参见创建 RAM 角色。创建 Sandbox 时直接配置挂载,参见动态挂载 AgenticFS;按名称引用 Volume,参见挂载 AgenticFS Volume,该文档也说明了第二代运行时的镜像要求。

挂载时,智能体沙箱通过 RAM 角色获取 STS(Security Token Service,安全令牌服务)临时凭证,最终有效权限不会超过 RAM 角色的授权范围。AgenticFS 的权限边界由 Access Point 决定;其下的远端子目录用于选择挂载位置,不能替代 Access Point 级别的权限隔离。

接口与参数

POST /sandboxes/{sandboxID}/fc-volume-mounts

请求头需要提供 X-API-Key 和 Content-Type: application/json。接口成功时返回 204 No Content,响应体为空。

请求体支持直接提供配置和引用已有 Volume,两种方式可以在同一次请求中组合使用:

字段

类型

是否必填

说明

inlineVolumeMounts.agenticFS

对象

与 namedVolumeMounts 至少提供一种。

直接提供 AgenticFS 挂载配置,字段见下表。

namedVolumeMounts

对象数组

与 inlineVolumeMounts.agenticFS 至少提供一种。

按名称引用已有 Volume。

namedVolumeMounts[].name

字符串

引用 Volume 时必填。

同一 Team 中的 Volume 名称,不使用 Volume ID。

namedVolumeMounts[].path

字符串

引用 Volume 时必填。

Sandbox 内的本地挂载目录。

请求至少需要包含一个有效挂载点。追加请求中的挂载配置是 JSON 对象,不使用创建 Sandbox 时的 metadata 或 JSON 字符串格式。注意字段大小写:创建时的 metadata 键为 fc.sandbox.storage.agenticfs,追加请求中的字段为 agenticFS。

AgenticFS 挂载参数

以下字段位于 inlineVolumeMounts.agenticFS 中;选择直接提供配置时,按表中要求填写:

字段

类型

是否必填

说明

inlineVolumeMounts.agenticFS.userID

整数

否

取值范围为 -1~65534。如设置,不得与当前 Sandbox 已有的 UID 配置冲突。

inlineVolumeMounts.agenticFS.groupID

整数

否

取值范围为 -1~65534。如设置,不得与当前 Sandbox 已有的 GID 配置冲突。

inlineVolumeMounts.agenticFS.mountPoints

对象数组

是

本次请求的 AgenticFS 挂载点列表,包含 1~5 个挂载点;已有与新增 AgenticFS 挂载点累计不能超过 5 个。

inlineVolumeMounts.agenticFS.mountPoints[].serverAddr

字符串

是

Access Point 地址,最长 128 个字符,可在 :/ 后指定其下的远端子目录。

inlineVolumeMounts.agenticFS.mountPoints[].mountDir

字符串

是

Sandbox 内的本地挂载目录,最长 128 个字符,须符合使用限制中的目录要求。

本地挂载目录

mountDir 和 namedVolumeMounts[].path 表示 Sandbox 内的本地挂载目录,与 Access Point 地址中的远端目录分别配置。建议使用 /home、/mnt、/tmp 或 /data 的子目录,目录限制参见使用限制。

安装 SDK

示例使用 httpx 调用追加挂载接口,成功后通过 E2B SDK 连接已有 Sandbox,验证文件读写。

pip install e2b==2.31.0 httpx

环境变量说明

环境变量

用途

取值来源或填写方式

E2B_API_KEY

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

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

E2B_API_URL

智能体沙箱 E2B API 地址。

https://api.<REGION>.sandbox.aliyuncs.com,地域与目标 Sandbox 一致。

E2B_DOMAIN

SDK 访问 Sandbox 的域名。

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

SANDBOX_ID

接收追加挂载请求的 Sandbox ID。

从创建 Sandbox 的响应或 Sandbox 列表中获取。

AGENTICFS_SERVER_ADDR

Access Point 地址及远端目录。

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

存储类型专用的环境变量用于直接提供挂载配置。引用已有 Volume 时,无需设置这些变量。

追加挂载示例

在本地终端设置连接信息,将占位符替换为实际值:

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 SANDBOX_ID="<SANDBOX-ID>"

以下代码在本地运行,通过 SDK 访问 Sandbox 内的文件。示例会创建带随机标识的独立测试文件,写入并读取校验后删除该文件,保留当前 Sandbox。请使用允许读写的挂载配置;仅允许读取时,按验证挂载调整验证代码。

Sandbox.connect() 会更新 Sandbox 的超时时间。示例通过 timeout=300 将连接后的超时时间设为 300 秒,可按任务需要调整。

两种方式任选其一,也可以在同一次请求中组合使用:

  • 直接提供挂载配置:在请求体的 inlineVolumeMounts.agenticFS 中给出 AgenticFS 挂载参数。

  • 引用已有 Volume:在请求体的 namedVolumeMounts 中按名称引用同一 Team 中的 Volume。

直接提供挂载配置

以下示例将 Access Point 指定的目录追加到 /mnt/agenticfs,并验证读写。请确保 RAM 角色和目录权限允许读写。

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

将以下代码保存为 append_agenticfs.py,确认 mount_dir 未被已有挂载占用:

import os
from uuid import uuid4

import httpx
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


def verify_read_write(sandbox: Sandbox, mount_dir: str) -> None:
    marker_path = f"{mount_dir}/mount-check-{uuid4().hex}.txt"
    expected = f"append mount check {uuid4().hex}\n"
    sandbox.files.write(marker_path, expected)
    try:
        content = sandbox.files.read(marker_path)
        if content != expected:
            raise RuntimeError(f"文件内容校验失败: {marker_path}")
    finally:
        sandbox.files.remove(marker_path)
    print(f"读写校验通过,测试文件已删除: {mount_dir}")


api_key = require_env("E2B_API_KEY")
api_url = require_env("E2B_API_URL").rstrip("/")
domain = require_env("E2B_DOMAIN")
sandbox_id = require_env("SANDBOX_ID")
mount_dir = "/mnt/agenticfs"

payload = {
    "inlineVolumeMounts": {
        "agenticFS": {
            "mountPoints": [{
                "serverAddr": require_env("AGENTICFS_SERVER_ADDR"),
                "mountDir": mount_dir,
            }],
        },
    },
}

response = httpx.post(
    f"{api_url}/sandboxes/{sandbox_id}/fc-volume-mounts",
    headers={"X-API-Key": api_key},
    json=payload,
    timeout=120.0,
)
if response.status_code != 204:
    raise RuntimeError(f"追加挂载失败: HTTP {response.status_code}, {response.text}")

sandbox = Sandbox.connect(
    sandbox_id,
    timeout=300,
    api_key=api_key,
    api_url=api_url,
    domain=domain,
)

verify_read_write(sandbox, mount_dir)

运行示例:

python append_agenticfs.py

示例未设置 userID 和 groupID。新增挂载的 UID/GID 不得与当前 Sandbox 已有配置冲突。此要求也适用于按名称引用 Volume 的追加挂载。远端子目录的配置说明参见动态挂载 AgenticFS。

引用已有 Volume

已有 AgenticFS Volume 时,首次运行前将上述脚本中的 payload 定义替换为以下内容,其他代码保持不变。请将 name 替换为同一 Team 中的 Volume 名称,读写校验要求该 Volume 允许读写。

payload = {
    "namedVolumeMounts": [{
        "name": "agenticfs-workspace",
        "path": mount_dir,
    }],
}

以上两种方式选择一种运行。同一个挂载目录不能重复追加;挂载已成功但校验失败时,只需重新执行连接和验证代码,不要再次提交追加请求。

直接配置与引用 Volume 组合使用时,将两种配置放入同一个请求体,并为每个挂载点指定不同的本地挂载目录。引用 Volume 的完整操作和多卷示例参见追加挂载 Volume。

验证挂载

示例仅在接口返回 204 后连接 Sandbox 并验证文件读写。输出“读写校验通过,测试文件已删除”表示写入、内容比对和删除均已完成。

仅具备读取权限时,只验证读取。首次运行前,将示例末尾的 verify_read_write(sandbox, mount_dir) 替换为以下代码,并把 <EXISTING-FILE> 替换为挂载目录中已存在的文件相对路径。

file_path = f"{mount_dir}/<EXISTING-FILE>"
content = sandbox.files.read(file_path, format="bytes")
print(f"读取成功: {file_path},{len(content)} 字节")

引用 Volume 的挂载还可以在连接成功后通过 SDK 查询:

print(sandbox.get_info().volume_mounts)

SDK 的 volume_mounts 对应 GET /sandboxes/{sandboxID} 响应中的 volumeMounts。直接提供配置的挂载不会出现在该字段中,需要通过文件访问验证。目录存在不代表数据访问正常。

行为说明

释放 Sandbox 不会删除 AgenticFS 中的数据。测试文件和任务数据需要通过存储服务或挂载目录单独清理。

使用限制

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

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

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

  • 接口只增加挂载,不支持卸载或替换。需要移除已有挂载时,应释放并重新创建 Sandbox。请求中省略已有挂载不会删除它,重复提交同一个挂载会返回 400。

  • 已有与新增 AgenticFS 挂载点累计最多 5 个,不能只按本次请求中的数量计算。

  • 不要并发更新同一个 Sandbox 的挂载。

常见问题

请求被 API Key 策略拒绝

错误消息为 request is not allowed by API key policy 时,检查 API Key 策略是否允许本次挂载方式和存储类型,参见API Key 管理。这类拒绝发生在接口授权阶段,调整存储 RAM 角色不能解决。

按名称挂载时提示找不到 Volume

核对请求中的 Volume 名称、API Key 所属 Team 和 API 地址的地域,确认使用同一 Team 中的 Volume 名称,而非 Volume ID。详细说明参见追加挂载 Volume。

按名称挂载时提示 Volume 不可用

通过 GetVolume 查询 Volume 的状态和状态原因,确认处于可用状态后再挂载;存在失败原因时,先处理该原因。详细说明参见追加挂载 Volume。

追加挂载提示 Sandbox 未运行

错误消息为 sandbox must be running 时,确认目标 Sandbox 已进入 running 状态。已暂停的 Sandbox 需先恢复运行;已释放的 Sandbox 需重新创建。

追加挂载提示缺少 RAM 角色

错误消息包含 FC Function execution Role is required,表示当前 Sandbox 未配置所需的 RAM 角色。追加接口沿用当前角色,不会从新增 Volume 的 mountConfig.role 为 Sandbox 设置角色。

需要准备具备目标存储访问权限的角色,并在重新创建 Sandbox 时配置。具体方法参见创建 RAM 角色。

追加挂载提示 Sandbox 的 VPC 配置不完整

错误消息包含 FC Function complete VPC configuration is required 时,缺少配置的是当前 Sandbox。追加请求或新增 Volume 的 mountConfig.vpcConfig 不会补齐它。

需要在重新创建 Sandbox 时配置完整的 vpcId、securityGroupId 和非空 vSwitchIds。创建时可直接通过 metadata 提供,或在引用 Volume 时使用该 Volume 保存的 VPC 配置。

追加挂载提示 UID/GID 冲突

错误消息包含 requested storage UID/GID conflicts with the active FC Session 时,新增挂载指定的 UID/GID 与当前 Sandbox 已有配置冲突。

直接提供配置时,核对 inlineVolumeMounts.agenticFS.userID 和 groupID;引用 Volume 时,核对该 Volume 的 UID/GID 配置。使用与当前 Sandbox 兼容的配置;需要使用不同身份配置时,应另行创建 Sandbox。

追加挂载提示目录重复

错误消息包含 duplicate mount path 或 duplicate mount dir 时,检查本次请求内是否有重复的本地挂载目录,以及目录是否已被 Sandbox 中的其他挂载占用。不同存储类型也不能共用同一个本地挂载目录。

已有挂载无需再次提交;新增挂载应使用未占用的目录。追加接口不能覆盖或替换已有挂载。

本次只追加一个挂载点,为什么仍提示数量超限

挂载数量按 Sandbox 中已有和本次新增的挂载累计计算,直接配置和引用 Volume 的挂载都需计入。不能只检查本次请求的数量。

按本文使用限制核对相应存储类型的挂载数量。达到上限时,可将新增存储挂载到另一个 Sandbox;更换本地挂载目录不会减少已有挂载数量。

若问题仍未解决,或接口提示服务暂时不可用,请保留完整错误信息和请求 ID,联系产品支持。