GEMINI LABEN
SUNSET — 画像生成モデルの停止まで残り2日です。8月17日に imagen-4.0-generate-001・ultra・fast と Gemini 3 Image 系が止まりますBREAKING — 単なるモデル差し替えでは済みません。generate_images() というメソッド自体が消え、画像生成はテキストと同じ generate_content() を通す形に変わりますHARD — 停止日は非推奨の警告ではなくハードエラーで止まります。期日をまたいで様子を見る運用は成立しませんMIGRATE — 非推奨表では移行先として gemini-3.1-flash-image が示されていますROBOTICS — Gemini Robotics ER 2 が一般公開されました。動画理解・タスクの統括・複数ロボットの協調・安全性が強化されていますLOGS — Interactions API の開発者ログが AI Studio のダッシュボードから閲覧できるようになりましたSUNSET — 画像生成モデルの停止まで残り2日です。8月17日に imagen-4.0-generate-001・ultra・fast と Gemini 3 Image 系が止まりますBREAKING — 単なるモデル差し替えでは済みません。generate_images() というメソッド自体が消え、画像生成はテキストと同じ generate_content() を通す形に変わりますHARD — 停止日は非推奨の警告ではなくハードエラーで止まります。期日をまたいで様子を見る運用は成立しませんMIGRATE — 非推奨表では移行先として gemini-3.1-flash-image が示されていますROBOTICS — Gemini Robotics ER 2 が一般公開されました。動画理解・タスクの統括・複数ロボットの協調・安全性が強化されていますLOGS — Interactions API の開発者ログが AI Studio のダッシュボードから閲覧できるようになりました
記事一覧/高度な活用
高度な活用/2026-07-01上級

Managed Agents の隔離サンドボックスから成果物を安全に持ち出す — スコープ限定クレデンシャルと egress の設計

Gemini API の Managed Agents はGoogleホストの隔離サンドボックスで動きます。生成した成果物をそこから自分のリポジトリへ安全に戻すための、短命・最小権限クレデンシャルとegress境界の実装をまとめました。

Gemini API209Managed Agents8セキュリティ8エージェント15個人開発96

プレミアム記事

Managed Agents がパブリックプレビューになって最初に試したのは、いつもの記事生成パイプラインの一部をこのサンドボックスに載せ替えられるか、でした。Googleホストの隔離Linux環境でエージェントが計画・コード実行・ファイル操作まで完結してくれるのは、自前でコンテナを回している身にとって確かに魅力があります。

ところが動かしてみると、すぐに一番地味で一番危ない問題に突き当たりました。サンドボックスの中で作った成果物を、どうやって自分の管理下(GitHubリポジトリやオブジェクトストレージ)へ安全に戻すか、という点です。ここを雑に作ると、Googleがホストする隔離環境の内側に、自分のインフラ全体を触れる鍵を置くことになります。隔離の意味が反転してしまいます。

ここでは持ち出し(egress)の一点に絞り、私がDolice Labsの自動処理で実際に採用した設計を共有します。6/19から制限なしAPIキーのリクエストが拒否されるようになった流れとも、実は綺麗につながる話です。

なぜ「成果物の持ち出し」だけを切り出して設計するのか

Managed Agents のサンドボックスは、実行のたびに立ち上がり、終われば消えるステートレスな環境として扱うのが基本です。計画も推論もコード実行もこの中で完結します。便利な反面、成果物(生成したMDX、ビルド済みJSON、画像など)はサンドボックスの寿命と一緒に消えます。だからどこかへ吐き出す必要があります。

素朴にやると、こうなります。エージェントに「GitHubへpushして」と頼み、そのために GITHUB_TOKEN をまるごと環境変数で渡す。動きます。でも、その瞬間にサンドボックス内のコード(自分が完全には制御していない、モデルが書いたコードを含む)が、そのトークンで到達できる全リポジトリを触れる状態になります。個人開発で複数サイトを同じアカウント下に置いている私の場合、1本の広すぎるトークンが漏れれば4サイト全部が射程に入ります。

ここでの原則はひとつです。サンドボックスには「今回の成果物を、決められた1箇所へ、書き込むだけ」の権限しか渡さない。 読み取りも、他リポジトリへの到達も、削除も要りません。egressをこの粒度まで絞ると、仮にサンドボックス内のコードが暴走しても、被害は「今回の出力先が汚れる」ところで止まります。

