mcpField
A
app-platform-sandbox

app-platform-sandbox

github.com/digitalocean-labsクラウド・DevOps3881 回インストール4 日前に更新
リポジトリ

app-platform-sandbox について

app-platform-sandboxは、DigitalOcean App Platform上に隔離された実行環境を用意するスキルです。状態を保ちながらコードを繰り返し実行するAIエージェントやテストワークフローに向け、単体サンドボックスとウォームプールを提供します。

主な機能

  1. 01隔離された実行サンドボックスの作成
  2. 02ウォームプールからの取得
  3. 03コマンド実行と出力のストリーミング
  4. 04サンドボックス内ファイルの読み書き
  5. 05休止と復元

活用シーン

  1. 01AIコードインタープリターの実行
  2. 02複数段階のエージェントワークフロー
  3. 03単発スクリプトやCI連携のテスト
  4. 04対話型タスクのコールドスタート待ち削減

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/digitalocean-labs/do-app-platform-skills --skill app-platform-sandbox

インストール後、Claude Code で/app-platform-sandboxを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
reference/
cold-sandbox.md
hot-pool.md
positioning.md
service-mode.md
use-cases.md

詳細

サンドボックススキル

AI エージェントやテストワークフロー向けの分離された実行環境です。

基本方針

Lambda/Functions: Fast cold start, 15-min limit, stateless, per-ms billing
App Platform Sandbox: 30s cold start (or instant with pool), unlimited duration, stateful, per-hour billing

Sweet spot: Long-running, stateful, iterative workflows where agents need to
install packages, run code, check results, modify, repeat.

選択の目安

┌─────────────────────────────────────────────────────────────┐
│         Need isolated execution environment?                 │
└─────────────────────────────────────────────────────────────┘
                            │
              Is this for debugging an EXISTING app?
                            │
            ┌───────────────┴───────────────┐
            │                               │
           YES                              NO
            │                               │
            ▼                               ▼
   ┌─────────────────┐           ┌─────────────────┐
   │ troubleshooting │           │ Need real-time  │
   │ skill           │           │ streaming or    │
   │                 │           │ port exposure?  │
   │ Sandbox.get_    │           │                 │
   │ from_id()       │           └────────┬────────┘
   └─────────────────┘                    │
                          ┌───────────────┴───────────────┐
                          │                               │
                         YES                              NO
                          │                               │
                          ▼                               ▼
                 ┌─────────────────┐           ┌─────────────────┐
                 │ SERVICE MODE    │           │ Is low latency  │
                 │ exec_stream()   │           │ critical?       │
                 │ expose_port()   │           │                 │
                 └─────────────────┘           └────────┬────────┘
                                                        │
                                        ┌───────────────┴───────────────┐
                                        │                               │
                                       YES                              NO
                                        │                               │
                                        ▼                               ▼
                               ┌─────────────────┐           ┌─────────────────┐
                               │ HOT POOL        │           │ COLD SANDBOX    │
                               │ SandboxManager  │           │ Sandbox.create()│
                               │ ~50ms acquire   │           │ ~30s startup    │
                               └─────────────────┘           └─────────────────┘

前提条件

# Verify doctl is installed and authenticated
doctl auth whoami

# Install the SDK (choose one)
uv pip install do-app-sandbox
# OR
pip install do-app-sandbox

# For Spaces support (large file transfers)
pip install "do-app-sandbox[spaces]"

要件:

  • Python 3.10.12+
  • doctl CLI がインストールされ、認証済みであること
  • App Platform にアクセスできる DigitalOcean アカウント

クイックスタート:コールドサンドボックス

起動時間約 30 秒で、単一のサンドボックスを作成します。

from do_app_sandbox import Sandbox

# Create sandbox with Python image
sandbox = Sandbox.create(
    image="python",           # or "node"
    name="my-sandbox",
    region="nyc",
    instance_size="apps-s-1vcpu-1gb"
)

# Execute code
result = sandbox.exec("python3 -c 'import sys; print(sys.version)'")
print(result.stdout)

# File operations
sandbox.filesystem.write_file("/tmp/script.py", "print('hello')")
result = sandbox.exec("python3 /tmp/script.py")

# Clean up
sandbox.delete()

詳しいガイド:cold-sandbox.md を参照してください。


クイックスタート:ホットプール

すぐに取得できるよう事前にウォームアップされたサンドボックスです。

