Browser Use、AWS Bedrock AgentCore を活用したセキュアなエージェント基盤の構築方法を公開
本文の状態
日本語全文を表示中
詳細モードで約11分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
Browser Use Blog
従来のサンドボックス手法の基盤は維持しつつ、マイクロ VM のプロビジョニングとスケジューリングを AWS Bedrock AgentCore に委譲し、セッションごとの永続ワークスペースマウントを実現した。
AI深層分析を開く2026年8月4日 12:43
AI深層分析
キーポイント
AWS Bedrock AgentCore の活用によるランタイム変更
従来のサンドボックス手法の基盤は維持しつつ、マイクロ VM のプロビジョニングとスケジューリングを AWS Bedrock AgentCore に委譲し、セッションごとの永続ワークスペースマウントを実現した。
厳格なネットワーク分離と権限最小化
VM はプライベート VPC 内に配置され、ECR からのイメージ取得と CloudWatch へのログ書き込みのみを許可し、S3 やデータベースへの直接アクセスは完全に遮断されている。
機密情報の非埋め込みとセッションスコープ化
VM イメージにシークレットを埋め込まず、実行ロールの URL のみを持ち、セッショントークンや ID はリクエストペイロードを通じて動的に提供し、VM 上に永続的な機密情報を残さない。
セッション間の完全な隔離
各セッションが個別のマイクロ VM とセッション ID にスコープされた /mnt/workspace マウントを持つことで、他セッションからのデータ閲覧や干渉を物理的に防止している。
AWS ネイティブなスタックによる統合とセキュリティ
ランタイムはECSやRDSと同じAWSネイティブ環境で動作し、IAMスコープのロールや標準的なVPCネットワークを通じて厳格に制御される。各セッションには1GBの孤立したワークスペースがマウントされ、停止・再開時にデータが保持される。
重要な引用
The abstraction is still what protects the fleet.
It cannot reach S3, the database, or any other AWS API on its own.
Nothing sensitive persists on the VM between runs.
The rest of our stack is AWS-native (ECS, RDS, S3, IAM, etc). Running the sandbox on AgentCore means the runtime layer belongs to the same world.
編集コメントを表示
編集コメント
この技術記事は、大規模な AI エージェント運用におけるセキュリティとスケーラビリティのバランスを、具体的な AWS サービスの活用を通じて示した実用的な事例である。特に「機密情報を VM に残さない」という設計思想は、信頼性の高いエージェント基盤構築において重要な指針となる。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
TL;DR
この投稿の要約をエージェントに直接聞いてみてください。Browser Use では、本番環境で数百万もの信頼できない AI エージェントを実行しています。各エージェントはプライベートなマイクロ VM 内で動作し、認証情報は一切保持しません。すべての外部通信は管理プレーンを経由し、需要に応じて自動的にスケールします。
アーキテクチャについて
6 ヶ月前に、「信頼できないエージェントをサンドボックス化する方法」について記事を書きました。その手法では、シークレット情報を一切持たないマイクロ VM を使用し、すべての認証情報は管理プレーンが一元管理する一方、全環境で共通の 1 つのイメージを実行していました。この抽象化レイヤーこそが、現在もファーム全体を保護しています。
しかし、その背後にあるランタイムは変化しました。現在は AWS Bedrock AgentCore がセッションごとのマイクロ VM をプロビジョニングし、スケジューリングしています。各 VM には、そのセッションに限定された永続的な /mnt/workspace マウントポイントが用意されています。

エージェントの認証情報を安全に守るサンドボックス
この VM はプライベートな VPC 内に配置されており、実行ロールは ECR からイメージをプルして CloudWatch にログを書き込む権限のみを持っています。VM 単体では S3 やデータベース、その他の AWS API にはアクセスできません。外部通信(エグレス)は管理プレーンとパブリック HTTPS のみに許可されています。
VM にも秘密鍵が埋め込まれているわけではありません。ランタイムには制御プレーンの URL のみが保持され、セッショントークン、セッション ID、各実行ごとのフラグなどは、すべてのリクエストで /invocations ペイロード内を通じて提供されます。そのため、VM 上で実行間中に機密情報が永続化されることはありません。
また、各セッションには個別のマイクロ VM が割り当てられ、/mnt/workspace マウントはセッション ID にスコープが限定されています。これにより、セッション間の相互参照を防ぎ、分離を確保しています。
スタック全体でネイティブな AWS 環境
残りのスタックもすべて AWS ネイティブ(ECS、RDS、S3、IAM など)です。サンドボックスを AgentCore で実行することで、ランタイム層が同じエコシステムに属することになります。
ランタイム実行ロールは IAM スコープで管理されます。ランタイムは ECR からイメージをプルし、ECS タスクと同様に CloudWatch へログを書き出します。
標準的な VPC ネットワーキングを採用しています。ランタイムは専用セキュリティグループを持つ VPC 内に配置され、外部からのアクセス(インバウンド)は一切許可していません。エグレスについては、制御プレーンの内部 ALB(LLM プロキシやコールバック用)、ECR および CloudWatch の VPC エンドポイント、そしてブラウザ CDP URL やプレサインド URL に必要なパブリック HTTPS への通信のみをホワイトリスト化しています。
セッションストレージは AgentCore が管理します。各セッションには /mnt/workspace にマウントされる孤立した 1 GB のワークスペースが割り当てられ、停止と再開の間もデータは保持されます。
インフラストラクチャの構築は Terraform で行います。環境ごとに aws_bedrockagentcore_agent_runtime リソースを 1 つ定義し、標準的な実行ロールを設定します。
従量課金。アイドル時の請求はありません。
あなたのエージェントは、実際の認証情報を一切取得しません。

コントロールプレーンをプロキシサービスと捉えてください。サンドボックスには外部世界への直接アクセス権限がありません。すべてのリクエストは必ずコントロールプレーンを経由する必要があります。LLM を呼び出したい場合も、S3 へのファイルアップロードを行いたい場合も、すべてコントロールプレーンを通ります。これがエージェントがその VM 外にある何らかのサービスと通信する唯一の方法です。
これはステートレスな FastAPI サービスです。サンドボックスからのすべてのリクエストにはセッショントークンを格納したヘッダーが含まれています。コントロールプレーンはこのトークンでセッションを検索し、有効期限が切れていないかを確認した上で、実際の認証情報を用いて操作を実行します。
LLM プロキシ機能
エージェントの SDK は通常のプロバイダエンドポイントを呼び出しますが、ベース URL はコントロールプレーンを指すようになります(/api/v4/llm/anthropic/v1、/api/v4/llm/openai/v1 など)。コントロールプレーンはセッショントークンを検証し、これを実際のアップストリーム API キーに置き換えた上で、使用量を計測しながらプロバイダへ転送します。レスポンスも同様の経路で戻ってきますが、その際アップストリームのキーは含まれません。
サンドボックスは実際の API キーを一切見ることなく、プロバイダとも直接通信しません。コスト制限や請求処理は、すべてこの経由経路上で完結します。
エージェント安全なファイルアクセス
各セッションには、AgentCore が管理するセッションストレージをバックアップとする /mnt/workspace 上に、隔離された 1 GB のワークスペースが用意されます。これはセッションごとに独立しており、停止と再開の間もデータは保持され、他のセッションからはアクセスできません。
エージェントがファイルの読み書きを行う際(セッションファイルや共有ファイル、ブラウザでのダウンロードなど)、サンドボックス内で AWS 認証情報を直接使用することはありません。代わりに、制御プレーンに対してそのセッションに限定されたプレサイン付き URL を要求します。
- サンドボックスは、アップロードまたはダウンロード用としてセッションスコープのプレサイン付き URL を制御プレーンにリクエストします。
- 制御プレーンは、自身の S3 認証情報を用いてこの URL を生成します。
- サンドボックスはこの URL を平文の HTTPS で利用してファイル転送を行います。
実行中にエージェントが生成したファイルは、実行完了時に制御プレーンを介して S3 に格納されるため、VM が初期化されてもデータが失われることはありません。
停止と再開でもセッション状態を維持
サンドボックスは使い捨てを前提に設計されていますが、セッションごとの状態の中には再構築にコストがかかるものもあります。Bcode の SQLite データベース(bcode.db)は、永続的な /mnt/workspace マウント上に保存されているため、以下の状況でも状態が保持されます。
- アイドル停止(15 分のアイドルタイムアウト時)
- セッションのリサイクル(8 時間の最大稼働時間到達時)
状態が完全に消去されるのは、ランタイムバージョンのアップグレード時か、セッションが 14 日以上アイドル状態が続いた場合のみです。それ以外のケースでは、制御プレーンが冷たい復旧のための真実情報源となります。永続的なマウントは、温かい再開を低コストで行うためのキャッシュとして機能します。
ゼロから数千の並列エージェントまでスケーラブル
私たちのワークロードはスパイク状です。エージェントの実行クラスタは集中しやすく、短い時間のうちに静かな状態から数千の並行するサンドボックスへ、そして再び静かな状態へと移行することがあります。