悪い例と良い例:クレデンシャルの渡し方

まず、やってはいけない形です。

# ❌ 悪い例: 長期・広範囲のトークンをサンドボックスに丸ごと渡す
agent = client.agents.create(
    model="gemini-flash-latest",
    environment={
        "env_vars": {
            # このPATは全リポジトリにread/write可能。TTLも実質無期限
            "GITHUB_TOKEN": "ghp_LONG_LIVED_BROAD_SCOPE_TOKEN",
            # おまけにデプロイ鍵まで渡してしまう
            "CF_API_TOKEN": "cloudflare_account_wide_token",
        }
    },
)

この形の何が問題かというと、権限・期限・到達範囲のすべてが「広い」ことです。トークンは長生きで、全リポジトリに書けて、ついでにデプロイまで触れます。サンドボックスの中で走るコードを一行ずつ検証できない以上、渡す鍵はそのコードにやってほしいことちょうどぶんに削るべきです。

良い形は、そもそも汎用トークンを渡さないことです。呼び出し側(自分の管理サーバー)で今回の1オブジェクトにだけ有効な、短命の署名付きアップロードURLを先に発行し、それだけをサンドボックスに渡します。

# ✅ 良い例: 呼び出し側で「今回の成果物1個」に限定した書き込み用URLを発行
import datetime
from google.cloud import storage
 
def issue_upload_url(site: str, run_id: str) -> str:
    bucket = storage.Client().bucket("dolice-agent-artifacts")
    # 出力先を run 単位のプレフィックスに固定する(他runの領域には触れない)
    blob = bucket.blob(f"incoming/{site}/{run_id}/output.tar.gz")
    return blob.generate_signed_url(
        version="v4",
        expiration=datetime.timedelta(minutes=15),  # 15分で失効
        method="PUT",                               # PUT のみ。GET も DELETE も不可
        content_type="application/gzip",
    )
 
signed_url = issue_upload_url("gemilab", run_id="20260701-01")
 
agent = client.agents.create(
    model="gemini-flash-latest",
    environment={
        # サンドボックスに渡すのは「この1個を15分だけ書ける」URLのみ
        "env_vars": {"ARTIFACT_UPLOAD_URL": signed_url},
    },
)

差は明確です。悪い例では鍵の到達範囲が「アカウント全体」でしたが、良い例では「incoming/gemilab/20260701-01/output.tar.gz という1オブジェクトへ、PUTで、15分だけ」です。この署名付きURLが仮にログに残っても、盗んだ側にできるのは「今回の出力先を上書きする」ことだけで、しかも15分後には無効になります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
サンドボックス内に長期GitHub PATを渡さず、15分TTLの署名付きURLだけで成果物をegressする実装
egress先を1つのバケットプレフィックスに絞り、书き込み専用ロールで巻き込み被害を封じる設計
6/19の制限なしAPIキー拒否を逆手に取り、Managed Agents向けキーを参照元・用途で締める手順
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API / SDK2026-07-04
Managed Agents を並列で回すと同じリポジトリを奪い合う ― 隔離サンドボックスに効く外部リースとフェンシング
Managed Agents は実行ごとに隔離サンドボックスが立つため、複数実行が同じリポジトリやレコードに同時に触れてもローカルロックが効きません。外部リースとフェンシングトークンで単一実行を保証する実装をまとめました。
高度な活用2026-08-09
記憶が消えたのではなく、別のプロファイルに書かれていました — Memory profiles のスコープキーを実測で正す
Memory Bank のプロファイルはスキーマとスコープの組で一意になります。呼び出し側でスコープの形がわずかにぶれると、エラーを出さないまま別のプロファイルが増えていきます。分裂の量と、3種類の対処の効き目を同じ条件で測った記録です。
高度な活用2026-07-26
セキュリティ特化モデルを個人開発の監査に組み込む — 抽出層と、再提出されない指摘の指紋設計
外向きリクエストのシンクを AST で抽出し、モデルの指摘を再現可否だけで採用する三層のセキュリティ監査設計を解説します。指摘の重複を防ぐ指紋方式は4種類を実測し、粗い指紋が安全な実装まで巻き込んでしまう衝突の再現例も含めて丁寧に整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →