「Amazon Bedrock AgentCore」を試す ④Built-in Tools: Browser
前回の続き。今回はBuilt-in Toolsのもう一つ、Browser。
Bedrock AgentCore Browser
referred from https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/browser-tool.html and rewritten and translatesd into Japapnese by kun432
Dia によるまとめ。
Amazon Bedrock AgentCore Browserってやつは、AIエージェントがウェブサイトを安全に操作できるクラウド上のブラウザなんだよ。今はプレビュー版だから、これから変わるかもだけど、超便利そう!
ざっくり言うと…
- このブラウザは自分のパソコンじゃなくて、クラウド(ネットの向こう側)で動くから、ウイルスとか変な影響を受けにくいし、セキュリティもバッチリだし。
- 使うたびに新しい環境が用意されて、終わったら全部リセットされるから、情報が残らなくて安心。
- セッション(使ってる時間)が終わったら自動で切れるし、途中でやめてもOK。
何ができるの?
- AIが人間みたいにウェブサイトを見たり、ボタン押したり、フォームに入力したりできる!
- サーバーとか用意しなくても、勝手にスケールしてくれるから、インフラの心配いらない。
- スクショ(画面の写真)を撮って、AIが「今どんな画面か」ってのも理解できる。
- 人間が途中で操作を見たり、手伝ったりもできるんだって。ウケる!
- それぞれのセッションが完全に分かれてるから、他の人や他の作業に影響しない。
- どんな操作をしたか、リアルタイムで見たり、後から記録をチェックしたりもできる。
どうやって使うの?
- まず「ブラウザツール」を作る。これでAIがウェブを操作できるようになる。
- そのツールのID(ARN)をエージェントのプログラムに組み込む。これでリアルタイムにウェブを操作できる!
- 使った後は、CloudWatchってやつでどんな動きをしたか、パフォーマンスをチェックできる。
セキュリティも超大事!
- ブラウザはクラウドの中で動くから、自分のパソコンには影響なし。
- 使い終わったら全部リセットされるし、セッションも時間が来たら自動で終了。
- 何かあっても、全部記録が残るから安心。
まとめ
要するに、「AIが人間みたいにウェブを操作できる超安全なクラウドブラウザ」って感じ!マジで未来っぽくてテンション上がるでしょ!
Getting Started
Getting Startedは、AgentCoreのサンプルが集められたレポジトリのサンプルコードを使うようになっているみたい。
用意されているサンプルコードはざっくり以下のようなディレクトリ構成みたい
-
01-browser-with-NovaAct
- LLM に Amazon Nova Act、エージェントフレームワークに Nova Act SDKを使用したサンプルのノートブック
- 基本的な使い方と、ブラウザ操作のライブビューの2つのノートブックがある
-
02-browser-with-browserUse
- LLM に Anthropic Claude 3.5 Sonnet(Bedrock)、エージェントフレームワークに Browser Use SDK を使用したサンプルのノートブック
- 基本的な使い方と、ブラウザ操作のライブビューの2つのノートブックがある
-
interactive_tools
- LLM に Anthropic Claude 3.5 Sonnet(Bedrock)、エージェントフレームワークに LangGraph を使用したサンプルのアプリ
- LangGraphでリサーチエージェントでオンラインショッピングのリピート率を高める要因を調査する、というもの。Code Interpreterなども与えつつ、ブラウザ操作のライブビュー表示にも対応している。
ブラウザ自動化については、自分はAnthropic Computer-useが出たあたりで少し止まっていて、Nova ActとかBrowser Useも過去試したことがない。
interactive_tools
のサンプルも、LangGraphも過去ちょろっと試してただけ、あとサンプルコード見ると結構いろいろ盛り込んであるという感じ。
シンプル・ミニマムに試すには正直どこから進めるべきなのか・・・というところ。
とりあえず、
- Nova Act、というかNovaは全般的に日本語対応がまだ十分ではなさそう(Xで検索)
- LangGraphを使ったアプリのサンプルより、ノートブックのほうがシンプルに試せそう
ということで、Browser Useのサンプルでやってみることにした。Browser Useもパッと見はシンプルに使えそうだし、そのうち単体でも試してみたい。
サンプルのレポジトリをクローン。
git clone https://github.com/awslabs/amazon-bedrock-agentcore-samples && cd amazon-bedrock-agentcore-samples
Python 仮想環境を作成
uv init -p 3.12
パッケージをインストール。このサンプルレポジトリで共通のパッケージがインストールされる。pipはノートブック内で使用されているのでインストールした。
uv add -r requirements.txt
uv add pip
JupyterLabもインストール済みなので、起動
uv run jupyter-lab --ip="0.0.0.0" --NotebookApp.token="" --allow-root
あとは、Browser Useを使ったサンプルのディレクトリに移動して、それぞれのノートブックを開いて試せば良い。
01-tutorials/05-AgentCore-tools/02-Agent-Core-browser-tool/02-browser-with-browserUse/
Basic Browser tool usage with Browser-Use SDK
getting_started-agentcore-browser-tool-with-browser-use.ipynb
の方から。
まず依存パッケージのインストール。Browser Useがインストールされる。
!pip install -r requirements.txt
モジュールインポートして、richのコンソール出力を有効化。
from bedrock_agentcore.tools.browser_client import BrowserClient
from browser_use import Agent
from browser_use.browser.session import BrowserSession
from browser_use.browser import BrowserProfile
from langchain_aws import ChatBedrockConverse
from rich.console import Console
from contextlib import suppress
import asyncio
console = Console()
ブラウザクライアントをセットアップ。これでAgentCore BrowserにアクセスするためのWebSocketのURLと、接続に必要なクレデンシャルを含むヘッダが返される。
from boto3.session import Session
# 自分はデフォルトプロファイルだとap-northeast-1になるため、us-east-1を指定している。
boto_session = Session(region_name='us-east-1')
region = boto_session.region_name
client = BrowserClient(region)
client.start()
# WebSocket URLとヘッダを抽出
ws_url, headers = client.generate_ws_headers()
INFO [botocore.credentials] Found credentials in shared credentials file: ~/.aws/credentials
INFO [bedrock_agentcore.tools.browser_client] Starting browser session...
INFO [bedrock_agentcore.tools.browser_client] Generating websocket headers...
INFO [botocore.credentials] Found credentials in shared credentials file: ~/.aws/credentials
マネージメントコンソールを見てみる。
どうやらCode Interpreterと同じで、こちらもデフォルトのマネージドなBrowserリソースが作成されている様子。そして、ブラウザクライアントのセッションもすでに作成されている?
この "View Live Session" というのをクリックしてみると、
こんな感じで実際のブラウザ画面を確認できる様子。メッセージを見る限り、操作をここから横取りもできるっぽい。
ではノートブックに戻る。
ブラウザを使ったタスクを実行するためのヘルパー関数を用意
async def run_browser_task(browser_session: BrowserSession, bedrock_chat: ChatBedrockConverse, task: str) -> None:
"""
browser_useを使用して、ブラウザの自動化タスクを実行する
Args:
browser_session: 再利用する既存のブラウザ セッション
bedrock_chat: Bedrockチャットモデルのインスタンス
task: エージェントに与える自然言語のタスク
"""
try:
# タスク実行を出力
console.print(f"\n[bold blue]🤖 タスク実行:[/bold blue] {task}")
# エージェントを作成して実行
agent = Agent(
task=task,
llm=bedrock_chat,
browser_session=browser_session
)
# 進捗を表示しながら実行
with console.status("[bold green]ブラウザ自動処理を実行中...[/bold green]", spinner="dots"):
await agent.run()
console.print("[bold green]✅ タスクは正常に完了しました![/bold green]")
except Exception as e:
console.print(f"[bold red]❌ タスク実行中にエラーが発生しました:[/bold red] {str(e)}")
import traceback
if console.is_terminal:
traceback.print_exc()
タスクの実行。ブラウザクライアントを初期化した際に生成されたWebSocket URLにアクセスして、タスクを実行するという流れみたい。タスク間でもブラウザセッションを維持できる様子。
# ブラウザセッションとモデルを永続化するために作成
browser_session = None
bedrock_chat = None
try:
# ヘッダーからブラウザプロファイルを作成
browser_profile = BrowserProfile(
headers=headers,
timeout=1500000, # 150秒でタイムアウト
)
# CDP URLと、永続化のための keep_alive=True を指定して、ブラウザセッションを作成
browser_session = BrowserSession(
cdp_url=ws_url,
browser_profile=browser_profile,
keep_alive=True # タスク間でブラウザを永続化させる
)
# ブラウザセッションを初期化
console.print("[cyan]🔄 ブラウザセッションを初期化中...[/cyan]")
await browser_session.start()
# ChatBedrockConverseを一度だけ作成
bedrock_chat = ChatBedrockConverse(
model_id="us.anthropic.claude-sonnet-4-20250514-v1:0",
region_name="us-east-1"
)
console.print("[green]✅ ブウラウザセッションが初期化され、タスクを実行できる準備が完了しました[/green]\n")
task = "amazon.co.jp でコーヒーメーカーを検索し、最初の商品の詳細を抽出してください。" ## 他のタスクを実行する場合は修正
await run_browser_task(browser_session, bedrock_chat, task)
finally:
# ブラウザセッションをクローズ
if browser_session:
console.print("\n[yellow]🔌 ブラウザセッションをクローズ中...[/yellow]")
with suppress(Exception):
await browser_session.close()
console.print("[green]✅ ブラウザセッションがクローズされました[/green]")
これを実行すると多くの出力が表示されるのだが、一部だけ抜粋。雰囲気だけはわかると思う。
🔄 ブラウザセッションを初期化中...
(snip)
✅ ブウラウザセッションが初期化され、タスクを実行できる準備が完了しました
(snip)
🤖 タスク実行: amazon.co.jp でコーヒーメーカーを検索し、最初の商品の詳細を抽出してください。
(snip)
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 🚀 Starting task: amazon.co.jp でコーヒーメーカーを検索し、最初の商品の詳細を抽出してください。
(snip)
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 💡 Thinking:
ユーザーリクエストを分析すると、amazon.co.jpでコーヒーメーカーを検索し、最初の商品の詳細を抽出する必要があります。これは複数のステップを含むタスクです:
1. Amazon.co.jpにアクセス
2. コーヒーメーカーを検索
3. 最初の商品をクリック
4. 商品詳細を抽出
5. 結果をファイルに保存
現在の状態:Chromeの新しいタブページにいます。検索バーが表示されており、Amazon.co.jpに直接アクセスできます。
まず、このマルチステップタスクのためにtodo.mdファイルでプランを作成し、その後amazon.co.jpに移動します。これは最初のステップなので、前の目標は存在しません。
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] ❔ Eval: 初回ステップのため、評価する前の目標はありません。
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 🧠 Memory: Amazon.co.jpでコーヒーメーカー検索タスクを開始。現在新しいタブページにいて、Amazon.co.jpに移動する必要があります。
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 🎯 Next goal: タスクの進行状況を追跡するためにtodo.mdファイルを作成し、その後amazon.co.jpに移動します。
(snip)
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 💡 Thinking:
現在の状況を分析します:
1. Agent Historyから:
- ステップ1でtodo.mdファイルが正常に作成されました
- ステップ2でAPI呼び出しが失敗しました(レート制限)
- 現在はステップ3で、Chromeの新しいタブページにいます
2. Browser Stateから:
- 現在chrome://new-tab-page/にいます
- Googleの検索バーが利用可能(index 0)
- 他にもショートカットやカスタマイズボタンがあります
3. File Systemから:
- todo.mdには6つのタスクが記載されており、まだ全て未完了です
- results.mdは空のファイルです
4. 前回のアクションの評価:
- 前回のアクションはAPI呼び出し失敗でした
- これは成功でも失敗でもなく、システムエラーです
次に何をするべきか:
- todo.mdの最初のタスク「Amazon.co.jpにアクセス」を実行する必要があります
- 現在新しいタブページにいるので、Amazon.co.jpに直接移動するのが最適です
- go_to_url アクションを使ってAmazon.co.jpに移動します
(snip)
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] ❔ Eval: 前回のアクションはAPI呼び出しの失敗(レート制限)でした。システムエラーのため、成功/失敗の判定は不適用です。
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 🧠 Memory: 現在Chromeの新しいタブページにいます。todo.mdファイルは正常に作成されており、Amazon.co.jpでコーヒーメーカー検索のタスクが6つのステップに分かれて記載されています。次はAmazon.co.jpにアクセスする必要があります。
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 🎯 Next goal: Amazon.co.jpにアクセスしてコーヒーメーカー検索タスクの最初のステップを完了します。
(snip)
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 💡 Thinking:
エージェントヒストリーを見ると、前のステップでAmazon.co.jpに正常にナビゲートできました(Step 3で成功)。現在Amazon.co.jpのページにいることが確認できます。
ブラウザ状態を分析すると:
- 現在のURL:https://www.amazon.co.jp/
- インタラクティブ要素が4つ見えています:[0]から[3]まで
- ページ内容がエンコードの問題で文字化けしているようですが、スクリーンショットを見るとAmazonのページが正常に表示されています
- スクリーンショットから検索バーが見えており、上部にAmazonのロゴとナビゲーションが確認できます
todo.mdファイルの進捗を確認すると:
- Amazon.co.jpにアクセス:完了
- 次のタスクはコーヒーメーカーを検索すること
現在のページで検索バーを見つける必要があります。しかし、インタラクティブ要素のリストでは検索バーが明確に見えていません。スクリーンショットを見ると検索バーがありそうですが、現在の要素リストには検索用のinput要素が見当たりません。
ページが完全にロードされていない可能性があるため、まずページを少し待機してから、アクセシビリティツリーを取得してより多くの要素を確認する必要があります。
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] ❔ Eval: Amazon.co.jpへのアクセスは成功しました。ページが正常に表示されています。
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 🧠 Memory: Amazon.co.jpに正常にアクセスしました。現在Amazonのメインページにいますが、検索バーなどの主要な要素がインタラクティブ要素リストに表示されていません。ページの完全なロードを待つ必要があります。
INFO [browser_use.Agent🅰 6c51 on 🆂 c8bb.16] 🎯 Next goal: ページが完全にロードされるまで待機し、その後検索バーを特定してコーヒーメーカーの検索を実行します。
(snip)
どうも上手くページがレンダリングされなかったせいなのか、最終的にはタイムアウトが先にきて上手くいかなかったのだが、ライブビューを見るといろいろブラウザ操作を試行錯誤している様子が見えた。
最後にクライアントをクローズ。
client.stop()
print("ブラウザセッションは正常に停止しました!")
マネージメントコンソール側のセッションも終了していた。
なお、ライブビューへのアクセスは(少なくともデフォルトでは)1接続のみのようで、複数のタブからアクセスするとエラーになった。
Live-view browser tool with Browser-Use SDK
agentcore-browser-tool-live-view-with-browser-use.ipynb
の方も基本的にやってることは同じっぽいが、先程はマネージメントコンソールから確認していたライブビューを、Amazon DCV SDKを使ってリモートデスクトップ的にアクセスする、という部分が追加されたもののように思える。
Amazon DCV、全然知らなかった。
Amazon DCV は、さまざまなネットワーク条件下で、クラウドやデータセンターからデバイスにリモートデスクトップとアプリケーションストリーミングを配信するセキュアな方法を提供する高性能のリモートディスプレイプロトコルです。NICE DCV と Amazon EC2 を使用することで、グラフィックを多用するアプリケーションを EC2 インスタンスでリモート実行を行い、ユーザーインターフェイスをよりシンプルなクライアントマシンにストリーミングできるため、高価な専用ワークステーションが不要になります。 幅広い HPC ワークロードをお持ちのお客様は、リモート視覚化要件のために Amazon DCV を使用しています。Amazon DCV ストリーミングプロトコルは、Amazon Appstream 2.0、AWS Nimble Studio、AWS RoboMakerなどの一般的なサービスでも利用しています。
なるほど・・・
AgentCoreの本質ではないのでここはスキップ。
ブラウザエージェントを作成する
上の例ではBrowser Useが提供するエージェントモジュールを使用していたが、他にも
- Nova Act
- Strands Agents
- ブラウザアクセス部分については、Nova Act SDKを使ったツールとして実装
- Strandsのエージェントはこのツールを使うという流れになっている
- Playwright
- Playwrightのインタフェースで直接ページへのアクセスをコードで定義している。
の例がある。
エージェントではないけども、流れが一番シンプルでわかり易いのはPlaywrightの例だと思うので、少し試してみる。ただしこのコードは、サンプルレポジトリにあるヘルパークラスBrowserViewerServer
に依存していて、このクラスは非同期前提で書かれていないのでノートブック環境では動かないっぽい。ターミナルから直接実行。
クローンしたレポジトリの以下にいることを確認。
01-tutorials/05-AgentCore-tools/02-Agent-Core-browser-tool/02-browser-with-browserUse/
from playwright.sync_api import sync_playwright, Playwright, BrowserType
from bedrock_agentcore.tools.browser_client import browser_session
import time
import sys
# ここにヘルパーBrowserViewerServerが用意されている
sys.path.append("../interactive_tools")
from browser_viewer import BrowserViewerServer
def run(playwright: Playwright):
# ブラウザセッションを作成して永続化する
with browser_session('us-east-1') as client:
ws_url, headers = client.generate_ws_headers()
# ビューワーサーバを起動
viewer = BrowserViewerServer(client, port=8005)
viewer_url = viewer.start(open_browser=True)
# ヘッダを使って接続
chromium: BrowserType = playwright.chromium
browser = chromium.connect_over_cdp(
ws_url,
headers=headers
)
context = browser.contexts[0]
page = context.pages[0]
try:
page.goto("https://www.amazon.co.jp/")
print(page.title())
time.sleep(120)
finally:
page.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
実行
uv run browser_agent_with_playwright.py
ブラウザが立ち上がって以下のような画面が表示される。文字化けして正しく表示されてなかったり、右下に少しエラーがでているけども、一応はアクセスできているみたい。
コンソールの出力を見るとページタイトルが表示されているのがわかる。
✅ DCV SDK found (1,938,365 bytes)
✅ Viewer server running at: http://localhost:8005
Check browser console (F12) for detailed debug information
Opening browser...
Generated presigned URL:
https://bedrock-agentcore.us-east-1.amazonaws.com/browser-streams/aws.browser.v1/sessions/01K1QMFJBJSV7C4VEWAWW3M26V/live
-view?XXXXXXXXXXXXXXXXXXXX
Amazon.co.jp
Playwrightなので直接コードでアクセスしているが、LLMを使ったエージェントの場合はここをエージェントが操作する感じになるということね。
リソースの管理
Code Interpreterと同様にBrowserにも2種類のリソースが用意されている。
種類 | システムARN | カスタムARN) |
---|---|---|
作成者 | AWSが最初から用意 | ユーザーが自分で作成 |
設定 | デフォルト・最も厳しい | ネットワークやセキュリティなど自由に設定可 |
状態 | READY(すぐ使える) | リソースを作成・設定してから使う |
カスタマイズ性 | 低い(ほぼ変更不可) | 高い(自分好みにカスタムできる) |
ユースケース | 標準的な用途・とりあえず試したいとき | 特別な要件や細かい制御が必要なとき |
Browserの場合、ネットワーク設定はパブリックのみ。カスタムARNの場合は以下が設定できる様子。
- レコーディング設定: S3に操作履歴を保存できるみたい
- パーミッション
よって、カスタムARNの場合にはIAMロールの設定が必要になり、以下に設定例が載っている。
セッションの管理
セッションの特徴
- セッションタイムアウト
- デフォルトは15分(900秒)
- セッション作成時に最長8時間まで延長可能
- セッションの記録
- ブラウザの操作履歴をS3に保存可能
- ネットワークのやりとりやコンソールのログも全て記録される
- ライブビュー
- セッション中のブラウザ操作の様子をリアルタイムで見れる
- URLは
/browser-streams/aws.browser.v1/sessions/{session_id}/live-view
となる
- 自動終了
- 設定した時間が過ぎたら、セッションは自動で終了する。
- 複数セッション
- 1つのBrowserで、最大500の同時セッションを動かせる。
- それぞれのセッションは独立しており、状態やデータも別々になる
- データ保持ポリシー
- セッションデータの保持期間(TTL)は30日間。
セッションの隔離(アイソレーション)
- 各セッションは専用の「マイクロVM」といういう小さな仮想マシンで動いてる。
- CPU、メモリ、ファイルシステムも全部分かれており、他のユーザーのデータにはアクセスできない。
- セッションが終わったら、そのマイクロVMは完全に消去されて、データも全部消える。
- 他のセッションとデータが混ざったり漏れたりする心配はない
その他、ドキュメントには、
- リソース・セッションの細かい操作
- AWS CLI / Boto3 / API それぞれでの例や、APIリファレンスがある。
- Browserのユースケース例と、いくつかコードサンプルがある
- 自動でショッピングを行う例
- ブラウザ自動化中に制御を奪う例
- AWS DCV Webクライアントを使ったライブビューについての例
があるので参考までに。
次はGateway。
余談。
AgentCore Browserは、以下のようなサービスの競合と言えるのではなかろうか?