このガイドでは、ゼロから Python で動くサンドボックスまでを進めます。隔離された Firecracker の microVM を起動し、コードを実行し、パッケージを入れ、ファイルを出し入れし、時間のかかる処理をバックグラウンドで動かします。どのステップも、貼り付けるだけの数行です。
必要なのは Python 3.8 以降と EQVPS アカウントです。SDK に依存パッケージはありません。
1. トークンを用意する
サンドボックスの料金はアカウント残高から支払われるため、SDK にはアカウントトークンが必要です。アカウントの接続に、ダッシュボード、API、MCP サーバーの 3 つの取得方法が載っています。取得したら環境変数に設定します。
export EQVPS_API_KEY="your-token"
まだ残高がなくても大丈夫です。新しいアカウントが残高不足のまま初めてサンドボックスを作成すると、14 日間有効な 1 ドルのサンドボックス用クレジットが付与されます。
2. SDK をインストールする
pip install eqvps
3. サンドボックスを起動してコードを実行する
次の内容を hello.py として保存し、実行します。
from eqvps import Sandbox
with Sandbox.create(tariff="small") as sb:
print(sb.id)
r = sb.run("import platform; print(platform.python_version())")
print(r.exit_code, r.stdout)
サンドボックスの id(sb_ に続く 24 文字)、続いて 0 3.12.x が表示されます。サンドボックスは約 1 秒で起動し、コードを実行し、with ブロックが終わると削除されました。
結果について知っておきたい点:
- 終了コードが 0 でタイムアウトしていなければ
r.okは true になります。 - 0 以外の終了コードは例外ではありません。
r.okは自分で確認してください。 stdoutとstderrはそれぞれ 1 MiB までで、出力が切り詰められたかどうかはr.truncatedでわかります。
4. パッケージを入れてシェルコマンドを実行する
サンドボックスの中では、Python、Node.js、git、curl が入った小さな Linux システムの root です。exec は任意のシェルコマンドを実行します。
from eqvps import Sandbox
with Sandbox.create(tariff="small") as sb:
sb.exec("pip install --quiet requests", timeout=55)
r = sb.run("import requests; print(requests.get('https://example.com').status_code)")
print(r.stdout) # 200
デフォルトのタイムアウトは 30 秒、同期呼び出しは最長 55 秒です。大きなインストールはバックグラウンドタスクで実行しましょう(ステップ 6)。
5. ファイルを出し入れする
from eqvps import Sandbox
with Sandbox.create() as sb:
sb.upload("/root/data.csv", "a,b\n1,2\n3,4\n")
sb.run("""
import csv
rows = list(csv.DictReader(open('/root/data.csv')))
open('/root/sum.txt', 'w').write(str(sum(int(r['b']) for r in rows)))
""")
print(sb.download_text("/root/sum.txt")) # 6
パスは絶対パスで指定します。1 回の転送は 5 MB までです。download はバイト列を、download_text は文字列を返します。
6. 長いジョブをバックグラウンドで動かす
background=True を渡すと、待たずにすぐタスクが返ってきます。55 秒の上限はありません。
from eqvps import Sandbox
with Sandbox.create(tariff="standard") as sb:
task = sb.exec("for i in 1 2 3 4 5; do echo step $i; sleep 20; done", background=True)
result = task.wait(on_output=lambda out, err: print(out, end=""))
print(result.state, result.exit_code) # done 0
task.wait() は 2 秒ごとに状態を確認し、新しい出力が届くたびに表示します。task.logs() を自分で呼ぶことも、task.kill() で止めることもできます。タスクが動いている間は、操作がないことを理由にサンドボックスが削除されることはありません。
かかった費用
上の with ブロックはそれぞれ数秒しか存在せず、最低料金の 60 秒分で課金されました。small では 1 ブロックあたり 0.00055 ドルなので、5 つの例をすべて合わせても約 3 分の 1 セントです。全プランの料金、永続モード、支出上限はサンドボックスの制限と課金にあります。
うまくいかないとき
API のエラーは、捕捉できる例外です。
from eqvps import Sandbox, InsufficientBalanceError, RateLimitError
try:
with Sandbox.create() as sb:
print(sb.run("print(1)").stdout)
except InsufficientBalanceError:
print("Top up the balance")
except RateLimitError as e:
print("Too many at once, retry in", e.retry_after)
サーバーが待ち時間を返した場合、SDK は 429 と 503 の応答を最大 3 回まで自動で再試行します。11 種類のエラークラスはすべて SDK リファレンスに載っています。
次のステップ
- 同じ手順を JavaScript で:5 分で始めるサンドボックス用 TypeScript SDK
- AI モデルにコードを書かせてここで実行する:サンドボックスで最初のエージェントタスク
- プラン、お試しクレジット、サンドボックスの中身:サンドボックスのページ
コメント
まだコメントはありません。最初になりましょう。