---
title: "Deno 沙箱"
description: "Deno Deploy 上 Deno 沙箱微虚拟机平台的概览,包括其功能、安全模型和理想使用场景。"
---
Deno 沙箱为 Deno Deploy 带来了即时的 Linux 微虚拟机。每个沙箱启动时间不到一秒,且通过 `@deno/sandbox` SDK 完全由 API 驱动,并且一旦使用完毕立即销毁。结果是按需计算,感觉就像打开了一个终端,但拥有生产级的隔离和可观察性。
## 什么是 Deno 沙箱?
- 由 Deno Deploy 编排的独立 Linux 微虚拟机
- 设计用于运行不受信任的代码
- 即时可用;启动时间以毫秒计
- 默认是临时的,但可超出当前连接生命周期持续存在
- 可通过[卷](./volumes/)访问持久存储
- 完全由 API 驱动:可以通过代码创建、运行命令和销毁
## 理想使用场景
Deno 沙箱专注于需要生成、评估或代表不受信任用户安全执行代码的工作负载。它们适合用于:
- 需要在推理过程中运行代码的 AI 代理和协同助手
- 安全的插件或扩展系统
- 氛围编程和协作 IDE 体验
- 临时的 CI 运行器和冒烟测试
- 客户提供或用户生成的代码路径
- 即时开发服务器和预览环境
这不仅是为开发者构建的计算,更是为构建软件的软件而设。
## 运行真实工作负载
一旦 Deno 沙箱创建,就会获得完整的 Linux 环境,包括文件、进程、包管理器和后台服务:
```tsx
import { Sandbox } from "@deno/sandbox";
await using sandbox = await Sandbox.create();
await sandbox.sh`ls -lh /`;
```
```py
from deno_sandbox import DenoDeploy
def main():
sdk = DenoDeploy()
with sdk.sandbox.create() as sandbox:
process = sandbox.spawn("ls", args=["-lh"])
process.wait()
```
```py
from deno_sandbox import AsyncDenoDeploy
async def main():
sdk = AsyncDenoDeploy()
async with sdk.sandbox.create() as sandbox:
process = await sandbox.spawn("ls", args=["-lh"])
await process.wait()
```
## 安全策略
配置沙箱,使其只能与批准的主机通信:
```tsx
await Sandbox.create({
allowNet: ["google.com"],
});
```
```py
sdk = AsyncDenoDeploy()
async with sdk.sandboxes.create(allowNet=["google.com"]) as sandbox:
print(f"沙箱 {sandbox.id} 已准备好。")
```
```py
sdk = DenoDeploy()
with sdk.sandboxes.create(allowNet=["google.com"]) as sandbox:
print(f"沙箱 {sandbox.id} 已准备好。")
```
秘密信息绝不会进入沙箱环境。只有当沙箱向批准的主机发出外部请求时,才会替换为真实值。
```tsx
await Sandbox.create({
allowNet: ["api.openai.com"],
secrets: {
OPENAI_API_KEY: {
hosts: ["api.openai.com"],
value: process.env.OPENAI_API_KEY,
},
},
});
```
```py
sdk = AsyncDenoDeploy()
async with sdk.sandboxes.create(
allowNet=["api.openai.com"],
secrets={
"OPENAI_API_KEY": {
"hosts": ["api.openai.com"],
"value": os.environ.get("OPENAI_API_KEY"),
}
},
) as sandbox:
print(f"沙箱 {sandbox.id} 已准备好。")
```
```py
sdk = DenoDeploy()
with sdk.sandboxes.create(
allowNet=["api.openai.com"],
secrets={
"OPENAI_API_KEY": {
"hosts": ["api.openai.com"],
"value": os.environ.get("OPENAI_API_KEY"),
}
},
) as sandbox:
print(f"沙箱 {sandbox.id} 已准备好。")
```
## 为即时、安全计算而生
开发者和 AI 系统现在期望计算即刻响应、安全且全球可访问。Deno 沙箱提供了:
- 即时启动,无需管理预热池
- 专用隔离及严格的网络出口策略
- 与 Deno Deploy 日志和跟踪并行的完整可观察性
- 每个沙箱支持区域选择、内存大小和生命周期控制
- 代码准备好生产后可无缝交接至 Deno Deploy 应用
Deno Deploy 和 Deno 沙箱共同构成单一工作流:代码被创建,在沙箱中验证安全,然后无需新基础设施或编排层即能全球部署。
## 运行时支持
Deno 沙箱 SDK 已在以下环境测试并支持:
- **Deno:** 最新稳定版本
- **Node.js:** 版本 24 及以上
- **Python:** 3.10 及以上
你可以在任何能够向 Deno Deploy API 发起出站 HTTPS 请求的环境中使用 Deno 沙箱。JavaScript SDK 以 `@deno/sandbox` 的形式提供,支持 [jsr](https://jsr.io/@deno/sandbox) 和 [npm](https://www.npmjs.com/package/@deno/sandbox)(JSR 包针对 Deno 使用进行了优化)。Python SDK 以 `deno-sandbox` 的形式提供,见 [PyPI](https://pypi.org/project/deno-sandbox/)。如需直接使用 API,请参阅 [REST API 文档](https://api.deno.com/v2/docs)。
:::note await using 支持
[`await using`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/await_using) 语法要求 Node.js 24 及以上版本。如果项目使用较低版本的 Node.js,请改用 try/finally 块:
```ts
import { Sandbox } from "@deno/sandbox";
const sandbox = await Sandbox.create();
try {
// ... 使用 sandbox ...
} finally {
await sandbox.close();
}
```
:::
## 限制
Deno 沙箱有以下限制:
- **内存:**768 MB 到 4096 MB(默认 1.2GB),每个沙箱可配置
- **CPU:** 2 vCPU
- **生命周期:**每个沙箱可配置,绑定于会话,最长 30 分钟
- **磁盘:**10 GB 临时存储
- **并发数:**每个组织限制 5 个并发沙箱(这是 Deno 沙箱预发布阶段的默认并发限制。如需更高限制,请联系 [deploy@deno.com](mailto:deploy@deno.com)。)
超出这些限制可能导致沙箱被限流或终止。
## 区域
当前支持的区域有:
- `ams` - 荷兰阿姆斯特丹
- `ord` - 美国芝加哥
创建新沙箱时,可以指定沙箱所在区域:
```tsx
import { Sandbox } from "@deno/sandbox";
await using sandbox = await Sandbox.create({ region: "ams" });
```
```py
from deno_sandbox import DenoDeploy
def main():
sdk = DenoDeploy()
with sdk.sandboxes.create(region="ams") as sandbox:
print(f"沙箱 {sandbox.id} 已准备好。")
```
```py
from deno_sandbox import AsyncDenoDeploy
async def main():
sdk = AsyncDenoDeploy()
async with sdk.sandboxes.create(region="ams") as sandbox:
print(f"沙箱 {sandbox.id} 已准备好。")
```
若未指定,沙箱将创建在默认区域。
## 了解更多
准备试用吗?请跟随 [入门指南](./getting_started) 创建你的第一个沙箱,获取访问令牌,并在 Deploy 边缘运行代码。