修改沙箱设置
合并式修改,要么全部生效,要么全不生效:在做任何修改之前,会先检查所有可能被拒绝的项;如果对 volumes 的修改在开始后被拒绝(某个存储卷正被进程使用,卸不下来),存储卷会恢复原样,所有设置也都不变。修改设置不会唤醒沙箱;修改 volumes 会唤醒沙箱。对运行中的沙箱,egress 的修改立即生效。不检查 Idempotency-Key。
所需权限范围:write。
https://api.glac.ai/v1/sandboxes/{id}授权
路径参数
查询参数
请求头参数
请求体JSON可选
- held_asleepoptionalboolean | null
true:休眠期间,发往其端口的请求不会唤醒它:预览监听器会代为返回 502
sandbox_paused,与 E2B 的代理对已暂停沙箱的响应一样 (x-preview-ingress),只有 API 调用(或它自己的定时器)才会唤醒它。它本身不会让沙箱休眠:那是POST /v1/sandboxes/{id}/sleep的事。false 或 null:与任何沙箱一样。(相当于 E2B 不带autoResume的pause,由控制平面的 E2B 兼容层设置,在其connect时移除。)default: false
Returns
200
沙箱的当前状态。
- image_digeststring | nullrequired
其磁盘所来自的镜像,按其清单(或清单列表)的摘要,与构建其模板时镜像仓库给出的一致 (
Template.image_digest):即当时标签所指的镜像。之后移动标签,会让之后创建的沙箱使用另一个镜像(一个更新的模板),而这个沙箱的保持不变。在其模板构建期间 (starting):构建所用的镜像,如果创建时已知(发现标签指向比那里的模板更新的镜像,就按那个摘要构建),否则为 null;模板没有说明时(从磁盘文件构建的,或在模板记录这一信息之前构建的)也为 null。pattern: ^[A-Za-z0-9]+:[0-9A-Fa-f]{32,}$ - sleep_tierrequired
sleeping状态的沙箱以何种方式休眠;其他状态为 null。paused:其虚拟机连同进程和连接静止在节点的内存中(开启了暂停层级的节点会暂停空闲的沙箱,而不是保存它),调用会在约一毫秒内恢复它;其虚拟机占用的内存像运行中的沙箱一样计量(usage.memory_bytes、memory_gib_seconds),CPU 不计量。saved:其内存和设备状态保存在节点上,什么都没有在运行;调用会在几毫秒内从中唤醒它。disk:只剩下磁盘(其虚拟机自行结束了,节点守护进程没有让它休眠就结束了,或者其内存无法保留);下一个需要它的调用会从磁盘启动它,原来运行的东西都已不在。POST /v1/sandboxes/{id}/sleep会保存沙箱,无论它是暂停的还是在运行的。 - failure_coderequired
沙箱为何处于
failed,供程序使用;其他情况为 null。image_not_found:镜像不在其仓库中,或者不是公开的(对于没有指定凭据的创建请求,需要登录的仓库只会这样说)。image_pull_failed:连不上镜像仓库,或者仓库没有交出镜像,或者拉取工具因节点的某项限制被停止(failure会说明是哪一项)。registry_auth_failed:镜像仓库拒绝了创建请求指定的凭据 (image_pull_secret);failure中有仓库的说明。image_unpack_failed:镜像放不进磁盘、超过节点接受的大小(failure中有具体数字),或者无法解压。invalid_image:镜像仓库位于节点上或私有网络中的地址,或者无法按要求启动镜像(start: true却没有 ENTRYPOINT 或 CMD,或者标签要求了无法做到的事)。boot_failed:用镜像创建的虚拟机没有启动,或者其启动命令没能启动(此时failure会给出就绪检查得到的结果以及它最后打印的内容)。no_capacity:节点没有空间。memory_full:宿主机的内存没有空间容纳构建其模板所用的虚拟机,或容纳它自己的虚拟机。drive_full:构建镜像模板期间,节点的数据盘满了。record_lost:无法读取沙箱的记录;其文件保留在节点上,但它无法启动,只能删除。recovery_failed:沙箱的启动恢复无法完成;其文件和恢复意图保留在节点上,它无法启动,只能删除。start_failed:其他任何情况;节点日志中有记录。 - egressobjectrequired
沙箱存储下来的出站规则:它可以访问什么、可以向某个主机请求什么,以及它的哪些请求会被加上机密。总是存在;没有规则的沙箱,
default为allow,四个列表为空,其流量走的是没有规则时的路径。deny涉及的连接或数据包会被拒绝;allow涉及的会放行;其他的按default处理。inject中的主机视为允许,http中的主机对其条目允许的请求也视为允许。无论规则怎么说,沙箱都访问不到节点、其他沙箱、私有地址段以及各云平台的元数据地址。主机名会与 TLS 握手的服务器名称、HTTP 请求的 Host 头匹配(任何端口),也会与沙箱的 DNS 查询匹配;对于规则可以拒绝某个名称的沙箱,节点会自己回答其 DNS 查询(被拒绝的名称得到
REFUSED)。指明某个允许主机的连接,会发往节点为该名称解析出的地址,无论沙箱原本要连哪个地址。既不是 TLS 也不是 HTTP 的 TCP 连接,只有发往规则列出的地址,或节点作为某个允许名称的地址告诉沙箱的地址时,才会放行。UDP 和其他所有协议只按地址判断。在default: allow下,deny列表算不上一堵墙:任何允许的中转流量都能绕过它。 - delete_after_idle_msinteger | nullrequired
休眠多久后节点删除该沙箱,单位为毫秒,从
idle_since起算:被唤醒的沙箱从下一次休眠起重新计算。null:不会因此删除(默认);沙箱会一直保留,直到被删除或其expires_at到期。不会自行休眠的沙箱(sleep_after_seconds为 null)计算的是被让它进入的休眠(POST /v1/sandboxes/{id}/sleep、其节点重启)。冻结期间(其所有者的支出上限)不计算:冻结会连同数据保留它,解冻后,其当前的休眠从那时开始计算。format: int64 · minimum: 1000 - awake_becausestring | nullrequired
运行中的沙箱为什么还没有被休眠,用几个词说明。
status不是running时为 null。应用的实例给出节点提供的原因:手头有请求、有调用在进行中、有请求在不到其sleep_after_seconds之前刚结束,或者其应用的下限让它保持运行。被项目网络上的数据包唤醒、之后再没有别的东西让它保持运行的沙箱,会说明这一点以及是哪个数据包:woken by a packet: TCP from 10.64.0.7:41594 to port 5432 [S] …。项目内部的连接不会让任何沙箱保持运行:在它休眠期间经由这些连接到来的数据,由节点暂存 (Node.hold)。 - url_patternoptionalstring | null
端口的预览 URL,其中的
{port}和{signature}需要填入:签名为 base32(HMAC-SHA256(key =url_secret, message = port)) 的前 12 个字符(port 为十进制的端口号),使用字母表0123456789abcdefghjkmnpqrstvwxyz。对于公开端口(public_ports中的端口,或者给出public_ports_except时其中没有指定的端口),去掉-{signature}。节点没有预览域名时为 null;调用方是沙箱令牌时没有这个字段。
400
请求不符合本调用的要求。invalid_json:请求体不是 JSON 对象;unknown_field:请求体中有本调用不接受的字段;unknown_parameter:查询中有本调用不接受的参数;invalid_field:某个字段或查询参数类型错误或超出范围;invalid_name:name 不是有效的名称;invalid_env:env 中有环境变量无法容纳的名称或值;invalid_metadata:metadata 超出限制;expires_in_the_past:expires_at 不是将来的时间;invalid_egress:egress 不是有效的规则集,或者修改后剩下的规则无效:param 指明出错的部分;invalid_path:某个存储卷的 path 不是绝对路径,或者是 /。
401
missing_api_key, invalid_api_key, expired_api_key, invalid_token.
403
凭据无权执行此操作。needs_api_key:沙箱令牌不能执行此操作。spend_limit_reached:沙箱因达到支出上限而被冻结;它会连同数据一起休眠,直到上限提高。secret_host_not_allowed:按修改后的规则,egress.inject 会把机密发往它不允许去的主机(param 指明是哪一条;与 error 并列的 allowed_hosts 列出它可以去的地方)。account_share_reached:volumes 中有云盘某个版本的只读视图 (slice D7),而该云盘所属的账户在本节点数据盘上已占满自己的份额。
404
请求中指定的对象不存在。sandbox_not_found:沙箱不存在;volume_not_found:volumes 中指定的某个存储卷不存在;secret_not_found:egress.inject 中指定的某个机密不存在。
409
某个对象的状态不允许此操作。name_taken:另一个沙箱已使用该名称;volume_in_use:volumes 中某个非共享存储卷属于另一个沙箱;duplicate_volume:某个存储卷在 volumes 中出现了两次;mount_path_taken:volumes 中有两个存储卷的 path 相同;too_many_volumes:volumes 中非共享存储卷的数量超过了沙箱所在机器的空余磁盘数(八个;从早于八个磁盘时期的模板或快照创建的沙箱为两个);mount_in_use:沙箱中的进程正在使用要卸载的存储卷;force=true 可以强制卸载;detached_mount_in_use:要挂载的存储卷可用的每个空余磁盘,仍被一个文件系统占着:那是之前用 force=true 从沙箱强制卸下的存储卷,沙箱中仍有进程打开着它;sandbox_failed:沙箱处于 failed 状态。volume_restoring:它指定的某个存储卷正在从备份创建,或者没能创建成功。busy:要卸载的存储卷(无论是否带 force=true)是一个云盘,沙箱的客户机在它上面有一次读取被卡住(数据块迟迟不来:错误信息会指明是哪个云盘以及卡了多久):它会保持挂载,等那次读取结束后才能卸载。checkpoints_unavailable(param 为 checkpoint):checkpoint 要开启检查点或修改其间隔,但本节点不支持检查点(它不把磁盘复制到对象存储,或者它的内存不分层)。static_instance:该沙箱是节点按静态配置维护的实例 (GET /internal/static):它的设置来自配置。
503
不可用。not_served_here:给出了 egress 规则,但本节点无法执行规则(它没有 nft);或者 unavailable:volumes 中的某个存储卷没能及时挂载,稍后再次发起同一调用即可 (Retry-After):客户机没能在 60 秒内完成挂载(云盘的数据块迟迟不来:对象存储不在线,或取块程序连不上),或者这样的挂载之后它仍在从机器上卸下,或者它是逐块传来的云盘,而它的数据块暂时没有任何来源响应。
default
其他任何失败,格式相同。internal (500):节点出错;错误信息不会多说,节点日志中以请求的 id 记录了原因。unavailable(503,可重试):no_capacity,节点的网络槽位都已占用;memory_full,调用需要启动的虚拟机(创建、唤醒、从磁盘启动、恢复、回滚、构建)在宿主机内存中放不下(还要算上已承诺给其上运行的虚拟机的内存),也没有暂停或空闲的虚拟机可以让其休眠来腾出空间(节点的 memory);drive_full,调用需要构建模板,而节点的数据盘没有空间(节点的 drive);unavailable,节点正在关闭、沙箱 10 分钟后仍处于 starting、沙箱没有响应,或者沙箱正在迁到本节点(带 Retry-After: 1);fenced,节点的租约隔离了该沙箱 (Node.lease)。moved (409):沙箱已迁到另一个节点,由 to 指明。