介绍如何通过云沙箱 OpenAPI SDK 以代码方式构建、查询、更新和删除自定义模板,并说明镜像来源、构建方式与接入 VPC 后的网络配置。
自定义模板用于定义沙箱运行所需的镜像和配置。本文介绍镜像来源和构建方式,再说明接入 VPC 后的网络配置。示例使用 Python,通过云沙箱 OpenAPI SDK 调用;TypeScript、Go、Java SDK 提供同名能力。
创建模板时需要关注以下配置项。
镜像来源:官方公共镜像、ACR 企业版(ACR EE)镜像。
构建方式与启动配置:支持启动命令(
start_command)和就绪命令(ready_command)。磁盘口径:
disk_size包含镜像自身占用,实际可写空间 = 磁盘大小 - 镜像大小。日志配置:示例统一包含
log_config。
开始之前
本节集中说明后续示例的公共准备工作,后续各节在此基础上给出完整的构建示例。后续创建和访问沙箱的示例还使用 E2B SDK,需一并安装并配置其访问凭证环境变量。
开通函数计算和云沙箱,在云沙箱控制台创建 Team 并获取 Team ID。
准备阿里云账号或 RAM 用户,并为调用身份配置模板 API 权限。最小权限策略示例:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sandbox:CreateTemplate", "sandbox:GetTemplate", "sandbox:ListTemplates", "sandbox:UpdateTemplate", "sandbox:DeleteTemplate" ], "Resource": "*" } ] }支持按 Team 精确授权模板资源,资源描述格式为
acs:sandbox:<region>:<account-id>:teams/<team-id>/templates/*。确认模板所在地域(示例使用
cn-hangzhou,请替换为目标地域)。准备镜像地址;使用私有镜像时准备对应凭证与拉取网络,详见镜像来源章节。
准备日志资源:在与云沙箱相同的地域下创建 SLS Project 和 Logstore,供
log_config投递构建与运行日志。
安装 SDK(以 Python 为例):
python3 -m venv .venv
source .venv/bin/activate
pip install "alibabacloud_sandbox20260820>=1.1.0"设置身份凭证环境变量:
export ALIBABA_CLOUD_ACCESS_KEY_ID="<your-access-key-id>"
export ALIBABA_CLOUD_ACCESS_KEY_SECRET="<your-access-key-secret>"
# 使用 STS 临时凭证时还需要设置:
# export ALIBABA_CLOUD_SECURITY_TOKEN="<your-security-token>"公共初始化代码,后续示例均以此为基础:
import os
import time
from alibabacloud_sandbox20260820 import models
from alibabacloud_sandbox20260820.client import Client as SandboxClient
from alibabacloud_tea_openapi import models as open_api_models
REGION = "cn-hangzhou"
TEAM_ID = "<your-team-id>"
config = open_api_models.Config(
access_key_id=os.environ["ALIBABA_CLOUD_ACCESS_KEY_ID"],
access_key_secret=os.environ["ALIBABA_CLOUD_ACCESS_KEY_SECRET"],
region_id=REGION,
endpoint=f"sandbox.{REGION}.aliyuncs.com",
)
pop_client = SandboxClient(config)
def wait_ready(template_id, timeout=900):
"""轮询模板构建状态直到终态,返回 status.state。"""
deadline = time.time() + timeout
while time.time() < deadline:
resp = pop_client.get_template(
template_id, models.GetTemplateRequest(team_id=TEAM_ID))
state = resp.body.status.state
if state in ("ready", "error"):
if state == "error":
print(f"构建失败: {resp.body.status.reason.message}")
return state
time.sleep(10)
return "timeout"镜像要求
自定义镜像需满足下表要求,按“硬性 / 条件 / 推荐”分级;MicroVM 模板还有更严格的发行版要求,请参见模板配置。
级别 | 要求 | 不满足时影响 |
硬性 | 架构为 | 模板构建直接失败 |
硬性 | ACR 镜像不开启镜像加速选项 | 模板构建直接失败 |
硬性 |
| 沙箱无法初始化默认用户,启动失败 |
条件 | Bash 位于镜像内的固定路径 |
|
条件 | PATH 中存在 | Python |
条件 | PATH 中存在 | JavaScript |
条件 | 按需提供 | 对应的 Git、SSH、HTTPS、编译安装操作不可用 |
推荐 | 系统 PATH 至少包含 | 登录 Shell 常用命令可能找不到 |
向自己的镜像仓库推送镜像时,不要向同一个 tag 推送内容不同的镜像。每个不同的镜像都必须使用新的唯一 tag(如版本号、日期或提交 ID),并让模板固定引用对应 tag。
模板配置
模板基于轻量虚拟机(MicroVM)隔离,支持快照能力:构建期执行的启动命令和运行环境会固化到模板快照,基于该模板创建沙箱时直接恢复运行态。镜像需为 Ubuntu/Debian 系,并保留 systemd、openssh-server、sudo 等系统组件。
建议始终显式设置 disk_size(示例使用 15360 MB),避免平台默认值随版本变化带来的规格校验差异。
选择镜像来源
官方公共镜像
官方公共镜像在全部支持地域均有提供,模板地址格式为 fc-e2b-registry.<地域>.cr.aliyuncs.com/runtime-v2/<镜像名>:<tag>,无需准备镜像仓库、凭证与网络配置。镜像地址的地域须与模板所在地域一致。
最小构建示例:
resp = pop_client.create_template(
models.CreateTemplateRequest(
body=models.CreateTemplateInput(
name=f"template-gen2-demo-{int(time.time())}",
team_id=TEAM_ID,
runtime_config=models.CreateTemplateRuntimeConfig(
cpu=2,
memory_size=2048,
disk_size=15360,
# 构建与运行日志投递到同地域 SLS。
log_config=models.CreateTemplateLogConfig(
project="<sls-project>",
logstore="<sls-logstore>",
),
sandbox_config=models.CreateTemplateSandboxConfig(
image=f"fc-e2b-registry.{REGION}.cr.aliyuncs.com/runtime-v2/base:v0.0.53",
generation=2, # 必填:2 表示 MicroVM 模板。
),
),
)
)
)
template_id = resp.body.template_id
state = wait_ready(template_id)
assert state == "ready"ACR EE 镜像
使用 ACR 企业版实例中的自有镜像。
前置准备:
在与云沙箱相同的阿里云账号和地域下创建 ACR EE 实例(经济版暂不支持)。
为 ACR EE 实例添加专有网络,确保云沙箱可以通过 VPC 拉取镜像。
创建命名空间与镜像仓库并推送镜像,镜像地址使用实例的 VPC 访问域名(
-vpc后缀),例如<instance>-registry-vpc.cn-hangzhou.cr.aliyuncs.com/<namespace>/<image>:<tag>。
网络约束:
ACR EE 实例的访问控制中已添加至少一个专有网络 VPC 绑定,且绑定处于“已生效”状态。云沙箱经该绑定在 VPC 内分配的访问 IP 拉取镜像;绑定刚创建存在“生效中”窗口,绑定失效会导致拉取失败,可在实例的访问控制页面确认绑定状态与访问 IP。
拉取网络的 VPC 需为 ACR EE 实例已绑定的 VPC,且该 VPC 下至少有一个 vSwitch 位于函数计算支持的可用区。
ACR EE 镜像仓库、VPC、vSwitch 与云沙箱需位于同一地域。
VPC 网段需使用 RFC 1918 规定的私有地址段,即
10.0.0.0/8、172.16.0.0/12或192.168.0.0/16,不支持公网私用。VPC 下需至少配置一个自建安全组,其出方向需放行 443/TCP。普通安全组出方向默认允许所有访问(无出方向规则即满足);企业级安全组出方向默认禁止所有访问,需显式添加放行 443/TCP 的出方向规则。
需确保 ACR EE 实例在 VPC 内存在入口 ENI。如果 ENI 已被删除,可以通过重新绑定 VPC 的方式重新创建。
函数计算支持的可用区会随地域和产品能力调整,最新列表参见配置网络。
拉取方式:只传 image 时,平台按镜像地址自动推导 ACR EE 实例与仓库类型,使用实例临时授权拉取,并从实例绑定的 VPC 推导拉取网络。需要显式指定实例、凭证或拉取网络时,再传 acr_instance_id、registry_config.auth_config 与 registry_config.network_config;实例推导出的 vSwitch 落在不支持的可用区导致拉取失败时,必须用 network_config 显式指定 VPC 三件套(vpc_id/v_switch_id/security_group_id)。
resp = pop_client.create_template(
models.CreateTemplateRequest(
body=models.CreateTemplateInput(
name=f"template-gen2-acree-{int(time.time())}",
team_id=TEAM_ID,
runtime_config=models.CreateTemplateRuntimeConfig(
cpu=2,
memory_size=2048,
disk_size=15360,
log_config=models.CreateTemplateLogConfig(
project="<sls-project>",
logstore="<sls-logstore>",
),
sandbox_config=models.CreateTemplateSandboxConfig(
image="<instance>-registry-vpc.cn-hangzhou.cr.aliyuncs.com/<namespace>/<image>:<tag>",
generation=2,
acr_instance_id="cri-xxxxxx",
registry_config=models.CreateTemplateRegistryConfig(
auth_config=models.CreateTemplateRegistryAuthConfig(
user_name="<username>",
password="<password>",
),
network_config=models.CreateTemplateRegistryNetworkConfig(
vpc_id="<vpc-id>",
v_switch_id="<vsw-id>",
security_group_id="<sg-id>",
),
),
),
),
)
)
)配置启动命令和就绪命令
以一个预置 HTTP 服务的场景说明两个命令的配合方式:构建期平台以后台进程执行 start_command 启动服务,然后反复执行 ready_command,退出码为 0 一次即判定服务就绪,随后对仍在运行的沙箱制作模板快照。基于该模板创建的沙箱在创建时服务已在运行,创建即可访问,不会再次执行启动命令。
执行时机:两个命令仅在模板构建期执行,结果固化进快照;创建沙箱时不重放。
填写格式:均为字符串形式的 Shell 命令;两个参数均为可选,不配置
start_command则不执行额外的启动命令。失败处理:
start_command提前退出、ready_command持续失败或等待超过 5 分钟,模板构建失败;ready_command写错的典型表现是构建超时而非参数报错。日志排查:命令输出与失败原因通过
log_config投递到 SLS,在对应 Logstore 中查看。
resp = pop_client.create_template(
models.CreateTemplateRequest(
body=models.CreateTemplateInput(
name=f"template-gen2-service-{int(time.time())}",
team_id=TEAM_ID,
runtime_config=models.CreateTemplateRuntimeConfig(
cpu=2,
memory_size=2048,
disk_size=15360,
log_config=models.CreateTemplateLogConfig(
project="<sls-project>",
logstore="<sls-logstore>",
),
sandbox_config=models.CreateTemplateSandboxConfig(
image=f"fc-e2b-registry.{REGION}.cr.aliyuncs.com/runtime-v2/base:v0.0.53",
generation=2,
# 构建期以后台进程执行。
start_command="python3 -m http.server 8000",
# 反复执行,退出码为 0 一次即判定就绪。
ready_command="curl -sf http://localhost:8000/ > /dev/null",
),
),
)
)
)
template_id = resp.body.template_id
state = wait_ready(template_id)
assert state == "ready"构建就绪后,使用 E2B SDK 创建沙箱并直接访问服务:
from e2b import Sandbox
sandbox = Sandbox.create(
template=template_id,
timeout=600,
# SDK 自动读取 E2B_API_KEY / E2B_API_URL / E2B_DOMAIN 环境变量。
api_url=f"https://api.{REGION}.e2b.fc.aliyuncs.com",
domain=f"{REGION}.e2b.fc.aliyuncs.com",
)
try:
host = sandbox.get_host(8000)
print(f"https://{host}")
finally:
sandbox.kill()安装存储客户端
创建自定义模板时,可通过 buildConfig.installStorageClients 自动安装持久化存储客户端。该参数要求 MicroVM 运行时,请在 runtimeConfig.sandboxConfig 中设置 generation: 2。
请求体示例:
resp = pop_client.create_template(
models.CreateTemplateRequest(
body=models.CreateTemplateInput(
name=f"template-gen2-storage-{int(time.time())}",
team_id=TEAM_ID,
runtime_config=models.CreateTemplateRuntimeConfig(
sandbox_config=models.CreateTemplateSandboxConfig(
image=f"fc-e2b-registry.{REGION}.cr.aliyuncs.com/runtime-v2/base:v0.0.53",
generation=2,
),
),
build_config=models.CreateTemplateBuildConfig(
install_storage_clients=True,
),
)
)
)
template_id = resp.body.template_id
state = wait_ready(template_id)
assert state == "ready"CreateTemplate 成功仅表示模板构建任务已提交。请通过 GetTemplate 查询模板状态,确认状态变为 ready 后,再使用该模板创建 Sandbox。
启用后,Template Build 会在模板镜像中预装存储客户端及运行所需的依赖。该参数不会创建存储资源、执行挂载或配置网络和访问凭证。创建 Sandbox 时仍需配置存储挂载参数、VPC、交换机、安全组、RAM Role 及有效凭证,并验证挂载、写入、读回和删除操作。
各存储类型安装的客户端:
存储类型 | 安装的客户端 |
OSS / AgenticBucket | ossfs2 |
JuiceFS | JuiceFS 企业版客户端、RADOS 运行库和 FUSE 2 |
AgenticFS |
|
各存储类型的挂载方法参见挂载 OSS Volume、挂载 AgenticBucket Volume、挂载 JuiceFS Volume和挂载 AgenticFS Volume。
管理模板
查询模板信息和构建状态
通过 ListTemplates 分页查询 Team 下的模板列表,通过 GetTemplate 查询单个模板的配置与构建状态。status.state 取值:pending(等待构建)、building(构建中)、updating(更新配置后重建中)、ready(可用于创建沙箱)、error(构建失败,status.reason.message 给出原因)。建议按 5~10 秒间隔轮询。
完整示例(循环翻页列出全部模板):
import os
from alibabacloud_sandbox20260820 import models
from alibabacloud_sandbox20260820.client import Client as SandboxClient
from alibabacloud_tea_openapi import models as open_api_models
REGION = "cn-hangzhou"
TEAM_ID = "<your-team-id>"
config = open_api_models.Config(
access_key_id=os.environ["ALIBABA_CLOUD_ACCESS_KEY_ID"],
access_key_secret=os.environ["ALIBABA_CLOUD_ACCESS_KEY_SECRET"],
region_id=REGION,
endpoint=f"sandbox.{REGION}.aliyuncs.com",
)
pop_client = SandboxClient(config)
next_token = None
while True:
request = models.ListTemplatesRequest(team_id=TEAM_ID)
if next_token:
request.next_token = next_token
response = pop_client.list_templates(request)
for template in response.body.templates:
print(template.template_id, template.name, template.status.state)
next_token = response.body.next_token
if not next_token:
break使用已构建的模板创建沙箱
模板进入 ready 状态后,使用 E2B SDK 创建沙箱并验证运行结果:
from e2b import Sandbox
sandbox = Sandbox.create(
template=template_id,
timeout=600,
api_url=f"https://api.{REGION}.e2b.fc.aliyuncs.com",
domain=f"{REGION}.e2b.fc.aliyuncs.com",
)
try:
result = sandbox.commands.run("printf hello")
print(result.stdout)
finally:
sandbox.kill()修改配置并重新构建
使用 UpdateTemplate 原地修改模板配置,可更新镜像、规格、网络等配置项。提交后平台自动重新构建,模板回到 updating 状态,构建完成后恢复 ready:
pop_client.update_template(
template_id,
models.UpdateTemplateRequest(
team_id=TEAM_ID,
body=models.PublicUpdateTemplateInput(
runtime_config=models.PublicUpdateTemplateRuntimeConfig(
cpu=4,
memory_size=4096,
),
),
),
)
state = wait_ready(template_id)
assert state == "ready"只需传入要修改的配置项,未传入的配置项保持原有取值。
清理不再使用的模板
pop_client.delete_template(
template_id, models.DeleteTemplateRequest(team_id=TEAM_ID))模板处于任意状态(含构建中)都可删除,删除会终止进行中的构建。
网络配置(高级)
本节以自定义模板为例,介绍配置 vpc_config 后的网络访问方式,重点说明 vpc_config 与 internet_access 的配合关系。未配置 VPC 时,沙箱默认可通过平台出口访问公网,出口 IP 不固定。
场景选择
场景 | vpc_config | internet_access | VPC 公网出口要求 | 公网访问结果 |
访问 VPC,同时通过平台出口访问公网 | 配置 | 开启(默认) | 无需为此配置固定公网出口 | 可访问公网,出口 IP 不固定 |
访问 VPC,不访问公网 | 配置 | 关闭 | VPC 不提供公网出口 | 无法访问公网 |
访问 VPC,同时通过固定 IP 访问公网 | 配置 | 关闭 | VPC 配置公网 NAT 网关、EIP 及相应路由与 SNAT 规则 | 可通过配置的固定出口 IP 访问公网 |
注意:VPC 网段需使用 RFC 1918 私有地址段(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16);vSwitch 需位于函数计算支持的可用区。
场景一:访问 VPC 和公网,出口 IP 不固定
配置 vpc_config,并保持 internet_access 开启(缺省即开启):
runtime_config=models.CreateTemplateRuntimeConfig(
cpu=2,
memory_size=2048,
disk_size=15360,
internet_access=True,
vpc_config=models.CreateTemplateVPCConfig(
vpc_id="<vpc-id>",
v_switch_ids=["<vsw-id>"],
security_group_id="<sg-id>",
),
log_config=models.CreateTemplateLogConfig(
project="<sls-project>",
logstore="<sls-logstore>",
),
sandbox_config=models.CreateTemplateSandboxConfig(
image=f"fc-e2b-registry.{REGION}.cr.aliyuncs.com/runtime-v2/base:v0.0.53",
generation=2,
),
)验证方式:创建沙箱后分别访问 VPC 内资源(如内网域名或私网 IP)和公网地址(如 curl https://www.aliyun.com),两者均可访问。该方式不提供固定公网出口 IP。
场景二:仅访问 VPC,不访问公网
配置 vpc_config,并关闭 internet_access;同时确认 VPC 本身未配置公网出口:
runtime_config=models.CreateTemplateRuntimeConfig(
cpu=2,
memory_size=2048,
disk_size=15360,
internet_access=False,
vpc_config=models.CreateTemplateVPCConfig(
vpc_id="<vpc-id>",
v_switch_ids=["<vsw-id>"],
security_group_id="<sg-id>",
),
log_config=models.CreateTemplateLogConfig(
project="<sls-project>",
logstore="<sls-logstore>",
),
sandbox_config=models.CreateTemplateSandboxConfig(
image=f"fc-e2b-registry.{REGION}.cr.aliyuncs.com/runtime-v2/base:v0.0.53",
generation=2,
),
)验证方式:沙箱内访问 VPC 内资源正常;访问公网地址超时或被拒绝。
场景三:访问 VPC 和公网,使用固定出口 IP
配置 vpc_config,并关闭 internet_access。在 VPC 侧配置公网 NAT 网关和 EIP,以及相应的路由与 SNAT 规则,使公网流量通过指定出口访问。详细操作,请参考沙箱实例出公网访问(固定 IP)。
VPC 侧准备:为 VPC 配置公网 NAT 网关并绑定 EIP,为相关 vSwitch 配置指向 NAT 网关的路由与 SNAT 规则,确认沙箱所在 vSwitch 的流量能够通过该出口访问公网。
模板侧配置:参数与场景二相同(
internet_access=False+vpc_config)。
验证方式:在沙箱内查询出口 IP(如 curl ifconfig.me),返回的应为配置的 EIP。
场景二和场景三的模板构建参数相同,区别在于 VPC 是否具备公网出口。因此,关闭 internet_access 后,仍需结合 VPC 的网络配置判断沙箱是否能够访问公网。常见问题
为什么所有构建示例都包含日志配置?
log_config 将模板构建期和沙箱运行期的日志投递到账号下的 SLS,便于在构建和运行验证过程中定位问题:构建期可查看启动命令、就绪命令的输出和构建失败原因;运行期可查看沙箱内进程日志。日志入口为 SLS 控制台中配置的 Project 和 Logstore,需与云沙箱位于同一地域。
为什么关闭 internet_access 后仍可能访问公网?
internet_access 只控制平台侧公网出口。如果模板接入的 VPC 已配置公网出口(NAT 网关 + EIP + SNAT),沙箱仍可通过该出口访问公网。需要彻底隔离公网时,同时检查模板参数和 VPC 网络配置。
如何获得固定公网出口 IP?
按场景三配置:模板侧关闭 internet_access 并配置 vpc_config;VPC 侧配置公网 NAT 网关和 EIP,并配置相应路由与 SNAT 规则。验证沙箱内出口 IP 是否为配置的 EIP。
镜像拉取失败、构建失败或启动失败时如何排查?
通过
GetTemplate查看status.reason.message获取失败阶段与原因。在
log_config配置的 SLS Logstore 中查看详细日志。按失败阶段分别排查:
镜像拉取失败:确认镜像地址与 tag 正确、凭证具备拉取权限、拉取网络可达(ACR EE 实例 VPC 绑定已生效、安全组出方向放行 443/TCP)。
构建失败:确认镜像满足镜像要求(
linux/amd64架构、存在/bin/bash、/etc/passwd可写等)。启动命令或就绪检查失败:确认
start_command不会提前退出,ready_command探测的是真实就绪条件且能在 5 分钟内通过。