挂载 OSS Volume

更新时间:
复制 MD 格式

创建 Sandbox 时,可以通过 volume_mounts 将已有 OSS Volume 挂载到指定目录。挂载后,Sandbox 可以通过文件路径访问 OSS,数据不随 Sandbox 释放而删除。

前提条件

  • 已为目标 Team 创建 OSS Volume,并获取 Volume 名称。

  • 已准备绑定同一 Team 的云沙箱 API Key。Volume 和 API Key 不能跨 Team 使用。

  • 已准备函数执行 RAM Role。该 Role 具备目标 OSS 路径的访问权限,且信任策略允许函数计算服务扮演。

  • 已准备云沙箱 API URL、Domain 和可用模板。

配置权限

请将以下权限策略授予函数执行 RAM Role:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:ListObjects",
        "oss:GetObject",
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:AbortMultipartUpload",
        "oss:ListParts"
      ],
      "Resource": "*"
    }
  ]
}

该 Role 的信任策略还必须允许函数计算服务扮演。相关配置参见权限策略及示例

安装 SDK

本文使用 Python E2B SDK 演示。volume_mounts 需要 E2B Python SDK 2.31.0 或以上版本。

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

运行示例前设置以下环境变量:

export E2B_API_KEY="<your-e2b-api-key>"
export E2B_API_URL="https://api.<region>.e2b.fc.aliyuncs.com"
export E2B_DOMAIN="<region>.e2b.fc.aliyuncs.com"
export E2B_TEMPLATE="code-interpreter-v1"

export OSS_VOLUME_NAME="oss-workspace"
export FCSANDBOX_ROLE_ARN="acs:ram::<account-id>:role/<execution-role>"

挂载并验证

以下示例将 OSS Volume 挂载到 /mnt/oss,并验证文件读写。该示例要求 Volume 不是只读 Volume。将代码保存为 01_mount_oss_volume.py

import os

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/oss"
marker_path = f"{mount_dir}/hello-oss.txt"
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"),
        volume_mounts={mount_dir: require_env("OSS_VOLUME_NAME")},
        metadata={
            "fc.sandbox.auth.role": require_env("FCSANDBOX_ROLE_ARN"),
        },
    )

    info = sandbox.get_info()
    print(f"volume_mounts={info.volume_mounts}")

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

运行示例:

python 01_mount_oss_volume.py

行为说明

  • volume_mounts 使用 {挂载目录: Volume 名称} 格式,不使用 Volume ID。

  • Sandbox 暂停后再恢复时会恢复 Volume 挂载,OSS 数据不依赖 Sandbox 生命周期。

  • 只读 Volume 只能读取挂载路径内的文件。

使用限制

  • 同一个 Sandbox 最多挂载 5 个 OSS Volume。

  • 挂载目录必须是规范化的绝对 Unix 路径,不能为 /,不能包含前后空格或 ..

  • 同一个 Sandbox 中的挂载目录不能重复。建议使用 /mnt/oss 或其子目录,避免覆盖模板内已有目录。

常见问题

Sandbox 创建时挂载失败

检查 Volume 与 API Key 是否属于同一 Team、执行 Role 权限是否正确,以及 Bucket Policy 是否限制了访问来源。保留 request ID 便于排查。

Volume 已挂载但无法写入

检查 Volume 是否为只读、执行 Role 是否具备写入权限,以及 Bucket Policy 是否拒绝当前访问。

创建 Sandbox 提示 requires executionRoleArn 错误

检查 fc.sandbox.auth.role 是否为空,以及执行 Role 的信任策略是否允许函数计算服务扮演。