import asyncio
from do_app_sandbox import SandboxManager, PoolConfig

async def main():
    # 1. Configure pool
    manager = SandboxManager(
        pools={"python": PoolConfig(target_ready=3)},
    )

    # 2. Start and warm up (blocks until pool is ready)
    await manager.start()
    await manager.warm_up(timeout=180)

    # 3. Acquire instantly (~500ms from pool vs 30s cold start)
    sandbox = await manager.acquire(image="python")
    result = sandbox.exec("python3 -c 'print(2+2)'")
    print(result.stdout)

    # 4. Delete when done - YOUR responsibility!
    sandbox.delete()

    # 5. Shutdown (cleans up pool, not acquired sandboxes)
    await manager.shutdown()

asyncio.run(main())

**所有権モデル:**サンドボックスを acquire() した時点で、そのサンドボックスの所有者になります。使用後は必ず sandbox.delete() を呼び出してください。shutdown() がクリーンアップするのは、プールにまだ残っているサンドボックスのみです。

詳しいガイド:hot-pool.md を参照してください。


クイックリファレンス:サンドボックスを使う場面

シナリオ推奨
AI コードインタープリターホットプール(即時応答)
複数ステップのエージェントワークフロー単一のサンドボックス(1 つのサンドボックス内で状態が保持されます)
単発のスクリプトテストコールドサンドボックス(シンプル)
CI 統合テストコールドサンドボックス(ジョブごと)
短時間のタスク(< 30s)代わりに Lambda を検討してください
高い同時実行性(1000+)代わりに Lambda を検討してください

クイックリファレンス:利用可能なイメージ

イメージレジストリ用途
pythonghcr.io/bikramkgupta/sandbox-pythonPython 3.13、uv、pip
nodeghcr.io/bikramkgupta/sandbox-nodeNode.js 24、nvm

作業ディレクトリ:/home/sandbox/app(/app のシンボリックリンクあり)。ポート:8080(ユーザーアプリ)、9090(ヘルスチェック)。

カスタムイメージにも対応しています。HTTP サーバー機能を備えた任意の Docker イメージを使用できます。


クイックリファレンス:SDK メソッド

メソッド目的
Sandbox.create(image, mode=...)サンドボックスを作成します(WORKER または SERVICE モード)
Sandbox.get_from_id()既存のアプリに接続します
sandbox.exec(cmd)シェルコマンドを実行します
sandbox.exec_stream(cmd)出力をストリーミングします(SERVICE モード)
sandbox.expose_port(port)ポートの公開 URL を取得します(SERVICE モード)
sandbox.hibernate()コスト削減のため、スナップショットを作成して削除します
Sandbox.wake(hibernated)休止状態のサンドボックスを復元します
sandbox.filesystem.read_file()ファイルの内容を読み取ります
sandbox.filesystem.write_file()ファイルを書き込みます
sandbox.delete()サンドボックスを削除します(使用後は必ず呼び出してください)
SandboxManager(pools={...})ホットプールを設定します
manager.start()バックグラウンドでプール管理を開始します
manager.warm_up(timeout)プールが目標数に達するまで待機します(非同期)
manager.acquire(image=...)プールからサンドボックスを取得します(非同期)
manager.acquire_with_snapshot()事前設定された状態のサンドボックスを取得します
manager.shutdown()プールを停止します(プールのみをクリーンアップします)

リファレンスファイル

  • cold-sandbox.md — 単一サンドボックスのライフサイクル、ファイル操作、クリーンアップ
  • hot-pool.md — プール管理、サイズ設定、コスト最適化
  • service-mode.md — ストリーミング、ポート公開、AI エージェントのパターン
  • use-cases.md — AI エージェントのパターン、テストのパターン
  • positioning.md — Lambda とサンドボックスの選択ガイド

コストに関する考慮事項

Sandbox billing: ~$0.01-0.03/hour per container (apps-s-1vcpu-1gb)

Hot Pool trade-off:
- Pool of 5 sandboxes running 8 hours = ~$0.80-2.40/day
- Eliminates 30s cold start per request
- Worth it for interactive AI agents, not for batch jobs

他のスキルとの連携

方向スキル場面
→troubleshooting既存のサンドボックスをデバッグする場合(Sandbox.get_from_id() を使用)
→designerアプリの仕様にサンドボックス対応ワーカーを含める場合
←deploymentサンドボックスは独立しており、メインアプリのデプロイには含まれません

コメント