sandbox-sdk について
sandbox-sdk は、Cloudflare Workers 上で Cloudflare Sandbox SDK を使った隔離コード実行環境の構築を支援するスキルです。環境設定、コード実行、ファイル操作、ライフサイクル管理を扱います。
主な機能
- 01シェルコマンドとスクリプトの実行
- 02Python、JavaScript、TypeScript の実行
- 03ファイルとディレクトリの管理
- 04プレビュー URL によるサンドボックスサービスの公開
- 05ライフサイクルとクリーンアップの設定
活用シーン
- 01隔離環境で LLM 生成コードを実行
- 02サンドボックスでスクリプトを構築・テスト
- 03プロジェクトファイルの読み書き
- 04サンドボックス内の HTTP サービスを公開
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cloudflare/ cloudflare-docs --skill sandbox-sdkインストール後、Claude Code で/sandbox-sdkを入力して読み込まれたか確認します。
同梱ファイルreferences/api-quick-ref.mdreferences/examples.md
詳細
Cloudflare Sandbox SDK
Cloudflare Workers 上で、安全に分離されたコード実行環境を構築します。
最初に:インストールを確認
npm install @cloudflare/sandbox
docker info # Must succeed - Docker required for local dev
検索を優先した開発
重要:Sandbox SDK のタスクでは、事前学習済みの知識よりも、ドキュメントやサンプルから情報を取得することを優先してください。
機能を実装する際は、まず該当するドキュメントのページまたはサンプルを取得してください。
必須の設定
wrangler.jsonc(正確に指定してください。構造を変更しないでください):
{
"containers": [{
"class_name": "Sandbox",
"image": "./Dockerfile",
"instance_type": "lite",
"max_instances": 1
}],
"durable_objects": {
"bindings": [{ "class_name": "Sandbox", "name": "Sandbox" }]
},
"migrations": [{ "new_sqlite_classes": ["Sandbox"], "tag": "v1" }]
}
Worker エントリ - Sandbox クラスを再エクスポートする必要があります:
import { getSandbox } from '@cloudflare/sandbox';
export { Sandbox } from '@cloudflare/sandbox'; // Required export
クイックリファレンス
| タスク | メソッド |
|---|---|
| サンドボックスを取得 | getSandbox(env.Sandbox, 'user-123') |
| コマンドを実行 | await sandbox.exec('python script.py') |
| コードを実行(インタープリター) | await sandbox.runCode(code, { language: 'python' }) |
| ファイルを書き込む | await sandbox.writeFile('/workspace/app.py', content) |
| ファイルを読み込む | await sandbox.readFile('/workspace/app.py') |
| ディレクトリを作成 | await sandbox.mkdir('/workspace/src', { recursive: true }) |
| ファイルを一覧表示 | await sandbox.listFiles('/workspace') |
| ポートを公開 | await sandbox.exposePort(8080) |
| 破棄 | await sandbox.destroy() |
主なパターン
コマンドを実行
const sandbox = getSandbox(env.Sandbox, 'user-123');
const result = await sandbox.exec('python --version');
// result: { stdout, stderr, exitCode, success }
コードインタープリター(AI に推奨)
豊富な出力を伴う LLM 生成コードの実行には、runCode() を使用します:
const ctx = await sandbox.createCodeContext({ language: 'python' });
await sandbox.runCode('import pandas as pd; data = [1,2,3]', { context: ctx });
const result = await sandbox.runCode('sum(data)', { context: ctx });
// result.results[0].text = "6"
言語:python、javascript、typescript
状態はコンテキスト内で保持されます。本番環境では明示的にコンテキストを作成してください。
ファイル操作
await sandbox.mkdir('/workspace/project', { recursive: true });
await sandbox.writeFile('/workspace/project/main.py', code);
const file = await sandbox.readFile('/workspace/project/main.py');
const files = await sandbox.listFiles('/workspace/project');
用途に応じた選択
| 必要なもの | 使用するもの | 理由 |
|---|---|---|
| シェルコマンド、スクリプト | exec() | 直接制御、ストリーミング |
| LLM 生成コード | runCode() | 豊富な出力、状態の保持 |
| ビルド/テストのパイプライン | exec() | 終了コード、stderr の取得 |
| データ分析 | runCode() | グラフ、テーブル、pandas |
Dockerfile の拡張
ベースイメージ(docker.io/cloudflare/sandbox:0.7.0)には、Python 3.11、Node.js 20、一般的なツールが含まれています。
Dockerfile を拡張して依存関係を追加します:
FROM docker.io/cloudflare/sandbox:0.7.0
# Python packages
RUN pip install requests beautifulsoup4
# Node packages (global)
RUN npm install -g typescript
# System packages
RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*
EXPOSE 8080 # Required for local dev port exposure
イメージは小さく保ってください。コールドスタート時間に影響します。
プレビュー URL(ポート公開)
サンドボックス内で実行されている HTTP サービスを公開します:
const { url } = await sandbox.exposePort(8080);
// Returns preview URL for the service
本番環境での要件:プレビュー URL には、ワイルドカード DNS(*.yourdomain.com)を設定したカスタムドメインが必要です。.workers.dev ドメインでは、プレビュー URL のサブドメインはサポートされていません。
参照:https://developers.cloudflare.com/sandbox/guides/expose-services/
OpenAI Agents SDK との統合
SDK は、@cloudflare/sandbox/openai で OpenAI Agents 用のヘルパーを提供します:
import { Shell, Editor } from '@cloudflare/sandbox/openai';
統合パターンの全体については、examples/openai-agents を参照してください。
サンドボックスのライフサイクル
getSandbox()はすぐに戻ります。コンテナは最初の操作時に遅延起動します- コンテナは非アクティブ状態が 10 分続くとスリープします(
sleepAfterで設定可能) - リソースを直ちに解放するには、
destroy()を使用します - 同じ
sandboxIdは常に同じサンドボックスインスタンスを返します
避けるべきパターン
- 内部クライアント(
CommandClient、FileClient)を使用しないでください -sandbox.*メソッドを使用します - Sandbox のエクスポートを省略しないでください -
export { Sandbox }がないと Worker をデプロイできません - 複数ユーザー向けにサンドボックス ID をハードコードしないでください - ユーザー/セッション識別子を使用します
- クリーンアップを忘れないでください - 一時的なサンドボックスでは
destroy()を呼び出します
詳細リファレンス
- references/api-quick-ref.md - オプションと戻り値の型を含む API 全体
- references/examples.md - ユースケース別のサンプル一覧