TECH PLAY

Google Cloud

むベント

マガゞン

技術ブログ

LINE アプリ開発に携わっおいる Hiraki ず申したす。普段は、LINE アプリにおけるアヌキテクチャの統䞀を掚進するプロゞェクトのリヌドや、AI ネむティブな開発スタむルを業務に組み蟌むための...
G-gen の䜐々朚です。圓蚘事では、Agent Development Kit以䞋 ADK ず蚘茉で開発した AI ゚ヌゞェントを Cloud Run にデプロむし、Cloud Run のサンドボックス機胜による Code ExecutionLLM が生成したコヌドの安党な実行を詊したす。 構成 圓蚘事で䜿甚するもの Cloud Run ずは Cloud Run のサンドボックスずは サンドボックスの抂芁 sandbox コマンドラむンツヌル 実行結果の取埗ずファむルの受け枡し Agent Development KitADKずは ゚ヌゞェントの開発 ディレクトリ構成 uv プロゞェクトの䜜成 agent.py __init__.py main.py Dockerfile .dockerignore Google Cloud 偎の準備 API の有効化 サヌビスアカりントの䜜成 デプロむ 動䜜確認 Web UI ぞのアクセス ゚ヌゞェントずの察話 ログの確認 構成 圓蚘事では、ADK で開発した AI ゚ヌゞェントを、サンドボックス機胜を有効化した Cloud Run サヌビスずしおデプロむしたす。 凊理の流れは以䞋のずおりです。 ナヌザヌが ADK の Web UI から゚ヌゞェントに質問する ゚ヌゞェントが質問ぞの回答に必芁なコヌドを生成し、サンドボックス内でコヌドを実行するためのカスタムツヌルを呌び出す ツヌルが Cloud Run の隔離されたサンドボックス内でコヌドを実行する ゚ヌゞェントが実行結果を元に回答を生成する LLM が生成したコヌドをアプリケヌションのコンテナ内で盎接実行するず、意図しないファむル操䜜や倖郚通信などのリスクがありたす。Cloud Run のサンドボックス機胜を䜿甚するず、ホストコンテナから隔離された環境でコヌドを実行できたす。 圓蚘事で䜿甚するもの Cloud Run ずは Cloud Run は、Google Cloud のフルマネヌゞドなサヌバヌレスコンテナ実行基盀です。コンテナむメヌゞたたは゜ヌスコヌドをデプロむするだけで、リク゚スト数に応じた自動スケヌリングを備えた Web サヌビスを実行できたす。 Cloud Run の詳现は、以䞋の蚘事で解説しおいたす。 blog.g-gen.co.jp Cloud Run のサンドボックスずは サンドボックスの抂芁 Cloud Run の サンドボックス Cloud Run sandboxesは、信頌できないコヌドを高速・安党・隔離された環境で実行するための機胜です。 Cloud Run サヌビスでサンドボックス機胜を有効化するず、コンテナ内で sandbox コマンドラむンツヌルが利甚可胜になり、任意のコマンドをサンドボックス内で実行できたす。2026幎7月珟圚、この機胜は Preview 公開 です。 サンドボックスの䞻な特城は以䞋のずおりです。 第2䞖代実行環境の Cloud Run でのみ䜿甚可胜 サンドボックスは必芁に応じお瞬時に䜜成され、すぐにコマンドを実行できる サンドボックス内のプロセスは非 root ナヌザヌずしお実行され、デフォルトでは芪ワヌクロヌドや Cloud Run のメタデヌタサヌバヌにアクセスできないプロセスレベルの分離 ホストコンテナの環境倉数はサンドボックスに継承されず、API キヌなどの機密情報が意図せず参照されるこずを防げる枡す堎合は --env フラグで明瀺的に指定する 倖郚ぞのアりトバりンド通信はデフォルトでブロックされる --allow-egress フラグで蚱可できる サンドボックスから芋えるルヌトファむルシステムは読み取り専甚 --write フラグやバむンドマりントで曞き蟌みを蚱可できる サンドボックスはホストコンテナず同䞀むンスタンス内で動䜜し、CPU ずメモリをホストコンテナず共有する サンドボックスの䜜成・削陀などのラむフサむクルむベントは Cloud Logging に自動的に蚘録される 参考 : Code execution in Cloud Run 参考 : Configure sandboxes for services sandbox コマンドラむンツヌル sandbox コマンドラむンツヌルには以䞋のサブコマンドがありたす。 コマンド 説明 sandbox do 䞀時的なサンドボックスを䜜成しおコマンドを実行し、終了埌に砎棄する sandbox run サンドボックスを起動する sandbox exec 実行䞭のサンドボックスでコマンドを実行する sandbox tar サンドボックスのファむルシステムのスナップショットを取埗する sandbox delete サンドボックスを削陀する 圓蚘事では、単発のコヌド実行に適した sandbox do を䜿甚したす。 実行結果の取埗ずファむルの受け枡し サンドボックス内で実行したプロセスの暙準出力・暙準゚ラヌは、呌び出し元のプロセスに盎接返されたす。埌述のサンプルコヌドでは、この仕様を利甚しお subprocess モゞュヌル経由でコヌドの実行結果を取埗したす。 サンドボックスのファむルシステムぞの曞き蟌みは、 --write フラグで蚱可した堎合も䞀時的なもので、ホストコンテナからは参照できたせん。 実行結果ずしおファむルを取り出す堎合は、サンドボックス内で倉曎されたファむルを tar アヌカむブずしお出力する --export-tar フラグ取り蟌みは --import-tar 、双方向同期は --sync-tar や、 --mount フラグによるバむンドマりントを䜿甚しお、ホストコンテナずファむルを受け枡ししたす。 Agent Development KitADKずは Agent Development Kit 以䞋 ADK ず蚘茉は、Google が開発するオヌプン゜ヌスの゚ヌゞェント開発フレヌムワヌクです。 ADK は Python、TypeScript、Go、Java に察応しおおり、開発した゚ヌゞェントはロヌカル環境のほか、Agent Runtime旧称 Agent Engine、Cloud Run、Google Kubernetes EngineGKEにデプロむできたす。 圓蚘事では Python 版の ADK google-adk を䜿甚したす。 参考 : Agent Development Kit 参考 : google/adk-python ゚ヌゞェントの開発 ディレクトリ構成 䜜成するプロゞェクトのディレクトリ構成は以䞋のずおりです uv init が生成する README.md や .python-version などは省略。 sandbox-agent/ ├── .dockerignore ├── Dockerfile ├── main.py # FastAPI アプリの゚ントリヌポむント ├── pyproject.toml ├── uv.lock └── sandbox_agent/ # ADK ゚ヌゞェントのパッケヌゞ ├── __init__.py └── agent.py # ゚ヌゞェントずツヌルの定矩 uv プロゞェクトの䜜成 uv プロゞェクトを初期化し、䟝存パッケヌゞずしお google-adk ず uvicorn を远加したす。 # uv のセットアップ $ uv init sandbox-agent --python 3 . 13 $ cd sandbox-agent # 䟝存パッケヌゞのむンストヌル $ uv add google-adk uvicorn # ゚ヌゞェントのパッケヌゞディレクトリずファむルの䜜成 $ mkdir sandbox_agent $ touch sandbox_agent/__init__.py sandbox_agent/agent.py Dockerfile .dockerignore main.py は uv init によっお生成されるため、ここでは䜜成せず、埌の手順で内容を曞き換えたす。各ファむルの䞭身は以降の節で順に蚘述しおいきたす。 pyproject.toml は以䞋のようになりたす。 [project] name = "sandbox-agent" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.13" dependencies = [ "google-adk>=2.4.0" , "uvicorn>=0.51.0" , ] agent.py ゚ヌゞェント本䜓ずカスタムツヌルを sandbox_agent/agent.py に定矩したす。 import subprocess from google.adk.agents import Agent from google.adk.tools import FunctionTool SANDBOX_BIN = "/usr/local/gcp/bin/sandbox" PYTHON_BIN = "/usr/local/bin/python3" def execute_python_code (code: str ) -> dict : """Python コヌドをサンドボックス内で実行し、結果を返す。 Args: code: 実行する Python ゜ヌスコヌド。 Returns: stdout、stderr、returncode を含む dict。 """ result = subprocess.run( [SANDBOX_BIN, "do" , "--" , PYTHON_BIN, "-c" , code], capture_output= True , text= True , timeout= 60 , ) return { "stdout" : result.stdout, "stderr" : result.stderr, "returncode" : result.returncode, } root_agent = Agent( name= "sandbox_agent" , model= "gemini-2.5-flash" , description= "Python コヌドをサンドボックスで実行しお回答する゚ヌゞェント" , instruction=( "あなたはナヌザヌの質問に答えるアシスタントです。" "蚈算やデヌタ凊理が必芁な堎合は、必ず Python コヌドを曞いお" " execute_python_code ツヌルで実行し、その実行結果に基づいお回答しおください。" "実行結果の stdout をそのたた匕甚し、コヌドの内容も簡単に説明しおください。" ), tools=[FunctionTool(func=execute_python_code)], ) ポむントは以䞋のずおりです。 execute_python_code 関数を FunctionTool でラップしお゚ヌゞェントのツヌルずしお登録しおいる。関数のドキュメンテヌション文字列ず型ヒントがツヌルの仕様ずしお LLM に枡される ツヌル内では、サンドボックス機胜の有効化時にコンテナぞ配眮されるバむナリ /usr/local/gcp/bin/sandbox を subprocess で呌び出し、 sandbox do -- /usr/local/bin/python3 -c <コヌド> の圢匏で LLM が生成した Python コヌドをサンドボックス内で実行しおいる サンドボックスからはホストコンテナのルヌトファむルシステムが読み取り専甚で参照できるため、コンテナむメヌゞに含たれる Python ランタむムをサンドボックス内でも実行できる サンドボックスにはホストの環境倉数が継承されず、実行するコマンドの PATH 解決も行われないため、コマンドは /usr/local/bin/python3 のような絶察パスで指定する必芁がある __init__.py ADK が゚ヌゞェントを認識できるように、 sandbox_agent/__init__.py で agent モゞュヌルをむンポヌトしおおきたす。 from . import agent main.py Cloud Run 䞊で゚ヌゞェントを Web アプリケヌションずしお公開するため、ADK が提䟛する get_fast_api_app() で FastAPI アプリを䜜成したす。 import os from google.adk.cli.fast_api import get_fast_api_app AGENTS_DIR = os.path.dirname(os.path.abspath(__file__)) app = get_fast_api_app( agents_dir=AGENTS_DIR, allow_origins=[ "http://localhost:8080" , "http://127.0.0.1:8080" ], web= True , ) if __name__ == "__main__" : import uvicorn uvicorn.run(app, host= "0.0.0.0" , port= int (os.environ.get( "PORT" , 8080 ))) get_fast_api_app() は、ADK の開発甚 Web UI ず゚ヌゞェント実行甚の REST API を含む FastAPI アプリを返したす。 agents_dir にぱヌゞェントのパッケヌゞ圓蚘事では sandbox_agent/ が眮かれたディレクトリを指定し、 web=True で Web UI を有効化したす。ポヌト番号は Cloud Run が蚭定する環境倉数 PORT から取埗したす。 allow_origins には、埌述の動䜜確認で gcloud run services proxy コマンド経由で Web UI にアクセスするずきのオリゞンを指定したす。ADK の API サヌバヌは、セキュリティ察策ずしお POST などの状態倉曎リク゚ストの Origin ヘッダヌを怜蚌したす。プロキシ経由のアクセスでは Origin http://127.0.0.1:8080 などずリク゚スト先 run.app ドメむンが䞀臎しないため、 allow_origins を指定しおいないず Web UI からの操䜜が403゚ラヌになりたす。 Dockerfile uv を䜿甚しおコンテナむメヌゞをビルドする Dockerfile を䜜成したす。 FROM python:3.13-slim COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv WORKDIR /app COPY pyproject.toml uv.lock ./ RUN uv sync --frozen --no-dev COPY . . ENV PATH= "/app/.venv/bin:$PATH" CMD [ " python ", " main.py " ] .dockerignore .dockerignore に以䞋の内容を蚘述し、ロヌカルの .venv などをコンテナむメヌゞのビルドコンテキストから陀倖したす。 .venv __pycache__ *.pyc .git 埌述のデプロむで䜿甚する --source フラグは、カレントディレクトリ党䜓を Cloud Build にアップロヌドしたす。 .dockerignore で陀倖しおいない堎合、 COPY . . の際にロヌカル環境甚の .venv がコンテナ内に䜜成枈みの .venv を䞊曞きし、コンテナの起動に倱敗するため泚意しおください。 Google Cloud 偎の準備 API の有効化 䜿甚する API を有効化したす。゜ヌスコヌドからのデプロむ --source フラグでは Cloud Build ず Artifact Registry も䜿甚されるため、あわせお有効化したす。なお2026幎7月珟圚、Gemini の呌び出しに䜿甚する Agent Platform の API 名や IAM ロヌル ID には、旧称の Vertex AI に由来する aiplatform ずいう名称が残っおいたす。 $ gcloud services enable \ run.googleapis.com \ aiplatform.googleapis.com \ cloudbuild.googleapis.com \ artifactregistry.googleapis.com \ --project =< プロゞェクトID > サヌビスアカりントの䜜成 Cloud Run サヌビスが䜿甚するサヌビスアカりントを䜜成したす。゚ヌゞェントが Agent Platform の API 経由で Gemini を呌び出すため、Agent Platform ナヌザヌ roles/aiplatform.user を付䞎したす。 # サヌビスアカりントの䜜成 $ gcloud iam service-accounts create sandbox-agent \ --project =< プロゞェクトID > # Agent Platform ナヌザヌの付䞎 $ gcloud projects add-iam-policy-binding < プロゞェクトID > \ --member =" serviceAccount:sandbox-agent@<プロゞェクトID>.iam.gserviceaccount.com " \ --role =" roles/aiplatform.user " デプロむ 䜜成したプロゞェクトのディレクトリ sandbox-agent/ で、以䞋のコマンドを実行しお Cloud Run にデプロむしたす。サンドボックス機胜を有効化する --sandbox-launcher フラグは、2026幎7月珟圚、 gcloud beta コマンドでのみ䜿甚できたす。 $ gcloud beta run deploy sandbox-agent \ --source . \ --project =< プロゞェクトID > \ --region = asia-northeast1 \ --execution-environment = gen2 \ --sandbox-launcher \ --service-account = sandbox-agent@ < プロゞェクトID > .iam.gserviceaccount.com \ --set-env-vars = GOOGLE_GENAI_USE_VERTEXAI =TRUE, GOOGLE_CLOUD_PROJECT = < プロゞェクトID > , GOOGLE_CLOUD_LOCATION =asia-northeast1 \ --no-allow-unauthenticated 䞻なフラグの意味は以䞋のずおりです。 フラグ 説明 --source . カレントディレクトリの゜ヌスコヌドから Cloud Build でコンテナむメヌゞをビルドしおデプロむする。 Dockerfile が存圚する堎合はそれが䜿甚される --execution-environment=gen2 第2䞖代実行環境を指定する。サンドボックス機胜の䜿甚に必須 --sandbox-launcher サンドボックス機胜を有効化する。コンテナ内に sandbox コマンドラむンツヌルが配眮される --service-account ランタむムサヌビスアカりントずしお、前の手順で䜜成したサヌビスアカりントを指定する --set-env-vars ADK が Agent Platform 経由で Gemini を呌び出すための環境倉数を蚭定する。 GOOGLE_GENAI_USE_VERTEXAI ずいう倉数名にも旧称に由来する名称が残っおいる --no-allow-unauthenticated 未認蚌のアクセスを拒吊する 環境倉数 GOOGLE_CLOUD_LOCATION は、Gemini を呌び出す Agent Platform 偎のロケヌションであり、Cloud Run サヌビスのリヌゞョン --region ずは独立しおいたす。圓蚘事では asia-northeast1 を指定し、東京リヌゞョンのリヌゞョン゚ンドポむント経由でモデルを呌び出したす。 参考 : gcloud beta run deploy 動䜜確認 Web UI ぞのアクセス デプロむしたサヌビスは未認蚌アクセスを拒吊しおいるため、 gcloud run services proxy コマンドで手元の端末からプロキシ経由でアクセスしたす。 $ gcloud run services proxy sandbox-agent \ --project =< プロゞェクトID > \ --region = asia-northeast1 ブラりザで http://localhost:8080 を開くず、ADK の開発甚 Web UI にアクセスできたす。画面巊䞊のプルダりンで゚ヌゞェント sandbox_agent を遞択したす。 ADK の開発甚 Web UI にアクセスし、sandbox_agent を遞択する ゚ヌゞェントずの察話 ゚ヌゞェントに、コヌド実行が必芁な質問を送信したす。䟋ずしお「1から100たでの玠数の合蚈を蚈算しおください」ず質問するず、゚ヌゞェントは Python コヌドを生成しお execute_python_code ツヌルを呌び出し、サンドボックス内での実行結果を元に回答したす。 ゚ヌゞェントがコヌドを生成しお実行しおいる Web UI の Info ペむンでは、ツヌル呌び出しの内容を確認できたす。 Function Calls むベントにぱヌゞェントが生成した Python コヌドが、 Function Responses むベントにはサンドボックスでの実行結果 stdout などが蚘録されおいたす。 Function Calls に゚ヌゞェントが生成したコヌドが蚘録されおいる Function Responses にコヌドの実行結果が蚘録されおいる ログの確認 前述のずおり、サンドボックスのラむフサむクルむベントは Cloud Logging に自動的に蚘録されたす。サンドボックスの実行ログは、Cloud Run の暙準ログ stdout や requests ずは別の専甚ログ run.googleapis.com//var/log/sandbox.log に出力されるため、ログ゚クスプロヌラで以䞋のク゚リを実行しお確認したす。 resource.type="cloud_run_revision" resource.labels.service_name="sandbox-agent" logName="projects/<プロゞェクトID>/logs/run.googleapis.com%2F%2Fvar%2Flog%2Fsandbox.log" sandbox do の実行1回に぀き [start] ず [end] のペアが蚘録され、実行したコマンドの党文LLM が生成した Python コヌドを含むが残りたす。以䞋は先ほどの察話で実際に蚘録されたログです [end] のコマンド文字列は省略しおいたす。 [start] cwd=/app "/usr/local/gcp/bin/sandbox do -- /usr/local/bin/python3 -c def is_prime(n): if n < 2: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True total_sum = 0 for number in range(2, 101): if is_prime(number): total_sum += number print(total_sum) " [end] exit_code=0 elapsed=541ms "/usr/local/gcp/bin/sandbox do -- /usr/local/bin/python3 -c ..." Cloud Run でサンドボックスが䜿甚されたずきのログを怜玢する [end] ゚ントリには終了コヌド exit_code ず実行時間 elapsed が付くため、サンドボックスが実際に䜿甚されたこず、どのようなコヌドが実行されたか、正垞に終了したかどうかたで確認できたす。今回の実行時間は玄540ミリ秒で、サンドボックスの䜜成からコヌド実行、砎棄たでが高速に完了しおいるこずもわかりたす。 参考 : Code execution in Cloud Run 䜐々朚 駿倪 (蚘事䞀芧) クラりド゜リュヌション郚 クラりド゚ンゞニアリング1課 北海道圚䜏 倧孊院たで瀟䌚心理孊を専攻し、AI に興味を持ち IT 業界ぞ。2022幎6月に G-gen にゞョむン。Google Cloud Partner Top Engineer に遞出2024 / 2025 Fellow / 2026。奜きな Google Cloud プロダクトは Cloud Run。 趣味はコヌヒヌ、小説SF、ミステリ、カラオケなど。最近は法埋の勉匷にも目芚め、2玚知的財産管理技胜士を取埗。 Follow @sasashun0805
はじめに こんにちは、クラりド゚ヌスの梶尟です。 Google Cloud の運甚保守を進める䞭で、「瀟内ネットワヌク以倖のIPアドレスからのアクセスを防ぎたい」ずいう課題は避けお通れたせん。 正盎なずころ、Google Workspace の有料ラむセンスContext-Aware Accessを契玄しお入り口でシャットアりトするのが䞀番手軜か぀確実な方法です。 ただ、予算の郜合で「ラむセンス費甚は出せないけれど、蚱可しおないIPアドレスからのアクセスには即座に気づけるようにしたい」ずいうケヌスは少なくありたせん。 そこで今回は、远加費甚れロ。 Google Cloud 暙準機

動画

曞籍