このような曲線を描く需要に対して、固定されたリソース群では対応できません。ピーク時に合わせて容量を確保すれば、多くの時間をアイドル状態として余分なコストがかかります。一方で平均値に合わせておけば、スパイク(急増)時にトラフィックが落ちたりキューに滞留したりします。

AgentCore では、各エージェントセッションを独立したプリミティブとして扱います。セッションは必要に応じて起動し、アイドル状態になれば停止します。課金もアクティブなセッション時間のみに対して行われます。容量は需要曲線の上に余剰を持たせるのではなく、需要曲線に追従して変動させます。
制御プレーン(control plane)は独立してスケールします。これは ALB の背後にあるプライベートサブネット上で ECS Fargate 上で稼働し、CPU 使用率に応じて自動スケーリングされます。サンドボックスも AgentCore を通じて独立してスケールします。各セッションには個別の VM が割り当てられ、スケジューリングはすべて AgentCore が担当します。

AgentCore での実行方法
興味のある方のために、AgentCore との統合が実際にはどのようなエンドツーエンドのプロセスになるかを見てみましょう。
セッションは独自のセッション ID にスコープされます(runtimeSessionId = session_id)。つまり、AgentCore のセッション概念と私たちの定義は同一です。1 つのセッション ID が、1 つのウォーム VM と 1 つのワークスペース、そして 1 つのライフサイクルに対応します。
ランタイムは、bedrock-agentcore クライアントに対して実行される boto3 の呼び出しが正確に 2 つだけで構成されています。
# Dispatch a task into an agent session.
client.invoke_agent_runtime(
agentRuntimeArn=RUNTIME_ARN,
runtimeSessionId=session_id,
payload=json.dumps(invocation).encode(),
contentType="application/json",
accept="application/json",
)
# Kill an in-flight session.
client.stop_runtime_session(
agentRuntimeArn=RUNTIME_ARN,
runtimeSessionId=session_id,
)セッションのコンテキストは VM の環境変数ではなく、/invocations ペイロード内に渡されます。同じ VM で実行された 2 つのランでも、それぞれ全く異なるコンテキストを保持することがあり、リクエストが完了した時点でその状態は消去されます。
本番環境で重要となる設定は以下の 2 点です。
- アイドルタイムアウト: 15 分間の非活動状態
- 最大稼働時間: セッションごとの上限として 8 時間
まとめ
サンドボックスに関する投稿で採用したアーキテクチャの前提が、今もなお機能しています。シークレットを一切持たないマイクロ VM と、すべての認証情報を管理するコントロールプレーンという基本構造は変わりません。変化したのは、ランタイム層がネイティブな AWS になった点です。
私たちが目指しているのは以下の通りです。
- 手動で Fleet の規模を決める必要なく、スパイク状の需要曲線に追従できる弾力的なスケーリング
- IAM、VPC、S3、CloudWatch など、下層の AWS サービスがすべて統合されたスタック。クリティカルパス上の外部概念を一つ減らすこと
- 永続的な状態を持ちつつ、独自に認証情報を一切持たないマイクロ VM を、プライベートな VPC 内でセッションごとに隔離して運用すること
元の投稿で示した結論と同じです。エージェントには「盗む価値のあるもの」も「保存する価値のあるもの」もあってはなりません。
このアーキテクチャ上で Browser Use エージェントを実行したいが、自分でホストしたくないという場合は、Browser Use Cloud で提供しています。
原文を表示
TL;DR: just ask your agent to summarize this post for you.
At Browser Use we run millions of untrusted AI agents in production, each in a private micro-VM with zero credentials. Every outbound call passes through a control plane, and the whole thing scales up and down with demand.
The architecture
Six months ago I wrote up how we sandbox untrusted agents: zero-secret micro-VMs, a control plane holding all credentials, one image running everywhere. The abstraction is still what protects the fleet. What changed underneath is the runtime: AWS Bedrock AgentCore now provisions and schedules the per-session micro-VMs, each with a durable /mnt/workspace mount scoped to the session.

