−25%

Windows 연간 결제, 10월 31일까지. 요금제 보기

EQVPS
시작하기

5분 만에 시작하는 샌드박스 Python SDK: pip install eqvps부터 첫 실행까지

EQVPS Python SDK를 설치하고 Firecracker 샌드박스를 띄워 코드를 실행하고, 패키지를 설치하고, 파일을 주고받고, 긴 작업을 백그라운드로 돌립니다. 명령이 모두 포함된 6단계이며 전체 비용은 1센트도 안 됩니다.

이 가이드는 아무것도 없는 상태에서 Python으로 동작하는 샌드박스까지 안내합니다. 격리된 Firecracker microVM을 띄우고, 그 안에서 코드를 실행하고, 패키지를 설치하고, 파일을 넣고 빼고, 오래 걸리는 작업을 백그라운드로 돌립니다. 각 단계는 붙여 넣기만 하면 되는 몇 줄입니다.

Python 3.8 이상과 EQVPS 계정이 필요합니다. SDK에는 의존성이 없습니다.

1. 토큰 받기

샌드박스 요금은 계정 잔액에서 나가므로 SDK에는 계정 토큰이 필요합니다. 계정 연결 페이지에 대시보드, API, MCP 서버라는 세 가지 발급 방법이 나와 있습니다. 받은 토큰은 환경 변수에 넣습니다.

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

경로는 절대 경로여야 합니다. 한 번 전송할 수 있는 크기는 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에서는 블록당 0.00055달러이므로 다섯 예제를 모두 합쳐도 약 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 레퍼런스에 정리되어 있습니다.

다음 단계

자주 묻는 질문

체험하려면 카드가 필요한가요?

아니요. 새 계정은 잔액이 부족한 상태에서 처음 샌드박스를 만들 때 1달러의 샌드박스 크레딧을 받습니다. 이 가이드 전체에 드는 비용은 그중 1센트에도 한참 못 미칩니다. 이후에는 암호화폐로 잔액을 충전합니다.

샌드박스 안에서 pip로 패키지를 설치할 수 있나요?

네. 샌드박스는 외부 인터넷에 접속할 수 있고, pip는 virtualenv 없이 시스템에 설치합니다. torch처럼 큰 패키지는 디스크와 메모리가 더 필요하므로 plus 이상의 요금제를 쓰세요.

명령이 30초 뒤에 끊기는 이유는 무엇인가요?

run과 exec의 기본 타임아웃은 30초이고, 동기 호출의 최대치는 55초입니다. 더 오래 걸리는 작업은 이 제한이 없는 background=True로 실행하세요.

스크립트가 중간에 죽어도 샌드박스가 삭제되나요?

with 블록을 쓰면 삭제됩니다. 블록이 끝날 때, 예외가 발생한 경우에도 삭제됩니다. 쓰지 않으면 임시 샌드박스는 5분간 활동이 없을 때 삭제되며, 그 5분도 과금됩니다.

댓글

아직 댓글이 없습니다. 첫 번째가 되세요.

댓글 남기기

댓글은 표시되기 전에 검토됩니다.