动态挂载 AgenticBucket

更新时间:
复制 MD 格式

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

功能介绍

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

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

适用范围

AgenticBucket 的产品说明和资源管理方式参见AgenticBucket 概述。

  • 已创建 AgenticBucket,并获取完整名称。

  • 已确定要使用的 BucketSpace 完整名称。BucketSpace 无需预先创建;首次挂载时如果不存在,系统会自动创建。

  • 已获取 AgenticBucket 所在地域的 OSS Endpoint。同地域访问建议使用内网 Endpoint,例如 https://oss-<REGION>-internal.aliyuncs.com,不需要额外配置 VPC(Virtual Private Cloud,专有网络)。

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

  • 已准备 RAM(Resource Access Management,访问控制)角色,其信任策略允许函数计算服务扮演该角色,并具备目标存储所需的访问权限。角色配置方法参见配置 RAM 角色,存储权限策略参见创建 AgenticBucket Volume。

第二代运行时镜像要求

使用第二代运行时(MicroVM)自定义模板时,需在构建模板前预装存储客户端。客户端安装、镜像构建和验证方法参见挂载 AgenticBucket 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.agenticbucket

JSON 字符串

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

fc.sandbox.auth.role

字符串

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

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

{
  "mountPoints": [
    {
      "agenticBucket": "<AGENTIC-BUCKET-FULL-NAME>",
      "bucketName": "<BUCKET-SPACE-FULL-NAME>",
      "mountDir": "/mnt/agentic-bucket",
      "bucketPath": "/",
      "endpoint": "https://oss-<REGION>-internal.aliyuncs.com",
      "readOnly": false
    }
  ]
}

字段

类型

是否必填

说明

mountPoints

对象数组

是

AgenticBucket 挂载点列表。

mountPoints[].agenticBucket

字符串

是

AgenticBucket 完整名称。

mountPoints[].bucketName

字符串

是

BucketSpace 完整名称。

mountPoints[].mountDir

字符串

是

Sandbox 内的本地挂载目录,必须是绝对路径,例如 /mnt/agentic-bucket。

mountPoints[].bucketPath

字符串

否

BucketSpace 内路径;缺失时默认为 /。

mountPoints[].endpoint

字符串

是

OSS Endpoint,应与 AgenticBucket 所在地域及网络环境匹配。

mountPoints[].readOnly

布尔值

否

是否只读挂载;缺失时默认为 false。

bucketName 使用 BucketSpace 完整名称,bucketPath 选择其下的路径。需要只读访问时,将 readOnly 设置为 true。

智能体沙箱通过 RAM 角色获取 STS(Security Token Service,安全令牌服务)临时凭证,无需关闭 AgenticBucket 的 BlockPublicAccess,也无需在挂载配置中提供长期 AK/SK。挂载配置不会扩大 RAM 角色的授权范围。

本地挂载目录

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 或别名。

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

AGENTIC_BUCKET_NAME

AgenticBucket 完整名称。

在 OSS 控制台的 AgenticBucket 详情中获取。

BUCKET_SPACE_NAME

要挂载的 BucketSpace 完整名称。

使用已有 BucketSpace 的完整名称,或指定首次挂载时要创建的名称。

OSS_ENDPOINT

访问 AgenticBucket 的 OSS Endpoint。

在 OSS 控制台获取,与目标存储所在地域及网络匹配。

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 AGENTIC_BUCKET_NAME="<AGENTIC-BUCKET-FULL-NAME>"
export BUCKET_SPACE_NAME="<BUCKET-SPACE-FULL-NAME>"
export OSS_ENDPOINT="https://oss-<REGION>-internal.aliyuncs.com"
export SANDBOX_ROLE_ARN="acs:ram::<ACCOUNT-ID>:role/<ROLE-NAME>"

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

将以下代码保存为 11_sandbox_agentic_bucket.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/agentic-bucket"
marker_path = f"{mount_dir}/hello-agentic-bucket-{uuid4().hex}.txt"
agentic_bucket_config = {
    "mountPoints": [
        {
            "agenticBucket": require_env("AGENTIC_BUCKET_NAME"),
            "bucketName": require_env("BUCKET_SPACE_NAME"),
            "mountDir": mount_dir,
            "bucketPath": "/",
            "endpoint": require_env("OSS_ENDPOINT"),
            "readOnly": False,
        }
    ]
}

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.agenticbucket": json.dumps(agentic_bucket_config),
            "fc.sandbox.auth.role": require_env("SANDBOX_ROLE_ARN"),
        },
    )

    sandbox.files.write(marker_path, "hello agentic bucket\n")
    marker_written = True
    content = sandbox.files.read(marker_path)
    if content != "hello agentic bucket\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("AgenticBucket 动态挂载读写验证成功")

运行示例:

python 11_sandbox_agentic_bucket.py

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

行为说明

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

使用限制

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

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

  • 同一个 Sandbox 中的本地挂载目录不能重复,该限制跨存储类型生效。

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

常见问题

创建 Sandbox 时提示缺少 RAM 角色

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

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

Sandbox 创建时挂载失败

根据错误消息核对 AgenticBucket 和 BucketSpace 的完整名称及 Endpoint。如果消息提示存储访问被拒绝,检查 fc.sandbox.auth.role 指定角色的信任策略及存储访问权限。使用第二代运行时自定义模板时,还需按本文镜像要求确认已安装相应存储客户端。

可以读取本地挂载目录,但无法写入

先检查本次挂载是否设置了 readOnly: true。只读挂载不允许写入。

如果配置为可读写,继续检查所用 RAM 角色是否具备写入权限,以及 AgenticBucket 的访问控制是否允许相应操作。

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