A sandbox that keeps your agent's credentials safe
The VM sits in a private VPC with an execution role that can only pull its image from ECR and write logs to CloudWatch. It cannot reach S3, the database, or any other AWS API on its own. Egress is allowlisted to the control plane and to public HTTPS.
There are no secrets baked into the VM either. The runtime holds only a control-plane URL, and everything else (session token, session id, per-run flags) arrives inside the /invocations payload for each request, so nothing sensitive persists on the VM between runs.
Each session also gets its own micro-VM with a /mnt/workspace mount scoped to the session id, so sessions cannot see each other.
Native AWS across the whole stack
The rest of our stack is AWS-native (ECS, RDS, S3, IAM, etc). Running the sandbox on AgentCore means the runtime layer belongs to the same world.
- IAM-scoped runtime execution roles. The runtime pulls its image from ECR and writes logs to CloudWatch using an IAM role, the same way any ECS task does.
- Standard VPC networking. The runtime sits inside our VPC with a dedicated security group. No inbound. Egress allowlisted to the control plane's internal ALB (LLM proxy, callbacks), to VPC endpoints for ECR and CloudWatch, and to public HTTPS for browser CDP URLs and presigned URLs.
- AgentCore-managed session storage. Each session gets an isolated 1 GB workspace mounted at /mnt/workspace, durable across stop/resume.
- Terraform-managed. One aws_bedrockagentcore_agent_runtime resource per environment, plus a standard execution role.
- Pay per use. No idle bill.
Your agent never sees a real credential

Think of the control plane as a proxy service. The sandbox has no direct access to the outside world. Every request has to hop through the control plane. Need to call an LLM? Goes through the control plane. Need to upload a file to S3? Goes through the control plane. It is the only way the agent can talk to anything outside its VM.
It is a stateless FastAPI service. Every request from the sandbox carries a header with a session token. The control plane looks up the session by token, validates that it is still active, and executes the operation with real credentials.
LLM proxying
The agent's SDK calls its normal provider endpoint, except the base URL points at the control plane (/api/v4/llm/anthropic/v1, /api/v4/llm/openai/v1, etc). The control plane validates the session token, swaps it for the real upstream API key, meters usage, and forwards to the provider. The response comes back the same way, minus the upstream key.
The sandbox never sees a real API key or talks to a provider directly, and cost caps and billing happen on the way through.
Agent-safe file access
Every session has an isolated 1 GB workspace at /mnt/workspace, backed by AgentCore's managed session storage. It is per-session, durable across stop/resume, and no other session can see it.
For files the agent needs to move in or out (session files, workspace-shared files, browser downloads), the sandbox never holds AWS credentials. It asks the control plane for a presigned URL scoped to the session:
- Sandbox calls the CP for a presigned URL (upload or download, session-scoped).
- CP generates the URL against its own S3 credentials.
- Sandbox uses the URL over plain HTTPS.
Files the agent generates during a run get promoted to S3 via the control plane at run completion, so a wiped VM never loses them.
Session state survives stop and resume
The sandbox is designed to be disposable, but some per-session state is expensive to rebuild. Bcode's SQLite state (bcode.db) lives on the durable /mnt/workspace mount, so it survives:
- Idle stops (the 15-minute idle timeout).
- Session recycles (the 8-hour max lifetime).
It's only wiped on a runtime version bump or when a session has been idle for 14 days. Below that, the control plane is the cold-recovery source of truth. The durable mount is a cache that makes warm resumes cheap.
Scales from zero to thousands of concurrent agents
Our workload is spiky. Agent runs cluster hard, we can go from a quiet minute to thousands of concurrent sandboxes and back again in a short window.

