使用代码构建和管理自定义模板

更新时间:
复制 MD 格式

介绍如何通过云沙箱 OpenAPI SDK 以代码方式构建、查询、更新和删除自定义模板,并按代际说明镜像来源、构建方式与接入 VPC 后的网络配置。

自定义模板用于定义沙箱运行所需的镜像和配置。本文按二代、一代分别介绍镜像来源和构建方式,再说明接入 VPC 后的网络配置。示例使用 Python,通过云沙箱 OpenAPI SDK 调用;TypeScript、Go、Java SDK 提供同名能力。

不同代际支持的镜像来源和配置项有所不同,编写代码前请先确认使用的模板代际。

对比项

二代模板

一代模板

镜像来源

官方公共镜像、ACR 企业版(ACR EE)镜像

官方公共镜像、ACR EE 镜像、OCI 镜像仓库

构建方式与启动配置

支持启动命令(start_command)和就绪命令(ready_command)

通过 build_config 控制构建动作(copy/envd_inject),缺省时按镜像来源自动推导;不支持 start_command 和 ready_command

磁盘口径

disk_size 包含镜像自身占用,实际可写空间 = 磁盘大小 - 镜像大小

disk_size 即为可写空间,不包含镜像自身占用

日志配置

示例统一包含 log_config

示例统一包含 log_config

两代运行时的完整能力差异参见沙箱运行时一代与二代的差异。

开始之前

