🤖

Amazon Bedrock AgentCore Browser Tool ✖ ︎Claudeでブラウザ自動操作 〜破産街道一直線!?〜

に公開

AWS Ambassadorの積田です。

2025年10月にAmazon Bedrock AgentCoreがめでたくGAになりましたね。
AWS公式参考: Make agents a reality with Amazon Bedrock AgentCore: Now generally available

AgentCoreで提供されている機能の1つにBrowser Toolがあります。
Browser ToolはAgentが利用可能なマネージドなChrome Browserを提供してくれます。

今回はBrowser ToolとLLMを組み合わせて自然言語でブラウザ自動操作をしようと思ったら破産しかけたお話です。

サマリ

  • 簡単なシナリオ実施で80円弱のコストが発生した。実行時間は2分弱だった
  • 自然言語でブラウザを操作するのは便利だが、賢いモデルでないと意図した操作とならない場合が多い
    • 特にモダンなサイトだとHTMLの情報量が多くなりがちなので、完遂できなかったりコストが爆増しやすい
  • 定型的なフローに落とし込める操作はPlaywright/Seleniumなどの非LLMツールを利用するのが良い
    Playwrightで実装してみた記事はこちら: Amazon Bedrock AgentCore Browser Tool ✖ ︎ClaudeでPlaywrightのコードを生成しよう

検証環境

  • 利用モデル: Claude Sonnet 4.5
  • 利用リージョン: us-west-2
  • 言語: Python 3.13.7
  • フレームワーク: Strands Agents

シナリオ

今回は3stepの簡単なシナリオを用いて検証を実施します。

  1. SimpleToDoアプリにアクセスする
    ※ 今回の検証のために作りました
    image
  2. MAIL, PASSを入力してSign Inする
    image
  3. 一番上のToDoにコメントをする
    image

検証用コード

検証に利用したコードは以下です。利用パッケージはuvなどで適宜インストールしてください。検証時はvenv+uvを利用してパッケージ管理をしました。
また、username, passwordはexport SIMPLE_LOGIN_USER=<PASSWORD>のような形でスクリプト実行前に環境変数に設定してあります。

from strands import Agent
from strands.models import BedrockModel
from strands_tools.browser import AgentCoreBrowser
import os

# AgentCore Browser ツールを初期化(us-west-2 リージョンを使用)
browser_tool = AgentCoreBrowser(region="us-west-2")

# Claude Sonnet 4.5 をグローバルエンドポイント(Cross-Region Inference)で明示的に指定
bedrock_model = BedrockModel(
    model_id="global.anthropic.claude-sonnet-4-5-20250929-v1:0", region_name="us-west-2"
)

# Browser ツールとモデルを指定してエージェントを作成
agent = Agent(
    model=bedrock_model,
    tools=[browser_tool.browser]
)

# 環境変数からログイン情報を取得
username = os.environ.get("SIMPLE_LOGIN_USER")
password = os.environ.get("SIMPLE_LOGIN_PASS")

if not username or not password:
    raise ValueError("環境変数USERとPASSを設定してください")

# 指定された URL にアクセスしてログインするプロンプト
prompt = f"""https://d3ukli4ddc6u90.cloudfront.net/ にアクセスして、以下の情報でログインしてください。
ユーザー名: {username}
パスワード: {password}

ログイン後、一番上のToDoにコメントを追加してください。
"""

# エージェントを実行
response = agent(prompt)

# レスポンスを表示
print("\nエージェントのレスポンス:")
print(response)

# Access metrics through the AgentResult
print(f"Total  tokens: {response.metrics.accumulated_usage['totalTokens']}")
print(f"Input  tokens: {response.metrics.accumulated_usage['inputTokens']}")
print(f"Output tokens: {response.metrics.accumulated_usage['outputTokens']}")
print(f"Execution time: {sum(response.metrics.cycle_durations):.2f} seconds")
print(f"Tools used: {list(response.metrics.tool_metrics.keys())}")

実行結果

実行時間を計測するためにtimeコマンドを利用しています。
今回の検証ではツール実行19回、総利用トークン156,349、コスト80円弱、実行時間2分弱でした。

