
Cloud Run Sandboxes: 프로덕션 환경에서 AI 생성 코드를 실행하는 가장 안전한 방법
요약
Google Cloud가 AI 에이전트가 생성한 코드를 안전하게 실행할 수 있는 Cloud Run Sandboxes를 공개 미리보기로 출시했습니다. 기존 Cloud Run 인스턴스 내에서 격리된 실행 환경을 밀리초 단위로 생성하여 보안 리스크를 최소화합니다.
핵심 포인트
- AI 에이전트의 동적 코드 실행 시 발생하는 보안 위협 해결
- 기존 Cloud Run 인스턴스 내에서 즉각적인 격리 환경 제공
- 밀리초 단위의 빠른 시작 속도로 성능 저하 방지
- 서버리스 환경을 유지하며 호스트 시스템으로부터 안전한 격리 보장
생성형 AI (Generative AI) 애플리케이션과 자율 에이전트 (AI agents)는 소프트웨어가 코드와 상호작용하는 방식을 혁신하고 있으며, 이에 따라 새로운 과제를 만들어내고 있습니다. 현대의 AI 에이전트는 더 이상 정적인 텍스트만 생성하지 않습니다. 이 에이전트들은 진화하여 동적으로 코드를 생성하고, Python 스크립트를 작성 및 실행하며, 데이터셋을 파싱하고, 웹 스크레이퍼 (web scrapers)를 실행하며, 실시간으로 외부 웹훅 (webhooks)을 호출합니다. 만약 신뢰할 수 없는 코드가 메인 애플리케이션 컨테이너 내부에서 실행된다면, 공격자나 환각 (hallucinating)을 일으키는 LLM이 환경 변수에 접근하거나, 클라우드 메타데이터 서버에서 서비스 계정 토큰을 훔치거나, 내부 네트워크를 침해할 수 있습니다. 이는 엄청난 보안 리스크를 초래합니다.
질문은 이것입니다. 어떻게 하면 인프라를 위험에 빠뜨리지 않고 언어 모델이 코드를 실행하게 할 수 있을까요?
Google은 최근 AI 엔지니어링의 가장 어려운 과제 중 하나를 해결함으로써 위 질문에 답했습니다. 이는 코드를 실행하는 AI 에이전트를 안전하게 구축하는 방식의 근본적인 변화이며, 여러분이 이미 알고 있는 서버리스 (serverless) 모델에 깊이 통합되어 있습니다. Google Cloud는 Cloud Run Sandboxes를 공개 미리보기 (public preview)로 도입했습니다. 우후!
Google Cloud Run Service Sandbox란 무엇인가?
Cloud Run Sandboxes는 기존 Cloud Run 서비스 인스턴스 내에서 즉각적으로 생성할 수 있는 가볍고 격리된 실행 경계입니다. Cloud Run Sandboxes는 서버리스 환경을 벗어나지 않고도 이러한 작업들을 실행할 수 있는 안전하고 격리된 샌드박스 (sandbox)를 제공합니다.
핵심 문구는 기존 Cloud Run 서비스 인스턴스 내에서입니다. 샌드박스 호스트 역할을 하기 위해 별도의 Cloud Run 서비스를 구동하는 것이 아닙니다. 새로운 VM을 프로비저닝하는 것도 아닙니다. 샌드박스는 에이전트 코드를 이미 실행 중인 동일한 인스턴스 내부에서 실행되며, 두 개의 보안 경계 계층에 의해 격리되면서도 속도를 위해 에이전트와 같은 위치에 배치됩니다.