本节集中说明后续示例的公共准备工作,后续各节在此基础上给出完整的构建示例。后续创建和访问沙箱的示例还使用 E2B SDK,需一并安装并配置其访问凭证环境变量。

  1. 开通函数计算和云沙箱,在云沙箱控制台创建 Team 并获取 Team ID。

  2. 准备阿里云账号或 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/*。

  3. 确认模板所在地域(示例使用 cn-hangzhou,请替换为目标地域)。

  4. 准备镜像地址;使用私有镜像时准备对应凭证与拉取网络,详见各代际的镜像来源章节。

  5. 准备日志资源:在与云沙箱相同的地域下创建 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"

镜像要求

自定义镜像需满足下表要求,按“硬性 / 条件 / 推荐”分级;二代模板在此基础上有更严格的发行版要求,请参见二代模板。

级别

要求

不满足时影响

硬性

架构为 linux/amd64;多架构镜像的 manifest 列表必须包含 linux/amd64 变体

模板构建直接失败

硬性

ACR 镜像不开启镜像加速选项

模板构建直接失败

硬性

/etc/passwd、/etc/group 为标准文件且可写

沙箱无法初始化默认用户,启动失败

条件

Bash 位于镜像内的固定路径 /bin/bash(不仅是 PATH 中可找到 Bash)

commands.run、PTY 失败

条件

PATH 中存在 python3 或 python

Python run_code 不可用

条件

PATH 中存在 node

JavaScript run_code 不可用

条件

按需提供 git、openssh-client、CA 证书、编译工具链

对应的 Git、SSH、HTTPS、编译安装操作不可用

推荐

系统 PATH 至少包含 /usr/local/bin、/usr/bin、/bin

登录 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 表示二代模板。
                ),
            ),
        )
    )
)
template_id = resp.body.template_id
state = wait_ready(template_id)
assert state == "ready"

ACR EE 镜像

使用 ACR 企业版实例中的自有镜像。

前置准备:

  1. 在与云沙箱相同的阿里云账号和地域下创建 ACR EE 实例(经济版暂不支持)。

  2. 为 ACR EE 实例添加专有网络,确保云沙箱可以通过 VPC 拉取镜像。

  3. 创建命名空间与镜像仓库并推送镜像,镜像地址使用实例的 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()

一代模板

选择镜像来源

  • 官方公共镜像:一代模板地址格式为 fc-e2b-registry.<地域>.cr.aliyuncs.com/runtime/<镜像名>:<tag>(与二代的 runtime-v2 前缀不同),无需凭证与网络配置,平台直接使用,不再执行构建注入。

  • ACR EE 镜像:实例准备、网络约束与拉取方式同二代ACR EE 镜像;镜像地址使用 -vpc 域名。同账号镜像可免凭证,由平台使用实例临时授权拉取。

  • OCI 镜像仓库:任意标准 OCI 仓库(公网可达或 VPC 内私有)。通过 registry_config.auth_config 提供仓库凭证(user_name/password,需同时具备拉取和推送权限);VPC 内私有仓库还需通过 registry_config.network_config 提供拉取网络三件套(vpc_id/v_switch_id/security_group_id)。

选择构建方式

构建非官方镜像时,一代模板通过 build_config 控制两个构建动作:copy(把构建产物推送为目标镜像)和 envd_inject(注入沙箱运行依赖)。

对比项

注入构建(copy + envd_inject 开启)

直接使用源镜像(均关闭)

构建流程

平台拉取源镜像,注入沙箱运行依赖,推送为目标镜像

平台直接使用源镜像,不注入、不修改

输入要求

源镜像无需改造;目标仓库凭证需有推送权限

镜像需已自行包含沙箱运行依赖

适用场景

常规自定义镜像(默认方式)

官方公共镜像,或已自行集成运行依赖的镜像、只读镜像仓库

build_config 缺省时按源镜像自动推导:官方公共镜像直接使用,不执行构建;其他镜像执行注入构建。注意 copy 和 envd_inject 需同时开启或同时关闭,只开启其中一个会返回 400。

直接使用源镜像

官方公共镜像自动按直接使用源镜像的方式处理,无需额外配置;自定义镜像只有已自行包含沙箱运行依赖时才适用。

resp = pop_client.create_template(
    models.CreateTemplateRequest(
        body=models.CreateTemplateInput(
            name=f"template-gen1-direct-{int(time.time())}",
            team_id=TEAM_ID,
            runtime_config=models.CreateTemplateRuntimeConfig(
                cpu=2,
                memory_size=2048,
                log_config=models.CreateTemplateLogConfig(
                    project="<sls-project>",
                    logstore="<sls-logstore>",
                ),
                sandbox_config=models.CreateTemplateSandboxConfig(
                    image=f"fc-e2b-registry.{REGION}.cr.aliyuncs.com/runtime/code-interpreter-v1:v0.0.53",
                    generation=1,
                ),
            ),
        )
    )
)

镜像来源的差异集中在上一节说明;本节重点解释构建方式选择,相同配置不再重复展开。

注入构建(默认)

build_config 缺省时即按注入构建执行。按镜像所在仓库分两种常见场景:

场景一:ACR EE 私网镜像

resp = pop_client.create_template(
    models.CreateTemplateRequest(
        body=models.CreateTemplateInput(
            name=f"template-gen1-builder-{int(time.time())}",
            team_id=TEAM_ID,
            runtime_config=models.CreateTemplateRuntimeConfig(
                cpu=2,
                memory_size=2048,
                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=1,  # 必填:1 表示一代模板。
                ),
            ),
        )
    )
)
template_id = resp.body.template_id
state = wait_ready(template_id)
assert state == "ready"

场景二:VPC 内私有 OCI 仓库

适用于 Registry 域名仅在 VPC 内可达的自建私有仓库(例如 VPC 内 ECS 上自建的 Harbor)。约束:

  • 仓库必须以 HTTPS 提供服务且监听 443 端口,不支持自定义端口或 HTTP。

  • 必须提供 registry_config.network_config(VPC 三件套 vpc_id/v_switch_id/security_group_id,需同时提供)。

  • 使用自签证书的仓库还必须在 cert_config 中声明跳过证书校验(insecure=True),否则构建在拉取源镜像阶段以 x509 证书错误失败。

  • 凭证通过 auth_config 照常传入,需具备拉取和推送权限。

resp = pop_client.create_template(
    models.CreateTemplateRequest(
        body=models.CreateTemplateInput(
            name=f"template-gen1-oci-{int(time.time())}",
            team_id=TEAM_ID,
            runtime_config=models.CreateTemplateRuntimeConfig(
                cpu=2,
                memory_size=2048,
                log_config=models.CreateTemplateLogConfig(
                    project="<sls-project>",
                    logstore="<sls-logstore>",
                ),
                sandbox_config=models.CreateTemplateSandboxConfig(
                    image="registry.internal.example.com/<namespace>/<image>:<tag>",
                    generation=1,
                    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>",
                        ),
                        cert_config=models.CreateTemplateRegistryCertConfig(
                            insecure=True,  # 自签证书时传入
                        ),
                    ),
                ),
            ),
        )
    )
)
template_id = resp.body.template_id
state = wait_ready(template_id)
assert state == "ready"

管理模板

查询模板信息和构建状态

通过 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)。

  1. VPC 侧准备:为 VPC 配置公网 NAT 网关并绑定 EIP,为相关 vSwitch 配置指向 NAT 网关的路由与 SNAT 规则,确认沙箱所在 vSwitch 的流量能够通过该出口访问公网。

  2. 模板侧配置:参数与场景二相同(internet_access=False + vpc_config)。

验证方式:在沙箱内查询出口 IP(如 curl ifconfig.me),返回的应为配置的 EIP。

场景二和场景三的模板构建参数相同,区别在于 VPC 是否具备公网出口。因此,关闭 internet_access 后,仍需结合 VPC 的网络配置判断沙箱是否能够访问公网。

常见问题

一代模板能否配置启动命令和就绪命令?

不能。一代模板设置 start_command 或 ready_command 会返回 400 InvalidParameter。需要把常驻进程固化到模板时,请使用二代模板。

为什么所有构建示例都包含日志配置?

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。

镜像拉取失败、构建失败或启动失败时如何排查?

  1. 通过 GetTemplate 查看 status.reason.message 获取失败阶段与原因。

  2. 在 log_config 配置的 SLS Logstore 中查看详细日志。

  3. 按失败阶段分别排查:

    • 镜像拉取失败:确认镜像地址与 tag 正确、凭证具备拉取权限、拉取网络可达(ACR EE 实例 VPC 绑定已生效、安全组出方向放行 443/TCP)。

    • 构建失败:确认镜像满足镜像要求(linux/amd64 架构、存在 /bin/bash、/etc/passwd 可写等);一代模板确认目标仓库凭证具备推送权限。

    • 启动命令或就绪检查失败(二代):确认 start_command 不会提前退出,ready_command 探测的是真实就绪条件且能在 5 分钟内通过。