$ time python browser_access.py
ご依頼の通り、ウェブサイトにアクセスしてログインし、ToDoにコメントを追加します。

まず、ブラウザセッションを開始してサイトにアクセスします。
Tool #1: browser

Tool #2: browser
次に、ページの状態を確認するためスクリーンショットを撮ります。
Tool #3: browser
ページのHTMLを確認して、ログインフォームの要素を特定します。
Tool #4: browser
ログインフォームが表示されています。ユーザー名とパスワードを入力してログインします。
Tool #5: browser

Tool #6: browser

Tool #7: browser
ログイン後の画面を確認します。
Tool #8: browser

Tool #9: browser
ログインに成功しました!一番上のToDoアイテム「Debug Test 1761998688007」にコメントを追加するため、コメントボタンをクリックします。
Tool #10: browser

Tool #11: browser

Tool #12: browser
もう少し詳細に見るため、ページ全体を確認します。
Tool #13: browser
完璧です!コメントモーダルが開きました。既に3つのコメントが表示されています。新しいコメントを追加するため、入力フィールドにテキストを入力します。
Tool #14: browser

Tool #15: browser

Tool #16: browser
コメントが追加されたか確認します。
Tool #17: browser
素晴らしい!コメントの追加に成功しました。最後にモーダルを閉じて完了します。
Tool #18: browser

Tool #19: browser
完了しました!以下の作業を正常に実行しました:

1. ✅ https://d3ukli4ddc6u90.cloudfront.net/ にアクセス
2. ✅ ユーザー名「<SIMPLE_LOGIN_USER>」とパスワード「<SIMPLE_LOGIN_PASS>」でログイン
3. ✅ 一番上のToDoアイテム「Debug Test 1761998688007」のコメントボタンをクリック
4. ✅ 「新しいコメントを追加しました。」というコメントを追加

コメントは正常に追加され、コメントリストに「11/3/2025, 3:29:51 AM」のタイムスタンプで表示されています。
エージェントのレスポンス:
完了しました!以下の作業を正常に実行しました:

1. ✅ https://d3ukli4ddc6u90.cloudfront.net/ にアクセス
2. ✅ ユーザー名「<SIMPLE_LOGIN_USER>」とパスワード「<SIMPLE_LOGIN_PASS>」でログイン
3. ✅ 一番上のToDoアイテム「Debug Test 1761998688007」のコメントボタンをクリック
4. ✅ 「新しいコメントを追加しました。」というコメントを追加

コメントは正常に追加され、コメントリストに「11/3/2025, 3:29:51 AM」のタイムスタンプで表示されています。

Total  tokens: 156349
Input  tokens: 154209
Output tokens: 2140
Execution time: 6.03 seconds
Tools used: ['browser']
python3 browser_access.py  1.40s user 0.36s system 1% cpu 1:47.23 total

検証用コード実行後にSimpleToDoを見てみるとコメントが追加されているのが確認できました。
image

安価なモデルだとコストは安くなる?

コスト単体で見たら安くなります。
今回はシンプルなページを操作するシナリオだったため、Claude Haiku 4.5でも完遂可能でしたが、Browser Toolで自動操作させたくなるようなページ(業務アプリなど)を操作すると完遂できないことがあります。
ちなみに今回のシナリオをClaude Haiku 4.5で実施したところ、ツール実行22回、総利用トークン187,605、コスト30円強、実行時間1分半弱でした。

終わりに

今回はシンプルなシナリオでしたが、業務自動化を狙ってBrowser ToolとLLMを組み合わせて自然言語でブラウザ自動操作をするとコストが爆増することが想像できたでしょうか?
LLMは有能でどこにでも利用されがちですが、適切に利用しないと破産街道一直線です。定型的なフローに落とし込める操作はPlaywright/Seleniumなどのツールを利用するのが良いです。
Playwrightで実装してみた記事はこちら: Amazon Bedrock AgentCore Browser Tool ✖ ︎ClaudeでPlaywrightのコードを生成しよう

今回の記事を読んでくださった方の助けになれば幸いです。

Discussion