Cloud Run 서비스에서 이 기능을 활성화하면, 샌드박스 (sandbox) 명령줄 도구가 실행 환경(컨테이너)에 마운트됩니다. 이를 통해 애플리케이션은 호스트 시스템을 위험에 빠뜨리지 않고 표준 서브프로세스 (subprocess) 호출을 통해 안전하게 샌드박스를 시작할 수 있습니다.
이를 잠긴 건물 안에 에이전트(agent)를 위한 잠긴 방을 하나 주는 것이라고 생각하면 됩니다. 에이전트는 그 방에 들어가서 필요한 코드를 무엇이든 실행하고 다시 나올 수 있지만, 방 안에서 일어나는 어떤 일도 건물의 열쇠, 배선 또는 정문에 영향을 줄 수 없습니다.
주요 기능:
- 밀리초 단위 시작 (Millisecond Startup): 활성 호스트 컨테이너 내부에서 약 ~500ms 내에 새로운 실행 환경을 생성합니다.
- 자원 공유형 가격 책정 (Shared Resource Pricing): 이미 할당된 인스턴스의 CPU 및 메모리에서 실행되므로, 추가적인 클라우드 VM 비용이나 특수한 제3자 벤더의 마진이 발생하지 않습니다.
- 엄격한 휘발성 (Strict Ephemerality): 실행이 완료되면 샌드박스 프로세스와 파일 시스템 변경 사항은 모두 폐기됩니다.

