Vercel Sandboxは、AIが生成したコードや利用者がアップロードしたスクリプトを、Firecracker microVMの中で本番環境から切り離して実行するVercelのサービスです。この記事では、@vercel/sandbox 4.0系とPython SDKでサンドボックスを起動して生成コードを動かす手順、外向きの通信を遮断するネットワークポリシー、APIキーをサンドボックスに渡さずに外部APIを呼ばせる認証情報の注入を、コード付きで示します。待ち時間を数えないActive CPU課金の料金と、Hobbyの45分・Proの24時間というセッション上限も、2026年11月時点の公式ドキュメントで確認しました。最後に、E2Bや自前の隔離基盤とどちらを選ぶかの条件を言い切ります。
まとめ:Vercel SandboxはAI生成コードを使い捨てのmicroVMで動かす実行基盤
Vercel Sandboxが引き受けるのは、信頼できないコードを動かすための隔離・起動・後片付けです。サンドボックスごとに専用のファイルシステムとネットワークを持つmicroVMが割り当てられ、SDKから数行で作成・実行・停止できます。Vercelにデプロイしていないアプリからも、アクセストークンを使えば呼び出せます。
既定値には注意が要ります。外向き通信は既定で全許可、停止時の自動スナップショットも既定でオン、リージョンの既定は米国東部のiad1です。生成コードを動かす用途なら、networkPolicy: 'deny-all'・persistent: false・region: 'hnd1'の3つを明示して作るのが出発点になります。
選び分けも明快です。Next.jsのアプリやAIエージェントがVercel上にあり、1回の処理がLLMの応答待ちを含む数分程度なら採用してよい。自社のKubernetes上でデータを外に出さずに隔離したいなら、gVisorなどの自前の隔離を選びます。
Vercel SandboxのFirecracker microVM隔離と既定構成
Vercelそのものの仕組みとホスティングの料金はVercel(ヴァーセル)とは?サーバー不要の仕組みとできること・料金で扱っています。サンドボックスという隔離の考え方と限界の整理はサンドボックスとは?セキュリティで隔離環境が果たす役割・仕組みと限界、導入判断を解説にまとめました。ここではVercelの製品としての挙動に絞ります。
Firecracker microVMでファイルシステムとネットワークを分ける隔離構造
Vercel Sandboxは2026年1月30日に一般提供(GA)が発表され、同時にCLIとSDKがオープンソースになりました。ソースはGitHubのvercel/sandboxリポジトリで公開されています。基盤はVercel社内の計算基盤Hiveで、Hiveが複数リージョンにまたがるFirecrackerのmicroVM群を管理しています。
コンテナとは異なり、各サンドボックスのカーネルはそれぞれ独立した構成です。公式ドキュメントは、各サンドボックスが独自のファイルシステムとネットワークを持つと説明しています。中ではsudoが使え、Dockerのようなコンテナランタイム、VPNクライアント、FUSEのファイルシステムドライバーといったシステム権限の要る処理も動かせます。生成コードがパッケージを入れたりファイルを壊したりしても、影響はそのVMの中で止まる構造です。
既定universalのNode.js・Python 3.14と64GBディスク
イメージを指定しない場合の既定はvercel/sandbox/universalで、Node.jsの現行LTS、Python 3.14、コーディングエージェント、よく使うユーティリティが入ったUbuntuです。より小さいvercel/sandbox/ubuntuや、Vercel Container Registryに置いた自前のOCIイメージも選べます。以前のruntime指定は非推奨になり、imageに置き換わりました。
資源の上限はプランで決まります。vCPUは1か、2〜32の偶数で指定し、既定は2です。メモリはvCPUあたり2GBで自動的に決まり、SDK 3.0.0以降で作ったサンドボックスには64GBのNVMeディスクが付きます。外部に公開できるポートは最大15個です。
永続化が既定でオンになるサンドボックスとセッションの二層構造
SDK 2系以降、Vercel Sandboxは「サンドボックス」と「セッション」の二層で管理されます。永続化のドキュメントによると、サンドボックスはプロジェクト内で一意な名前を持つ長期の単位で、セッションはその中で1回起動したVMです。停止するとファイルシステムが自動でスナップショットされ、次に同じ名前で呼ぶと新しいセッションがそこから再開します。
この永続化は既定でオンです。開発環境やエージェントの作業場所を持ち越すには便利ですが、1回きりのコード実行ではスナップショットの保管料だけが積み上がります。スナップショットは最終利用から30日で失効するのが既定で、復元できなくなったサンドボックスは14日間操作がなければ削除されます。
@vercel/sandbox 4.0系のAI生成コード実行手順とコード例
2026年11月15日時点のnpm registryでは、SDKの@vercel/sandboxが4.0.0、CLIのsandboxが4.12.0、PyPIのvercel-sandboxが1.0.0です。クイックスタートの前提はNode.js 22以上またはPython 3.11以上です。
vercel linkとvercel env pullによるOIDCトークン取得設定
認証の推奨はVercelのOIDCトークンです。手元の作業ディレクトリをVercelのプロジェクトに紐づけ、開発用のトークンを取り込みます。デプロイは不要です。
# Vercel CLIを入れ、作業用ディレクトリを用意する
npm i -g vercel
mkdir my-sandbox-app && cd my-sandbox-app
npm init -y
# 「Create a new project」を選ぶ(デプロイは不要)
vercel link
# .env.local に VERCEL_OIDC_TOKEN が書き込まれる(12時間で失効)
vercel env pull
# SDKと実行用のツールを入れる
npm install @vercel/sandbox dotenv @types/node tsx typescript
認証のドキュメントのとおり、ローカルのトークンは12時間で切れます。認証エラーが出たらvercel env pullをやり直してください。Vercelにデプロイした関数ではトークンの更新が自動です。環境変数の取り込みと型の選び方はVercelの環境変数の設定手順:Production・Previewの分け方とvercel env pull・Secret型で詳しく書きました。
TypeScriptでAI生成のPythonを外部通信なしで実行するコード例
LLMが返したPythonのコードを、外部と通信できない使い捨てのサンドボックスで動かす例です。JS SDKのリファレンスにあるSandbox.create()・writeFiles()・runCommand()・stop()だけで書けます。
// run-generated.ts(npx tsx run-generated.ts で実行)
import { config } from 'dotenv';
config({ path: '.env.local' });
import { Sandbox } from '@vercel/sandbox';
// LLMの応答から受け取ったコードを想定
const generatedCode = [
'import statistics',
'data = [12, 15, 9, 22, 18]',
'print("平均:", statistics.mean(data))',
].join('\n');
async function main() {
const sandbox = await Sandbox.create({
persistent: false, // 使い捨て:停止時にスナップショットを作らない
networkPolicy: 'deny-all', // DNSを含む外向き通信をすべて遮断
region: 'hnd1', // 東京リージョン(指定しないとiad1)
resources: { vcpus: 1 }, // メモリはvCPUあたり2GB
timeout: 2 * 60 * 1000, // セッション全体の上限(ミリ秒)
});
try {
await sandbox.writeFiles([{ path: 'main.py', content: generatedCode }]);
const result = await sandbox.runCommand({
cmd: 'python3',
args: ['main.py'],
timeoutMs: 30_000, // 1コマンドの上限。超えるとSIGKILL
});
console.log('exit:', result.exitCode);
console.log(await result.stdout());
} finally {
const summary = await sandbox.stop();
console.log('Active CPU(ms):', summary.activeCpuDurationMs);
}
}
main().catch(console.error);
finallyで必ずstop()を呼ぶのが要です。呼ばずに放置すると、timeoutに達するまでメモリの課金が続きます。stop()の戻り値には使ったActive CPUの時間と通信量が入るので、1件ごとの費用をログに残す用途にも使えます。生成コードをAIエージェントのツールとして呼ぶ全体の組み方はVercel AI SDKの使い方|AI SDK 7でNext.jsチャットとLangChain連携を実装を参照してください。
Python SDKのcreate_sandboxで同じ処理を書くときの書き方
FastAPIなどPythonのバックエンドから使う場合は、vercel-sandboxパッケージを入れ、from vercel import sandboxで読み込みます。async withのブロックを抜けると後片付けまで行われます。
# uv add vercel-sandbox python-dotenv
import asyncio
from dotenv import load_dotenv
from vercel import sandbox
from vercel.sandbox import NetworkPolicy
load_dotenv(".env.local")
GENERATED = "print(sum(range(1, 101)))"
async def main():
async with sandbox.create_sandbox(
persistent=False,
network_policy=NetworkPolicy.deny_all(),
region="hnd1",
) as box:
await box.fs.write_text("main.py", GENERATED)
result = await box.run_command("python3", ["main.py"], capture_output=True)
print(result.stdout.decode())
asyncio.run(main())
引数名がスネークケースになり、ネットワークポリシーをNetworkPolicyのクラスで渡す点がTypeScript版との違いです。
Vercel外のCIやサーバーからアクセストークンで認証する設定
GitHub Actionsや他社クラウドのサーバーなど、VERCEL_OIDC_TOKENを取れない場所ではアクセストークンを使います。必要なのはチームID・プロジェクトID・チームにアクセスできるトークンの3つです。
# CIのシークレットに登録する3つの値
VERCEL_TEAM_ID=team_xxx
VERCEL_PROJECT_ID=prj_xxx
VERCEL_TOKEN=発行したアクセストークン
// TypeScript側では作成時に渡す
const sandbox = await Sandbox.create({
teamId: process.env.VERCEL_TEAM_ID!,
projectId: process.env.VERCEL_PROJECT_ID!,
token: process.env.VERCEL_TOKEN!,
});
OIDCトークンは1つのプロジェクトに属し、CLIはトークンからチームとプロジェクトを推定します。vercel linkした先と違うプロジェクトにサンドボックスが作られる事故を避けるため、CLIで別のプロジェクトを操作するときは--scopeと--projectを両方付けます。
ネットワークポリシーで通信先を絞りAPIキーを渡さずに外部APIを呼ぶ方法
隔離の効果を決めるのはVMの境界よりも、むしろ外向き通信の制御です。生成コードが社内データを読める状態で外部へ自由に送信できるなら、VMを分けても情報は持ち出されます。
allow-all・deny-all・許可リストの3モードと既定値の落とし穴
ファイアウォールのドキュメントによると、ネットワークポリシーには3つのモードがあり、実行中のプロセスを止めずに切り替えられます。
| モード | 外向き通信 | 向いている段階 |
|---|---|---|
| allow-all(既定) | すべて許可 | 依存の取得 |
| deny-all | DNSも含め遮断 | 生成コードの実行 |
| 許可リスト | 列挙した宛先だけ | 特定APIの呼び出し |
落とし穴は既定がallow-allであることです。実務では、作成時にallow-allで依存パッケージを入れ、生成コードを流す前にsandbox.update({ networkPolicy: 'deny-all' })で閉じる順番が扱いやすいでしょう。最初から閉じておく必要がある処理は、作成時にポリシーを指定します。なお、許可リストを空にした場合もdeny-allと同じ扱いになります。
認証情報の注入でサンドボックス内にAPIキーを置かない外部通信構成
エージェントにLLMやGitHubを呼ばせたいが、キーを生成コードに見せたくない。この矛盾を解くのが認証情報の注入です。許可リストのドメインごとにtransformを書くと、サンドボックスの外側でリクエストにヘッダーが付与されます。キーそのものはVMに入りません。
// AI Gatewayへの通信にだけ、外側でAuthorizationヘッダーを付ける
const sandbox = await Sandbox.create({
persistent: false,
region: 'hnd1',
networkPolicy: {
allow: {
'ai-gateway.vercel.sh': [{
transform: [{ headers: { Authorization: `Bearer ${process.env.AI_GATEWAY_API_KEY}` } }],
}],
// npmの取得先は許可するだけ(ヘッダーは付けない)
'registry.npmjs.org': [],
},
},
});
// 中のコードはキーを持たないまま ai-gateway.vercel.sh を呼べる
この2つのドメイン以外には到達できません。注入先にしたAI Gatewayの設定と料金はVercel AI Gatewayとは:複数LLMを1つのAPIで切り替える設定手順と料金・LiteLLMとの選び方で解説しています。AI Gateway側でキーごとに予算の上限を掛けておくと、注入したキーが乱用された場合の被害額にも上限ができます。
SNIで判定する許可リストの限界とドメインフロンティングへの備え
許可リストは、TLSの接続開始時に送られるSNIのホスト名で判定されます。通常の許可ドメインではTLSを終端しないため、暗号化された中身のHTTPのHostヘッダーは検査されません。ドキュメントは、SNIに許可済みのホスト名を書きつつHostに別のホスト名を入れる「ドメインフロンティング」で、同じCDNの裏にある別のサイトへ届きうると明記しています。
対策は、他のサイトと基盤を共有しない用途の狭いホスト名だけを許可するか、transformでHostヘッダーを許可ドメインに固定することです。transformを設定したドメインではファイアウォールがTLSを終端し、サンドボックスごとの専用CA証明書で書き換えます。
Vercel Sandboxの料金・実行時間上限とActive CPU課金の費用増加条件
料金と上限のドキュメントの数値を、2026年11月15日時点で確認しました。以下の単価は既定リージョンiad1の値で、CPU・メモリ・通信の単価はリージョンごとに異なります。
HobbyとProの無料枠・単価・最大45分と24時間のセッション上限
| 項目 | Hobby(無料枠) | Pro(従量) |
|---|---|---|
| Active CPU | 月5時間 | 1時間0.128ドル |
| 割り当てメモリ | 月420GB時間 | 1GB時間0.0212ドル |
| 作成回数 | 月5,000回 | 100万回0.60ドル |
| スナップショット保管 | 累計15GB | 1GB月0.08ドル |
| 最大セッション時間 | 45分 | 24時間 |
| 同時実行数 | 10 | 10,000 |
Hobbyは無料枠を超えても課金されず、最初の利用から30日が経つまで作成が止まります。Proでは使用量がまずプランの月20ドル分のクレジットから引かれ、超えた分については上の単価に基づく従量請求の対象です。セッションの既定のタイムアウトは5分で、extendTimeout()でプランの上限まで延ばせます。上限はセッション単位なので、永続化したサンドボックスを停止・再開すれば通算の稼働時間に上限はありません。
vCPUの割り当て速度にも上限があります。Proでしばらく作成していない状態からだと最初の1分は150vCPU(8vCPUなら18個分)で、毎分500ずつ上がり最大5,000です。数百件を一斉に流す設計では待ち行列を挟みます。
Active CPUは待ち時間を数えないがメモリは割当時間で課金される点
Active CPUは、コードが実際にCPUを使った時間だけを数えます。ネットワークやLLMの応答を待っている間は課金されません。一方、メモリは使用量ではなく割り当て量×稼働時間で、待っている間も課金されます。公式の例では、1vCPU・2GBのサンドボックスを丸1日動かした場合、CPU使用率1%のアイドル状態でも1日1.05ドル、30日で31.45ドルかかります。このうち約1.02ドルはメモリ分です。
費用を下げる手段は、CPUを削ることより止めることです。vCPUを増やすとメモリも比例して増えるため、1vCPUから始めて足りなければ上げます。
永続化の自動スナップショットとリージョン既定iad1が生む想定外の費用
既定のpersistent: trueのまま1回きりの実行を繰り返すと、停止のたびにスナップショットが作られ、最終利用から30日間は保管料がかかります。サンドボックスを削除してもスナップショットは既定で残るため、sandbox.delete({ deleteOrphanSnapshots: true })を使うか、作成時にpersistent: falseを指定します。持ち越したい場合も、keepLastSnapshots: { count: 1 }で最新の1件だけ残すと保管量が増えません。
リージョンも既定のままにしないでください。リージョンのドキュメントによると、利用できるのは東京hnd1と大阪kix1を含む19リージョンで、指定が無いとiad1(米国東部)に作られます。国内のDBやストレージを読む処理を米国で動かすと、往復の遅延が増えるうえ、データの経路も国外を経由する形です。プロジェクトの設定で既定のリージョンをhnd1にしておけば、呼び出しごとの指定漏れも防げます。なお、スナップショットは作ったリージョンからしか復元できません。
Vercel SandboxとE2B・Docker製クラウド基盤・自前隔離の選定条件
AIエージェント向けの隔離実行基盤はほかにもあります。Dockerのクラウド版はDocker Cloud Sandboxesとは?sbxでAIエージェントを隔離実行する手順・料金とローカル版の違い、Cloudflareの選択肢はCloudflare Containersとは?AIエージェントのサンドボックスを動かす手順と料金で扱いました。ここでは同じくSDKから呼ぶ専業サービスのE2Bと比べます。
| 比較の観点 | Vercel Sandbox | E2B |
|---|---|---|
| 無料枠 | Hobbyで毎月付与 | 初回のみ100ドル分 |
| 有料プランの基本料 | Pro(月20ドル分充当) | Pro月150ドル+従量 |
| CPUの課金 | 使った時間のみ | vCPU秒の単価 |
| 最大セッション時間 | Pro 24時間 | Pro 24時間 |
| 同時実行(Pro) | 10,000 | 100(追加で最大1,100) |
E2Bの数値はE2Bの料金ページで2026年11月15日に確認しました。2vCPU・メモリ4GBを1時間、CPU使用率10%で動かす場合、Vercel Sandbox(iad1)はCPU約0.026ドル+メモリ約0.085ドルで約0.11ドルです。E2Bの単価を割り当て量×稼働時間で掛けると、vCPU約0.10ドル+メモリ約0.065ドルで約0.17ドルになります。LLMの応答待ちが長い処理ほど、Active CPU課金のVercelが有利に働きます。
Vercel Sandboxを採用してよいAIエージェント・コード実行の要件
次のいずれかに当てはまるなら、Vercel Sandboxを選んで構いません。
- アプリやエージェントがVercel上にあり、OIDCでトークン管理を省きたい
- 1回の処理がLLMの応答待ちを多く含み、CPUを使う時間は短い
- AI Gatewayと組み合わせ、キーをサンドボックスに渡さずに外部APIを呼ばせたい
- 利用者ごとにサンドボックスを分け、数百〜数千を同時に動かす可能性がある
この条件なら、隔離用のVM基盤を自前で用意する理由はほとんどありません。
Vercel Sandboxを見送り自前の隔離基盤やE2Bを選ぶべき場面
逆に、次のどれかに当てはまるならVercel Sandboxは採用しません。処理するデータを自社のクラウドアカウントの外に出せない契約や規程がある場合。1回のセッションが24時間を超えて途切れずに動き続ける必要がある場合。既にKubernetesを運用しており、既存のクラスタの中で隔離を完結させたい場合です。
3つ目の場合は、ランタイムを差し替えてPodを隔離する方が筋がよく、gVisorとは?コンテナを隔離するサンドボックスの仕組みとrunc・Kata比較・導入判断やAWS Nitro Sandboxesとは:EKSのPodを軽量VMで隔離する手順と制約が選択肢になります。ベンダーの中立性を重視し、Vercelを使わないスタックでSDKだけを呼ぶならE2Bも同じ条件での比較対象です。どの基盤で生成コードを動かすかの設計や、AIエージェントを業務システムへ組み込む開発は生成AI開発・AI受託開発でご相談いただけます。
Vercel Sandboxの導入前によく挙がる質問と公式ドキュメントの回答
導入の検討で確認されることの多い5点を、2026年11月時点の公式ドキュメントに沿って答えます。
Vercel Sandboxは無料で使えますか?
Hobbyプランなら、毎月Active CPU 5時間・割り当てメモリ420GB時間・作成5,000回までが無料です。超えても課金はされず、最初の利用から30日が経つまで作成が止まります。セッションは最大45分、同時実行は10までなので、業務で継続的に使うならProプランが前提です。
Vercelにデプロイしていないアプリからも使えますか?
Vercelへのデプロイがなくても利用は可能です。外部のCIや他社クラウドのサーバーからは、チームID・プロジェクトID・アクセストークンの3つを環境変数に置き、Sandbox.create()に渡します。Vercelのプロジェクト自体は必要ですが、コードをデプロイする必要はありません。Vercelにデプロイした関数から呼ぶ場合に限り、OIDCトークンの取得と更新をSDKが自動で行います。
1つのサンドボックスは最長でどれくらい動かせますか?
1回のセッションの上限はHobbyで45分、ProとEnterpriseで24時間です。既定のタイムアウトは5分なので、長い処理では作成時のtimeoutかextendTimeout()で延ばします。永続化したサンドボックスなら、停止と再開でファイルシステムを引き継いだまま続きを実行できます。
東京リージョンでサンドボックスを動かせますか?
動かせます。東京はhnd1、大阪はkix1で、作成時にregionを指定するか、プロジェクトの設定画面で既定のリージョンを変えます。指定しないと米国東部のiad1に作られる点に注意してください。CPUやメモリの単価はリージョンごとに異なるため、東京の単価は料金ページのリージョン切り替えで確認します。
サンドボックスの中でDockerやsudoは使えますか?
使えます。公式ドキュメントには、Dockerのようなコンテナランタイムなどシステム権限の要る処理も動かせると記載があります。runCommand()でsudo: trueを指定した場合、コマンドの実行権限は管理者権限です。ツール群を毎回入れ直す手間は、カスタムイメージかスナップショットで省けます。
関連記事
- Vercel(ヴァーセル)とは?サーバー不要の仕組みとできること・料金:Vercelの全体像とホスティングの料金
- Vercel AI Gatewayとは:複数LLMを1つのAPIで切り替える設定手順と料金・LiteLLMとの選び方:サンドボックスから呼ぶLLMの窓口と予算設定
- Vercel AI SDKの使い方|AI SDK 7でNext.jsチャットとLangChain連携を実装:生成コードを返すエージェント側の実装
- サンドボックスとは?セキュリティで隔離環境が果たす役割・仕組みと限界、導入判断を解説:製品を横断した隔離環境の考え方
- Docker Cloud Sandboxesとは?sbxでAIエージェントを隔離実行する手順・料金とローカル版の違い:Dockerが提供する同種の実行基盤