创建 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 键 |
值的格式 |
说明 |
|
|
JSON 字符串 |
AgenticBucket 挂载配置,字段见下表。 |
|
|
字符串 |
访问目标存储的有效 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
}
]
}
|
字段 |
类型 |
是否必填 |
说明 |
|
|
对象数组 |
是 |
AgenticBucket 挂载点列表。 |
|
|
字符串 |
是 |
AgenticBucket 完整名称。 |
|
|
字符串 |
是 |
BucketSpace 完整名称。 |
|
|
字符串 |
是 |
Sandbox 内的本地挂载目录,必须是绝对路径,例如 |
|
|
字符串 |
否 |
BucketSpace 内路径;缺失时默认为 |
|
|
字符串 |
是 |
OSS Endpoint,应与 AgenticBucket 所在地域及网络环境匹配。 |
|
|
布尔值 |
否 |
是否只读挂载;缺失时默认为 |
bucketName 使用 BucketSpace 完整名称,bucketPath 选择其下的路径。需要只读访问时,将 readOnly 设置为 true。
智能体沙箱通过 RAM 角色获取 STS(Security Token Service,安全令牌服务)临时凭证,无需关闭 AgenticBucket 的 BlockPublicAccess,也无需在挂载配置中提供长期 AK/SK。挂载配置不会扩大 RAM 角色的授权范围。
本地挂载目录
mountDir 表示 Sandbox 内的本地挂载目录,远端目录通过存储配置单独指定。建议使用 /home、/mnt、/tmp 或 /data 的子目录,避免覆盖模板内已有内容。目录限制参见使用限制。
环境变量说明
|
环境变量 |
用途 |
取值来源或填写方式 |
|
|
调用智能体沙箱接口的 API Key。 |
在智能体沙箱控制台创建,使用目标 Team 的 API Key。 |
|
|
智能体沙箱 E2B API 地址。 |
|
|
|
SDK 访问 Sandbox 的域名。 |
|
|
|
创建 Sandbox 使用的模板 ID 或别名。 |
在智能体沙箱控制台选择满足本文客户端要求的模板。 |
|
|
AgenticBucket 完整名称。 |
在 OSS 控制台的 AgenticBucket 详情中获取。 |
|
|
要挂载的 BucketSpace 完整名称。 |
使用已有 BucketSpace 的完整名称,或指定首次挂载时要创建的名称。 |
|
|
访问 AgenticBucket 的 OSS Endpoint。 |
在 OSS 控制台获取,与目标存储所在地域及网络匹配。 |
|
|
访问目标存储的 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。