建立 Sandbox 時,可以通過 volume_mounts 將已有 OSS Volume 掛載到指定目錄。掛載後,Sandbox 可以通過檔案路徑訪問 OSS,資料不隨 Sandbox 釋放而刪除。
前提條件
已為目標 Team 建立 OSS Volume,並擷取 Volume 名稱。
已準備綁定同一 Team 的雲沙箱 API Key。Volume 和 API Key 不能跨 Team 使用。
已準備函數執行 RAM Role。該 Role 具備目標 OSS 路徑的存取權限,且信任策略允許Function Compute服務扮演。
已準備雲沙箱 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 的信任策略還必須允許Function Compute服務扮演。相關配置參見權限原則及樣本。
安裝 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 只能讀取掛載路徑內的檔案。
使用限制
由於安全問題,OSS 掛載暫不支援 KMS(Key Management Service,Key Management Service)服務端加密(SSE-KMS)。
同一個 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 的信任策略是否允許Function Compute服務扮演。