Against a curve like that, a fixed fleet is the wrong shape. If you size it for peak, you pay for capacity that sits idle most of the time. If you size it for the average, you drop or queue traffic at the spikes.

AgentCore treats each agent session as its own primitive. Sessions boot on demand, stop when idle, and bill only for active session time. Capacity tracks the demand curve instead of sitting above it.
The control plane scales independently. It runs on ECS Fargate in private subnets behind an ALB and auto-scales on CPU. Sandboxes scale independently through AgentCore. Each session gets its own VM, and AgentCore handles the scheduling.

Running it on AgentCore
For the curious, here is what the AgentCore integration actually looks like end-to-end.
Sessions are scoped to our own session id (runtimeSessionId = session_id), so AgentCore's session concept and ours are the same thing. One session id gives us one warm VM, one workspace, and one lifecycle.
The runtime is driven by exactly two boto3 calls against the bedrock-agentcore client:
# Dispatch a task into an agent session.
client.invoke_agent_runtime(
agentRuntimeArn=RUNTIME_ARN,
runtimeSessionId=session_id,
payload=json.dumps(invocation).encode(),
contentType="application/json",
accept="application/json",
)
# Kill an in-flight session.
client.stop_runtime_session(
agentRuntimeArn=RUNTIME_ARN,
runtimeSessionId=session_id,
)Session context arrives inside the /invocations payload, not on the VM's environment. Two runs on the same VM can carry entirely different context, and neither persists after the request returns.
Two settings matter in prod:
- Idle timeout, 15 minutes of no activity.
- Max lifetime, 8 hours. Hard ceiling per session.
The takeaway
The abstraction we bet on in the sandbox post is holding up. Zero-secret micro-VMs and a control plane holding all credentials, that part has not moved. What changed is that the runtime layer is now native AWS too.
For us the case is:
- Elastic scale that tracks a spiky demand curve, without a fleet to size by hand.
- IAM, VPC, S3, CloudWatch stack all the way down. One less foreign concept in the critical path.
- A per-session isolated micro-VM with durable state, sitting in a private VPC with zero credentials of its own.
Same takeaway as the original: your agent should have nothing worth stealing and nothing worth preserving.
If you want to run Browser Use agents on this architecture without hosting it yourself, that is what we ship at Browser Use Cloud.
AI算出
導入事例ainew評価標準
記事は AI エージェント運用におけるセキュリティとスケーラビリティという重要な課題に対し、AWS Bedrock AgentCore を活用した具体的な実装手法(マイクロ VM、認証情報の分離など)を提示しており、AI テクノロジーの応用事例として関連性が高い。しかし、これは特定のベンダー製品を用いた単一企業の導入事例であり、業界全体に新たな事実や規制をもたらす「世界初」の発表ではないため、新規性は中程度となる。また、AWS 製品の紹介であるが日本固有のコンプライアンスや企業事例が含まれていないため、日本関連性は低い。
6つの評価軸を見る
- AI関連度
- 75
- 情報源の信頼性
- 100
- 新規性
- 50
- 調べる価値
- 75
- 重複の少なさ
- 100
- 日本での有用性
- 25
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み