왜 사용해야 하는가? (보안 및 운영상의 이점)
역사적으로 동적 코드의 샌드박싱 (sandboxing)은 복잡한 인프라 설정을 필요로 했습니다. Cloud Run Sandboxes는 기본적으로 세 가지 엄격한 제로 트러스트 (Zero-trust) 보안 경계를 구축함으로써, 악의적이거나 오류가 있는 코드 실행으로부터 호스트 애플리케이션과 클라우드 리소스를 보호하도록 설계되었습니다.
1. 자격 증명(Credential), ID 보호 및 환경 격리: 기본적으로 샌드박스는 부모 워크로드(parent workload)에 접근할 수 없으며, 호스트 환경 변수, 비밀값(secrets) 또는 Google Cloud 메타데이터 서버를 읽을 수 없습니다. 이를 통해 프로젝트 서비스 계정 토큰에 대한 무단 접근을 방지합니다. 모든 샌드박스는 서로 완전히 격리되어 있습니다.
이것이 AI 에이전트 워크로드에서 가장 중요한 경계입니다. 에이전트가 악성 코드를 실행하도록 유도하는 프롬프트 인젝션 (Prompt Injection) 공격이 발생하더라도, 샌드박스는 서비스 계정, Secret Manager 값, 또는 사용자를 대신해 동작할 수 있는 토큰을 제공하는 메타데이터 서버에 접근할 수 없으므로 공격자는 아무것도 얻을 수 없습니다.
2. 기본적으로 차단된 네트워크 송신 (Network Egress): 기본적으로 샌드박스 내부에서는 외부 네트워크로의 아웃바운드 접근이 전혀 허용되지 않습니다. 만약 에이전트가 악성 서버로 데이터를 유출하려는 스크립트를 실행하도록 속더라도, 해당 네트워크 요청은 시스템 계층에서 차단됩니다.
송신(Egress)은 실행 시마다 명시적으로 활성화했을 때만 가능합니다:
# 송신 비활성화 (기본값) — 모든 아웃바운드 네트워크 호출이 차단됨
sandbox do -- python3 /tmp/generated_script.py
...
이는 의미 있는 보안 기본 설정입니다. 대부분의 코드 해석 작업, 데이터 분석, 계산, 텍스트 처리, 차트 생성 등은 외부 네트워크 연결이 필요하지 않습니다. 기본적으로 이를 잠가두는 것은 프롬프트가 탈취되더라도, 공격자가 외부로 신호를 보내려(phone home) 해도 시도조차 할 수 없음을 의미합니다.
3. 안전한 파일 시스템 오버레이 (Zero-Trust 프로세스 격리): 샌드박스 내부의 코드는 제한된 시스템 권한으로 작동하며, 인접한 샌드박스 및 호스트 프로세스로부터 엄격하게 격리됩니다. 샌드박스는 컨테이너 파일 시스템에 대해 읽기 전용 뷰(read-only view)로 실행되어(설치된 패키지, Python 런타임 및 바이너리 사용 가능), 모든 변경 사항은 격리된 임시 메모리 오버레이(memory overlay)에 기록됩니다. 샌드박스 실행이 종료되면 생성된 모든 파일은 폐기됩니다.
이는 에이전트(agent)의 종속성(dependencies), 런타임(runtimes), 도구(tools)가 샌드박스 내부에서 사용 가능하다는 것을 의미합니다. 즉, python3를 실행하거나, numpy를 사용하거나, playwright를 호출할 수 있지만, 실행 중에 작성된 모든 파일은 샌드박스가 닫히면 사라집니다. 만약 샌드박스 간에 출력을 유지해야 한다면, 다음과 같이 명시적으로 수행해야 합니다.
# 샌드박스 외부로 유지되는 tar 아카이브에 샌드박스 출력을 기록합니다
sandbox do --write --export-tar=/tmp/work.tar \
-- /bin/bash -c "mkdir -p /tmp/work && echo 'task-complete' > /tmp/work/status.txt"
...
Cloud Run Sandboxes 사용 방법: 단계별 안내
1단계: 배포 시 기능(sandbox launcher) 활성화하기
Cloud Run Sandboxes를 사용하려면 해당 기능이 활성화된 Cloud Run 서비스를 배포해야 합니다. Cloud Run 서비스에서 샌드박스를 활성화하는 방법은 배포 시 단일 플래그(flag)를 추가하는 것만큼 간단합니다.
gcloud beta run deploy my-app-agentic-service \
--image=gcr.io/my-project/agent-image \
--region=africa-south1 \
...
또는 YAML 구성(configuration)을 통해 가능합니다:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
...
2단계: 에이전트 코드에서 샌드박스 생성하기
샌드박스 런처(sandbox launcher)가 활성화되면, 컨테이너 내부에서 샌드박스 바이너리(binary)를 자동으로 사용할 수 있게 됩니다. 에이전트의 코드는 표준 서브프로세스(subprocess) 실행을 통해 이를 호출합니다.
주요 하위 명령(subcommands)은 다음과 같습니다:
| 명령 | 설명 |
|---|---|
| sandbox do | 임시 샌드박스를 생성하고, 명령을 실행한 후, 이를 파괴합니다 |
| ... |
샘플: Python, Node.js 또는 Go 코드 실행하기
다음은 AI 에이전트가 생성된 코드를 실행하기 위해 샌드박스를 사용하는 실제 예시입니다.
import subprocess
def run_llm_generated_code(llm_code: str) -> str:
...
// Node.js 에이전트 예시
const { execSync } = require('child_process');
const fs = require('fs');
...
// Go 에이전트 예시
package main
...
sandbox do 명령은 임시 샌드박스 (sandbox)를 생성하고, Python 코드를 실행한 뒤, 그 출력을 반환합니다. 샌드박스는 호스트 환경 변수 (host environment variables)를 상속받지 않으므로, 명령 실행 시 반드시 절대 경로 (absolute paths)를 사용해야 합니다.
3단계: ADK 통합 사용 (Gemini 기반 에이전트용)
Cloud Run Sandboxes는 에이전트 개발 키트 (Agent Development Kit, ADK)에서 새로운 CloudRunSandboxCodeExecutor를 통해 지원됩니다. 이 통합을 통해 Cloud Run에서 실행되는 ADK 에이전트는 단 한 줄의 코드로 코드를 실행할 수 있는 능력을 갖게 됩니다.
from google.adk.agents import Agent
from google.adk.integrations.cloud_run import CloudRunSandboxCodeExecutor
...
이미 ADK를 기반으로 구축 중이라면 이것이 가장 깔끔한 통합 경로입니다. 이 실행기 (executor)는 sandbox do 호출, 출력 캡처 (output capture), 에러 처리 (error handling) 및 결과 포맷팅 (result formatting)을 자동으로 처리하므로, 에이전트는 그저 코드를 작성하고 결과만 받으면 됩니다.
4단계: 벤더 중립적 (vendor-agnostic) 통합을 위한 ComputeSDK 사용
Cloud Run Sandboxes는 샌드박스 실행을 위한 벤더 중립적 SDK인 ComputeSDK를 통해서도 사용할 수 있습니다. 이 SDK를 사용하면 Cloud Run 서비스 외부에서 원격으로 샌드박스를 호출하거나, 서비스 내에서 로컬 도구 (local tool)로 직접 사용할 수 있습니다.
# Cloud Run Sandboxes와 함께 ComputeSDK 사용하기
npm install @computesdk/cloud-run
CLOUD_RUN_SANDBOX_URL=https://your-gateway-xyz.run.app
CLOUD_RUN_SANDBOX_SECRET=your_shared_secret
# 선택 사항: IAM 인증 서비스용 Google 서명 ID 토큰 (identity token)
...
# Cloud Run 프로바이더 (provider) 사용
import { cloudRun } from '@computesdk/cloud-run';
...
에이전트 코드가 다양한 샌드박스 프로바이더 간에 이식성 (portable)을 갖추기를 원한다면 ComputeSDK가 올바른 선택입니다. provider 파라미터를 변경함으로써 Cloud Run Sandboxes, E2B, Modal 및 기타 프로바이더 간을 자유롭게 전환할 수 있습니다. ComputeSDK 및 CloudRun 통합에 대해 자세히 알아보기.

핵심 사용 사례 (Core use cases)
– LLM 코드 인터프리터 (code interpreters) 및 데이터 분석
이것은 가장 대표적인 사용 사례입니다. AI 제품에 고급 데이터 분석 기능을 구축하여, 모델이 Python, R 또는 SQL 코드를 작성하고 실행함으로써 데이터 세트를 분석하고, 차트를 생성하며, 복잡한 수학 연산을 안전하게 수행하도록 할 수 있습니다.
사용자가 업로드한 CSV를 처리하기 위해 pandas 코드를 작성하고 실행하는 금융 보고 에이전트, 통계 분석을 실행하기 위해 numpy 코드를 작성하는 과학 보조 도구, 사용자가 자연어로 질문하면 에이전트가 이에 답하기 위한 SQL 또는 Python 코드를 작성하는 비즈니스 인텔리전스 (BI) 도구 등이 있습니다. 이 모든 사례는 이론적으로 악의적일 수 있는 LLM 생성 코드를 포함하며, Cloud Run Sandboxes는 모든 실행을 격리합니다.
– 헤드리스 브라우저 자동화 (Headless browser automation)
에이전트에게 브라우저를 실행할 수 있는 안전한 환경을 제공하여, 호스트 머신을 위험에 빠뜨리지 않고 웹 페이지를 안전하게 스크래핑(scraping)하고, 스크린샷을 찍으며, 웹 워크플로를 자동화할 수 있습니다.
# 샌드박스 내부에서 헤드리스 Playwright 브라우저 실행
def web_research(url: str) -> str:
script = f"""
...
브라우저 자동화는 대상 URL에 접속해야 하므로 --allow-egress 설정이 필요하다는 점에 유의하세요. 이는 의도된 선택이며, 귀하는 오직 이 특정 실행에 대해서만 명시적으로 네트워크 액세스 권한을 부여하는 것입니다.
– 사용자가 제출한 코드 및 플러그인
AI를 넘어, Cloud Run에서 호스팅되는 플랫폼은 자체 최종 사용자(end-users)가 업로드한 커스텀 스크립트, 플러그인 또는 웹후크(webhooks)를 안전하게 실행하기 위해 샌드박스를 사용할 수 있습니다.
사용자 정의 자동화 스크립트(user-defined automation scripts), 웹후크 프로세서(webhook processors), 커스텀 플러그인 시스템(custom plugin systems), 또는 구성 가능한 데이터 변환(configurable data transformations)을 허용하는 SaaS 플랫폼의 경우, 이 중 어떤 것이든 귀하가 작성하지 않은 코드를, 귀하가 완전히 신뢰하지 않을 수도 있는 사용자가 실행하는 것을 포함합니다. Cloud Run Sandboxes는 귀하가 직접 샌드박스 인프라를 구축하고 운영할 필요 없이 격리 계층(isolation layer)을 제공합니다.
- 서브 에이전트 실행 (Sub-agent execution)
태스크를 병렬로 완료하기 위해 서브 에이전트(sub-agents)를 생성하고, 각 서브 에이전트가 생성된 코드의 서로 다른 조각을 실행하는 AI 시스템은 Cloud Run Sandboxes의 샌드박스별 격리(per-sandbox isolation)로부터 직접적인 이점을 얻습니다. 각 서브 에이전트의 코드는 형제 샌드박스(sibling sandboxes)의 상태, 데이터 또는 자격 증명(credentials)에 접근할 수 없는 완전히 분리된 샌드박스에서 실행됩니다.
왜 특별히 Cloud Run Sandboxes를 사용해야 하는가?
에이전트 응답성에 중요한 속도
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기