はじめに
Amazon Bedrock AgentCore Browserは、AIエージェントがAPIベースで簡単にブラウザ環境を起動して操作できる素晴らしいビルディングブロックだ。
ただし、LLMからtool_useで起動するためには、自分でツール登録をしたりセッション管理をしなければならず、やや煩雑であるため、こういうトイルはフレームワークを使って解消するのがセオリーだろう。
今回は、Strands Agents Toolsの一つであるBrowser Toolを使って、お手軽にLLMに組み込んでしまおう、という内容だ。
既にAmazon Bedrock AgentCore Runtimeの環境がある前提で話を進めていく。
Amazon Bedrock AgentCore Runtimeの作り方が分からない、という方は、筆者の以前の記事を参考にしていただきたい。この時はまだパブリックプレビューで、Terraformが対応していなかったため無理矢理作っているが、今は正式に対応しているため、もっとお手軽に構築可能だ。
Terraformに追加する内容
構築済みのAmazon Bedrock AgentCore Runtimeに以下を構築していく。
Amazon Bedrock AgentCore Browser
Amazon Bedrock AgentCore Browserの設定は非常に簡単で、以下で作成完了だ。セキュリティ要件に応じてnetwork_configurationは設計していただきたい。
resource "aws_bedrockagentcore_browser" "example" {
name = local.bac_browser_name
description = "Browser for web data extraction"
network_configuration {
network_mode = "PUBLIC"
}
}
IAM権限の追加
最小権限構成の原則に従い、既存のIAMポリシーに以下の権限を追加しておく。
※新規のIAMポリシーを作ってロールにアタッチしても問題ない。
statement {
effect = "Allow"
actions = [
"bedrock-agentcore:ConnectBrowserAutomationStream",
"bedrock-agentcore:GetBrowserSession",
"bedrock-agentcore:StartBrowserSession",
"bedrock-agentcore:StopBrowserSession",
]
resources = [
aws_bedrockagentcore_browser.example.browser_arn,
]
}
Amazon Bedrock AgentCore Runtimeの環境変数の追加
これも、Amazon Bedrock AgentCore Runtimeに対して情報を渡せればよいので、別にAWS Systems Manager Parameter Storeを使っても良いのだが、一番お手軽な情報連携として環境変数を利用する。
resource "aws_bedrockagentcore_agent_runtime" "example" {
# (中略)
environment_variables = {
# (中略)
AWS_BEDROCK_AGENTCORE_BROWSER_ID = aws_bedrockagentcore_browser.example.browser_id
}
# (中略)
}
アプリケーションの修正
アプリケーションでは、Strands AgentsのAgentに渡すtoolを定義する。
と言ってもここはほぼ公式のDeveloper Guideのままだ。
インストールが必要なライブラリについては、pip利用時は上記リンクをみていただければ良いが、uvを使っている場合も同様にuv add で同名ライブラリを指定すれば良い。
from strands_tools.browser import AgentCoreBrowser
browser_instance = AgentCoreBrowser(
region=os.environ.get("AWS_REGION", "ap-northeast-1"),
identifier=os.environ.get(
"AWS_BEDROCK_AGENTCORE_BROWSER_ID",
"aws.browser.v1",
),
)
tools.append(browser_instance.browser)
なお、公式に載っているAPIの利用方法の割には、ドキュメントがほとんどない。
GitHubの関数のコメントにUsageが書いてあるため、読んでおこう。
ブラウザIDを指定しないと、aws.browser.v1にフォールバックされるため、正しくリソース管理をするためにもちゃんと環境変数でブラウザIDを渡すようにしよう。
また、ブラウザセッションのタイムアウト時間は、AWSのAPIでは未指定の場合900秒=15分がデフォルトだが、Strands Agents ToolsのBrowser Toolで未指定時の場合は3600秒に上書きしている。
ともあれ、これで準備は整った。基本的に、toolに一通りの機能が搭載されているので、自分での定義は一切せずともLLMが良い感じに処理をしてくれるようになっているはずだ。
いざ、動かす!
さて、これでチャットボットにツールを組み込んだので、さっそくWikipediaの要約でもさせてみよう。
良い感じに動いていそうだ!
バッチリ最後にセッションのクローズも行ってくれている!
これで、お手軽にLLMにブラウザ利用のツールを組み込めるようになったぞ!
……と言ってこの記事は円満に終わるはずだった。
問題発生: ブラウザセッションが消えない
この章はあまり意味がないので、読み飛ばして「解決編」を読んでいただくのが良いと思う。
処理が無事に終わったので、最後にゴミが残っていないかコンソールで確認したところ、以下の状態から待てど暮らせど状態が変わらない。
試しにAWS CLIでstop-browser-sessionを使って該当のセッションIDに向けて実行してみたところ、ちゃんとTerminatedの状態になった。
1時間待ってみたところ、Terminatedの状態になったため、タイムアウトを迎えて停止したようだ。
あやしいのでログレベルを変更して確認したところ、Strands Agents Toolsのログでは正常終了したと出力されているが、そこから読んでいるAmazon Bedrock AgentCoreのSDKの以下のログが出ていない。
そもそもこのログを出力する関数が呼ばれていないと思い、追加のログを仕込んで調べたところ、Strands Agents ToolsのBrowser Toolsのクライアント管理に問題があるように見える。
解決編
結論としてはおそらくバグっていると考えている。
この51行目の後に
self._client_dict[session_id] = session_client
を追加したら、ちゃんと然るべきタイミング=つまりLLMがclose操作した契機でブラウザセッションが削除された。
既にIssueは作られているようなので、基本的には改修を待った方が良いが、すぐにちゃんとキレイな使い方をしたい場合は、上記の修正したファイルを、Dockerfileに以下のように追記して、ダウンロードしてきたものを上書きしよう。
# Temporary Fix
COPY tmp/agent_core_browser.py /app/.venv/lib64/python3.12/site-packages/strands_tools/browser/agent_core_browser.py
COPYのパスは皆さんのビルド環境に合わせていただきたい。uv syncの後に、上記のように上書きすれば、改修が完了だ。ちなみに、Strands Agents Toolsのバージョンは以下のように定義している。
[project]
# 中略
dependencies = [
# (中略)
"strands-agents-tools>=0.2.18",
# (中略)
]
これで、今度こそ、お手軽にLLMにブラウザ利用のツールを組み込めるようになったぞ!
※あまりお手軽じゃないけど……



