このドキュメントでは、Google Kubernetes Engine(GKE)クラスタに Agent Sandbox コントローラをインストールして実行する手順について説明します。また、信頼できないシェルコマンドをテストできるサンドボックス環境をクラスタにデプロイする方法についても説明します。
Agent Sandbox コントローラは、エフェメラル ランタイム環境の作成と管理のためのフレームワークを提供します。このアプローチでは、アプリの環境にテンプレートを定義し、必要に応じてそのインスタンスを作成できます。
Agent Sandbox は、大規模言語モデル(LLM)によって生成されたコードなど、信頼性の低いコードを実行するための安全で分離された環境を提供します。このタイプのコードをクラスタで直接実行すると、信頼できないコードが他のアプリや基盤となるクラスタノード自体にアクセスしたり、干渉する可能性があるため、セキュリティ上のリスクが生じます。
Agent Sandbox は、実行するコードに対して強力なプロセス、ストレージ、ネットワークの分離を提供することで、これらのリスクを軽減します。このドキュメントでは、GKE Autopilot クラスタまたは Standard クラスタで Agent Sandbox を実行する手順について説明します。
Agent Sandbox はオープンソース プロジェクトです。プロジェクトに貢献する方法や、より詳細な技術情報については、Agent Sandbox オープンソース プロジェクトをご覧ください。
費用
このドキュメントの手順に沿って操作すると、 Google Cloudアカウントに料金が発生します。費用は、GKE クラスタを作成した時点で発生します。これらの費用には、料金ページで説明されている GKE のクラスタごとの料金と、Compute Engine VM の実行料金が含まれます。
不要な料金が発生しないように、このドキュメントの完了後に GKE を無効にするか、プロジェクトを削除してください。
始める前に
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Google Kubernetes Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
In the Google Cloud console, activate Cloud Shell.
環境変数を定義する
このドキュメントで実行するコマンドを簡略化するために、Cloud Shell で環境変数を設定できます。Cloud Shell で、次のコマンドを実行して環境変数を定義します。
export PROJECT_ID=$(gcloud config get project) export CLUSTER_NAME="agent-sandbox-cluster" export GKE_LOCATION="us-central1" export REPOSITORY_NAME="python-sandbox-repo" export PYTHON_SANDBOX_IMG="${GKE_LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/sandbox-runtime:latest" export AGENT_SANDBOX_VERSION="v0.1.0"これらの環境変数の説明は次のとおりです。
PROJECT_ID: 現在の Google Cloud プロジェクトの ID。この変数を定義すると、GKE クラスタなどのすべてのリソースが正しいプロジェクトに作成されます。CLUSTER_NAME: GKE クラスタの名前(例:agent-sandbox-cluster)。GKE_LOCATION: GKE クラスタと Artifact Registry リポジトリが作成される Google Cloud リージョン(例:us-central1)。イメージの pull レイテンシが短縮されるため、これらをコロケーションすることをおすすめします。REPOSITORY_NAME: Python サンプルアプリのコンテナ イメージが保存される Artifact Registry リポジトリの名前(例:python-sandbox-repo)。PYTHON_SANDBOX_IMG: ビルドして push する Python サンドボックス コンテナ イメージの固有識別子。AGENT_SANDBOX_VERSION: クラスタにデプロイする Agent Sandbox コントローラのバージョン。
Agent Sandbox をデプロイする
Google Cloud プロジェクトと Cloud Shell 環境が設定されたので、必要なインフラストラクチャをプロビジョニングして、Agent Sandbox をデプロイする準備ができました。
GKE クラスタを作成する
次に、GKE クラスタを作成します。このクラスタは、Agent Sandbox コントローラとサンプル サンドボックス アプリをデプロイして実行する Kubernetes 環境を提供します。
Autopilot クラスタまたは Standard クラスタを作成できます。
Autopilot
gcloud CLI を使用して Autopilot クラスタを作成するには、次のコマンドを実行します。
gcloud container clusters create-auto ${CLUSTER_NAME} \ --location=${GKE_LOCATION} \ --project=${PROJECT_ID}Standard
gcloud CLI を使用して Standard クラスタを作成するには、次のコマンドを実行します。
gcloud container clusters create ${CLUSTER_NAME} \ --location=${GKE_LOCATION}kubectlCLI がクラスタに接続できるように、クラスタの認証情報を取得します。このコマンドは、デフォルトで~/.kube/configディレクトリに保存されている Kubernetes 構成ファイルを更新します。この構成ファイルには、kubectlが GKE クラスタとやり取りするために必要な認証情報が含まれています。gcloud container clusters get-credentials ${CLUSTER_NAME} \ --location=${GKE_LOCATION}Agent Sandbox コントローラをクラスタにデプロイする
公式リリース マニフェストをクラスタに適用することで、Agent Sandbox コントローラとその必須コンポーネントをデプロイできます。これらのマニフェストは、クラスタに Agent Sandbox コントローラをデプロイして実行するために必要なすべてのコンポーネントをダウンロードするように Kubernetes に指示する構成ファイルです。
次のコマンドを実行して、Agent Sandbox コントローラを GKE クラスタにデプロイします。
kubectl apply \ -f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/${AGENT_SANDBOX_VERSION}/manifest.yaml \ -f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/${AGENT_SANDBOX_VERSION}/extensions.yamlDeployment を確認する
マニフェストを適用したら、Agent Sandbox コントローラ Pod が正しく実行されていることを確認します。
kubectl get pods -n agent-sandbox-systemPod の STATUS 列に「Running」、READY 列に「1/1」が表示されるまで待ちます。Pod が正常に実行されている場合、出力は次のようになります。
NAME READY STATUS RESTARTS AGE agent-sandbox-controller-0 1/1 Running 0 44dAgent Sandbox コントローラが実行されると、クラスタに作成した
Sandboxリソースのサンドボックス環境を自動的に作成して管理できます。サンドボックス環境をデプロイする
GKE クラスタで Agent Sandbox コントローラが実行されているので、シェルコマンドを実行するための安全なサンドボックス環境を提供するサンプル ウェブサーバー アプリをデプロイできます。
これを行うには、まずアプリのコンテナ イメージをビルドし、クラスタがアクセスできる非公開の Artifact Registry リポジトリに保存する必要があります。
イメージが使用可能になったら、2 段階のプロセスでデプロイします。まず、
SandboxTemplateを定義します。これは、サンドボックス環境の再利用可能なブループリントとして機能します。次に、SandboxClaimを作成します。これは、Agent Sandbox コントローラにコンテナ イメージを pull し、テンプレートに基づいて新しい Pod として実行するように指示するリクエストです。最後に、実行中のアプリをテストして、正しく動作することを確認します。Artifact Registry リポジトリを作成する
次の手順では、コンテナ イメージを保存する非公開の Artifact Registry リポジトリを作成し、それにアクセスするように Docker を構成する方法について説明します。
Python サンドボックス アプリのコンテナ イメージを保存する Artifact Registry リポジトリを作成します。
gcloud artifacts repositories create $REPOSITORY_NAME \ --repository-format=docker \ --location=$GKE_LOCATIONArtifact Registry で Docker クライアントを認証します。この操作により、 Google Cloud 認証情報を使用して、イメージを限定公開リポジトリに安全に push し、そこからイメージを pull できます。
gcloud auth configure-docker "${GKE_LOCATION}-docker.pkg.dev"
Python サンプルアプリをビルドして push する
次に、Agent Sandbox リポジトリからサンプルコードをダウンロードする必要があります。このコードは、基本的な Python ウェブサーバーを含むコンテナ イメージをビルドします。
このウェブサーバーは、Agent Sandbox のコア機能をデモンストレートするように設計されており、シェルコマンドを JSON ペイロードとして受け入れる
/executeエンドポイントを公開します。このエンドポイントにコマンドを送信すると、サーバーは安全なサンドボックス環境内でコマンドを実行し、出力を返します。次の手順では、リポジトリのクローンを作成し、コンテナ イメージをビルドして、プライベート Artifact Registry リポジトリに push する方法について説明します。
GitHub から
agent-sandboxリポジトリのクローンを作成します。このリポジトリには、Python アプリのコードが含まれています。git clone https://github.com/kubernetes-sigs/agent-sandbox.gitPython アプリの Dockerfile とソースコードが含まれるディレクトリに移動します。
cd agent-sandbox/examples/python-runtime-sandboxDocker を使用してアプリのコンテナ イメージをビルドします。
-tフラグは、このドキュメントの冒頭でPYTHON_SANDBOX_IMG環境変数で定義された名前でイメージにタグを付けます。docker build -t $PYTHON_SANDBOX_IMG .GKE クラスタがアクセスできるように、コンテナ イメージを限定公開の Artifact Registry リポジトリに push します。
docker push $PYTHON_SANDBOX_IMG
SandboxTemplateを作成するSandboxTemplateリソースを作成して、サンドボックスの構成を定義します。このテンプレートは、Agent Sandbox コントローラが使用して、一貫性のある事前構成済みのサンドボックス環境を作成する再利用可能なブループリントとして機能します。SandboxTemplateリソースを作成すると、サンドボックスを一度定義して、後でその複数のインスタンスを作成できます。Cloud Shell で、次の内容を含むファイルを
sandbox-template.yamlという名前で作成します。このマニフェストは、サンドボックスの作成に使用できる再利用可能なブループリントとして機能するSandboxTemplateリソースを定義します。SandboxTemplateとSandboxClaimは同じ Namespace に存在している必要があります。apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxTemplate metadata: name: python-runtime-template namespace: default spec: podTemplate: metadata: labels: # The selector in the wait command looks for this label. sandbox: python-sandbox-example spec: # Optional, must have gVisor enabled node # runtimeClassName: gvisor containers: - name: python-runtime image: IMAGE_PLACEHOLDER ports: - containerPort: 8888 readinessProbe: httpGet: path: "/" port: 8888 initialDelaySeconds: 0 periodSeconds: 1 resources: requests: cpu: "250m" memory: "512Mi" ephemeral-storage: "512Mi" restartPolicy: "OnFailure"Python アプリのイメージパスを使用してマニフェストを更新します。
sed -i "s|IMAGE_PLACEHOLDER|${PYTHON_SANDBOX_IMG}|g" sandbox-template.yamlSandboxTemplateマニフェストを適用します。kubectl apply -f sandbox-template.yaml
SandboxClaimを作成してサンドボックスを作成する再利用可能なブループリントが作成されたので、
SandboxClaimリソースをクラスタに適用して、実行側のサンドボックスを作成します。この要求はSandboxTemplateを参照し、テンプレートの構成に基づいてSandboxリソースとその対応する Pod を作成するように Agent Sandbox コントローラに指示します。次の内容で
sandbox-claim.yamlという名前のファイルを作成します。SandboxClaimリソースは、python-runtime-templateに基づく新しいサンドボックスをリクエストします。複数のSandboxClaimsを作成できますが、各SandboxClaim名は実行中の他のSandboxClaimsと重複しないようにする必要があります。apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxClaim metadata: name: python-sandbox-example namespace: default spec: sandboxTemplateRef: name: python-runtime-templateテンプレートに基づいて Sandbox リソースの作成をトリガーするには、
SandboxClaimマニフェストを適用します。kubectl apply -f sandbox-claim.yamlSandbox リソースの準備ができていることを確認します。
kubectl wait --for=condition=Ready sandbox/python-sandbox-example --namespace default --timeout=120s出力は次のようになります。
sandbox.agents.x-k8s.io/python-sandbox-example condition metkubectl get sandboxコマンドを実行して、サンドボックスの詳細を表示します。kubectl get sandbox続行する前に、サンドボックス化された Pod がトラフィックを受け入れる準備ができていることを確認します。
kubectl wait --for=condition=ready pod --selector=sandbox=python-sandbox-example --namespace default --timeout=120s出力は次のようになります。
pod/python-sandbox-example condition met
サンドボックスをテストする
サンプルアプリが安全なサンドボックス内で実行されているので、テストして正しく動作していることを確認できます。次の手順では、
kubectl port-forwardコマンドを使用して Cloud Shell 環境からサンドボックス Pod に安全に接続する方法について説明します。次に、クローンを作成したリポジトリに含まれているtester.pyスクリプトを使用して、アプリの/executeエンドポイントにテストコマンドを送信し、成功レスポンスが返されることを確認します。Pod へのポート転送を設定します。ポート転送を使用すると、ローカルの Cloud Shell 環境からサンドボックス内で実行されているウェブサーバー アプリに通信できます。
POD_NAME="python-sandbox-example" kubectl port-forward "pod/${POD_NAME}" 8888:8888 & PF_PID=$! trap "kill $PF_PID" EXIT sleep 3テスト スクリプトに必要な
requestsライブラリをインストールします。pip3 install requestsagent-sandbox/examples/python-runtime-sandboxディレクトリにあるtester.pyスクリプトを実行して、サンドボックス エンドポイントを確認します。python3 tester.py 127.0.0.1 8888tester.pyスクリプトは、アプリが応答していることを確認するヘルスチェックと、echo 'hello world'シェルコマンドをサンドボックスに送信するコマンド実行テストという 2 つの主要なテストを実行します。出力は次のようになります。
$ python3 tester.py 127.0.0.1 8888 --- Testing Health Check endpoint --- Sending GET request to http://127.0.0.1:8888/ Handling connection for 8888 Health check successful! Response JSON: {'status': 'ok', 'message': 'Sandbox Runtime is active.'} --- Testing Execute endpoint --- Sending POST request to http://127.0.0.1:8888/execute with payload: {'command': "echo 'hello world'"} Handling connection for 8888 Execute command successful! Response JSON: {'stdout': 'hello world\n', 'stderr': '', 'exit_code': 0}
これで完了です。GKE クラスタに安全なサンドボックス環境が正常にデプロイされました。このアプリの
/executeエンドポイントに任意のシェルコマンドを送信できるようになりました。Agent Sandbox は、クラスタのノードや他のワークロードを信頼できないコードから保護する安全なバリア内でコマンドを実行します。Agent Sandbox は、AI エージェントや自動化されたワークフローがタスクを実行するための安全で信頼性の高い方法を提供します。サンドボックスを削除する
テストが完了したら、サンドボックスを破棄してコンピューティング リソースを解放します。
作成した
SandboxClaimリソースを削除します。kubectl delete -f sandbox-claim.yamlこのアクションは、実行中の Pod を終了して Sandbox リソースを削除するようにコントローラに指示します。
次のコマンドを実行して、リソースが削除されたことを確認します。
kubectl get sandbox,pod -n defaultしばらくすると、サンドボックス環境が正常にクリーンアップされたことを確認する
No resources foundメッセージが表示されます。
リソースのクリーンアップ
Google Cloud アカウントに課金されないようにするには、このドキュメント全体で作成したリソースを削除します。次の手順では、GKE クラスタ、Artifact Registry リポジトリ、およびそのリポジトリに含まれるコンテナ イメージを削除する方法について説明します。
GKE クラスタを削除します。
gcloud container clusters delete $CLUSTER_NAME --location=$GKE_LOCATION --quietArtifact Registry に push したコンテナ イメージを削除します。
gcloud artifacts docker images delete $PYTHON_SANDBOX_IMG --delete-tags --quietArtifact Registry リポジトリを削除します。
gcloud artifacts repositories delete $REPOSITORY_NAME --location=$GKE_LOCATION --quiet
次のステップ
- Agent Sandbox オープンソース プロジェクトの詳細については、GitHub をご覧ください。
- ワークロードのセキュリティ分離を提供する基盤となるテクノロジーについては、GKE Sandbox をご覧ください。
- クラスタとワークロードのセキュリティ強化の詳細については、GKE セキュリティの概要をご覧ください。