JuiceFS Volume 保存已有 JuiceFS 企业版文件系统的挂载配置,供创建 Sandbox 时按 Volume 名称挂载。
功能介绍
Volume 创建完成后,可以在创建 Sandbox 时按 Volume 名称挂载 JuiceFS 文件系统。
CreateVolume 仅保存挂载配置,不会创建 JuiceFS 文件系统或复制其中的数据。
适用范围
-
已在智能体沙箱(Agent Sandbox)控制台创建 Team,并获取 Team ID。
-
已在 JuiceFS 企业版控制台创建文件系统,并获取文件系统名称、访问 Token 和服务地址。操作方法参见 JuiceFS 企业版快速上手。
-
已准备与 JuiceFS 服务网络连通的 VPC(Virtual Private Cloud,专有网络)、交换机和安全组,供本文示例保存到 Volume。
-
调用 Volume API 的 RAM(Resource Access Management,访问控制)身份具备相应操作权限。授权方法参见授权 RAM 用户访问控制台。
操作步骤
步骤一:安装 SDK
本文使用阿里云 Python SDK 调用 Volume API。请先按照阿里云 SDK & API 说明安装 SDK 并配置访问凭证。
步骤二:创建 JuiceFS Volume
请求参数、返回参数和错误码参见 CreateVolume - 创建 Volume。
存储配置
juiceFSVolumeConfig 的字段与 Python SDK 参数对应如下:
|
API 字段 |
Python SDK 字段 |
是否必填 |
说明 |
|
|
|
是 |
已有的 JuiceFS 文件系统名称,不是要创建的智能体沙箱 Volume 名称。 |
|
|
|
是 |
JuiceFS 企业版客户端访问的服务地址。 |
|
|
|
否 |
JuiceFS 文件系统中要挂载的远端目录,最大长度为 128 字节。本文示例显式设置为 |
|
|
|
是 |
JuiceFS 文件系统的访问 Token,最大长度为 256 字节。Volume 查询响应不会回显该字段。 |
|
|
|
否 |
传递给 JuiceFS 客户端的额外挂载参数,类型为字符串数组。不要重复传入由 |
remoteDir 指定 JuiceFS 文件系统中的远端目录,与 Sandbox 内的本地挂载目录不同。设置为 /datasets/project-a 时,挂载内容来自该子目录;目录不存在时,系统会在挂载时自动创建。请使用以 / 开头的远端绝对路径,并确保 Token 具有创建和访问目标目录所需的权限。
平台会将 remoteDir 转换为 JuiceFS 客户端的 --subdir 参数,无需在 args 中重复设置。
不要在日志中打印请求体、JuiceFS Token 或其他凭证。
挂载配置
mountConfig.vpcConfig 可以保存访问 JuiceFS 服务所需的 VPC 配置,供创建 Sandbox 时使用。Python SDK 对应参数为 mount_config.vpc_config,通过 models.CreateVolumeInputMountConfigVpcConfig 构造。
|
API 字段 |
Python SDK 字段 |
是否必填 |
说明 |
|
|
|
配置 VPC 时必填 |
可访问 JuiceFS 服务的 VPC ID。 |
|
|
|
配置 VPC 时必填 |
该 VPC 中的安全组 ID。 |
|
|
|
配置 VPC 时必填 |
该 VPC 中的交换机 ID 列表,至少填写一个。 |
mountConfig.vpcConfig 为可选项;填写时,必须完整提供 vpcId、securityGroupId 和 vSwitchIds 三个字段。本文示例将 VPC 配置保存在 Volume 中,后续创建 Sandbox 时直接复用。也可以在创建 Sandbox 时通过 metadata 的 fc.sandbox.network.vpc 提供 VPC 配置;两处均配置时,以 metadata 为准。
JuiceFS 通过 Token 访问文件系统,挂载 JuiceFS 本身不要求配置 mountConfig.role。Sandbox 内的本地挂载目录在挂载时通过 volume_mounts 指定。
环境变量说明
以下环境变量供本文示例读取。访问凭证按步骤一的 SDK 说明配置,其余参数在创建示例中设置。
|
环境变量 |
用途 |
取值来源或填写方式 |
|
|
调用 Volume API 的 AccessKey ID。 |
按阿里云 SDK & API 说明配置调用身份的访问凭证。 |
|
|
与 AccessKey ID 配套的 AccessKey Secret。 |
与上述 AccessKey ID 一并获取。 |
|
|
使用 STS(Security Token Service,安全令牌服务)临时凭证时的安全令牌。 |
仅使用 STS 临时凭证时设置,取自同一组临时凭证。 |
|
|
调用 Volume API 的地域。 |
填写目标地域 ID,例如 |
|
|
Volume API 的服务接入点。 |
填写 |
|
|
Volume 所属的 Team。 |
从智能体沙箱控制台获取目标 Team 的 ID。 |
|
|
要创建的智能体沙箱 Volume 名称。 |
自行设置,同一 Team 内不能重复;示例使用 |
|
|
已有的 JuiceFS 文件系统名称。 |
从 JuiceFS 企业版控制台获取,与智能体沙箱 Volume 名称不同。 |
|
|
JuiceFS 企业版服务地址。 |
填写已有 JuiceFS 服务提供的客户端访问地址。 |
|
|
访问 JuiceFS 文件系统的 Token。 |
从 JuiceFS 企业版控制台获取目标文件系统的访问 Token。 |
|
|
要挂载的远端目录。 |
按数据所在位置填写;示例使用 |
|
|
访问 JuiceFS 服务的 VPC。 |
从 VPC 控制台获取与 JuiceFS 服务网络连通的 VPC ID。 |
|
|
挂载使用的安全组。 |
从安全组控制台获取上述 VPC 内的安全组 ID,确保规则允许访问 JuiceFS 服务。 |
|
|
挂载使用的交换机。 |
从 VPC 控制台获取上述 VPC 内的交换机 ID;本示例使用一个交换机。 |
创建示例
在已配置访问凭证的终端中,设置以下参数,并将占位符替换为实际值。各变量的取值参见本文环境变量说明。
export SANDBOX_REGION_ID="<REGION>"
export SANDBOX_ENDPOINT="sandbox.${SANDBOX_REGION_ID}.aliyuncs.com"
export SANDBOX_TEAM_ID="<TEAM-ID>"
export SANDBOX_VOLUME_NAME="juicefs-workspace"
export JUICEFS_VOLUME_NAME="<JUICEFS-FILE-SYSTEM-NAME>"
export JUICEFS_BASE_URL="https://<JUICEFS-SERVICE-ADDRESS>"
export JUICEFS_TOKEN="<JUICEFS-TOKEN>"
export JUICEFS_REMOTE_DIR="/"
export SANDBOX_VPC_ID="<VPC-ID>"
export SANDBOX_SECURITY_GROUP_ID="<SECURITY-GROUP-ID>"
export SANDBOX_VSWITCH_ID="<VSWITCH-ID>"
将以下代码保存为 01_create_juicefs_volume.py:
import os
from alibabacloud_sandbox20260820 import models
from alibabacloud_sandbox20260820.client import Client as SandboxClient
from alibabacloud_tea_openapi import utils_models as open_api_models
def require_env(name: str) -> str:
value = os.environ.get(name, "").strip()
if not value:
raise RuntimeError(f"缺少环境变量: {name}")
return value
config = open_api_models.Config(
access_key_id=require_env("ALIBABA_CLOUD_ACCESS_KEY_ID"),
access_key_secret=require_env("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
security_token=os.environ.get("ALIBABA_CLOUD_SECURITY_TOKEN"),
region_id=require_env("SANDBOX_REGION_ID"),
endpoint=require_env("SANDBOX_ENDPOINT"),
)
pop_client = SandboxClient(config)
response = pop_client.create_volume(
models.CreateVolumeRequest(
body=models.CreateVolumeInput(
team_id=require_env("SANDBOX_TEAM_ID"),
volume_name=require_env("SANDBOX_VOLUME_NAME"),
mount_config=models.CreateVolumeInputMountConfig(
vpc_config=models.CreateVolumeInputMountConfigVpcConfig(
vpc_id=require_env("SANDBOX_VPC_ID"),
security_group_id=require_env("SANDBOX_SECURITY_GROUP_ID"),
v_switch_ids=[require_env("SANDBOX_VSWITCH_ID")],
),
),
juice_fsvolume_config=models.JuiceFSVolumeConfig(
volume_name=require_env("JUICEFS_VOLUME_NAME"),
base_url=require_env("JUICEFS_BASE_URL"),
remote_dir=require_env("JUICEFS_REMOTE_DIR"),
token=require_env("JUICEFS_TOKEN"),
args=[],
),
)
)
)
if response.body is None or response.body.volume is None:
raise RuntimeError("CreateVolume 未返回 Volume")
volume = response.body.volume
print(f"request_id={response.body.request_id}")
print(f"volume_id={volume.volume_id}")
print(f"volume_name={volume.volume_name}")
print(f"storage_class={volume.storage_class}")
print(f"status={volume.status}")
在同一终端运行:
python 01_create_juicefs_volume.py
CreateVolume 不探测 JuiceFS 服务的网络连通性,也不执行真实挂载。参见挂载 JuiceFS Volume创建 Sandbox,并通过实际读写确认挂载可用。
管理 Volume
通过 ListVolumes 查询 Volume 列表,通过 GetVolume 查看详情,通过 UpdateVolume 更新 Volume 配置,通过 DeleteVolume 删除不再使用的 Volume。
删除 Volume 只删除智能体沙箱侧的挂载配置,不会删除 JuiceFS 文件系统或其中的数据。
使用限制
-
JuiceFS Volume 当前仅支持企业版文件系统。
-
同一 Team 中的 Volume 名称不能重复。
常见问题
创建 Volume 提示必须提供一种存储配置
错误消息为 request must contain exactly one volume config 时,请求缺少存储配置,或同时提供了多种存储配置。创建 JuiceFS Volume 应提供 juiceFSVolumeConfig,不同时提供其他存储类型的配置。
mountConfig.vpcConfig 保存挂载所需的 VPC 配置,不能代替 juiceFSVolumeConfig 中的文件系统名称、服务地址和 Token。具体字段参见本文存储配置。
创建 Volume 提示名称已存在
返回 VolumeConflict,且错误消息包含 already exists 时,表示同一 Team 中已有同名 Volume。查询该 Volume 的配置和状态,确认是否可以复用;需要创建独立资源时,使用其他名称。
创建 Volume 提示找不到 Team
返回 TeamNotFound 时,核对 teamID、调用凭证所属账号和请求地域,确认目标 Team 存在且属于当前账号。
调用 CreateVolume 被拒绝,应该给谁授权
检查调用 OpenAPI 的 RAM 身份是否具有 sandbox:CreateVolume 权限,以及授权范围是否覆盖目标 Team。授权方法参见授权 RAM 用户访问控制台。
JuiceFS Token 用于访问文件系统,不能代替调用 Volume API 所需的 RAM 权限。
如需进一步排查,请保留完整错误信息和请求 ID。