ブログ

AWS製のOSS SDK「Strands Agents」で始めるAIエージェント開発

 皆さん、AIエージェント開発は進んでいますか?
今年は「AIエージェント元年」と言われているそうです。とはいえ、「AIエージェント開発は難しそう…」と感じている方も多いのではないでしょうか。

そんな中、AWSから登場したオープンソースのAIエージェントSDK「Strands Agents」が、その常識を覆してくれます。なんと最小3行のコードでAIエージェントが動き出す手軽さです。

この記事では、Strands Agentsを使ったAIエージェントの実装を、実際に手を動かして検証した内容を記載いたします。

StrandsAgentsとは

 Strands Agentsは、2025年5月16日にAWSから公開された、オープンソースのAIエージェントSDKです。AWSが開発を主導しており、Pythonを使ってAIエージェントを簡単かつ迅速に構築できることを特徴としています。

 名前の由来は「より糸(Strand)」から来ているらしく、LLMという「モデル」と、外部連携機能である「ツール」という2本の糸をシンプルに組み合わせる、という設計思想を表しているそうです。

 LLMの性能が向上した今、複雑なワークフローをコードで厳密に制御するよりも、優秀なLLMに良いツール(武器)を与える方が、シンプルかつ高性能なエージェントを作れるというわけです。Amazon Q Developerの裏側でも使われているなど、すでにAWSの商用サービスでの実績もあるそうです。

検証してみた内容

 この記事では、Strands Agentsで、以下の6つの内容を実際に手を動かしながら検証してみました。

  1. 3行コード: 本当に3行でエージェントは動くのか?
  2. 外部モデルの利用: AWS以外のモデルも使えるのか?
  3. 会話履歴の保存: 会話履歴のS3保存は簡単?
  4. 組み込みツール: use_awsなどの便利ツールとは?
  5. MCP接続: MCPサーバーに接続できる?
  6. マルチエージェント: これらを組み合わせて実用的な調査エージェントを作れるのか?

検証

事前準備

検証に入る前に、開発環境を準備しましょう。この記事では、高速なPythonパッケージ管理ツールの uv を使用します。

AWS側の設定

1. Amazon Bedrockモデルの有効化:

AWSマネジメントコンソールにログインし、Amazon Bedrockのページで利用したい基盤モデル(例: Anthropic Claude 3 Sonnet)へのアクセスを有効にしておきます。)

2. IAMユーザーと認証情報の設定:

Strands Agents からAmazon Bedrockを呼び出すためのIAMユーザーを作成適切権限を付与したIAMユーザーを作成し、お手元のローカル環境でaws configureを実施してください。

ローカルPC側の設定

1. uvのインストール:

ターミナルを開き、uvをインストールします。

brew install uv

2. 作業フォルダの作成:

作業用のフォルダを作成し、そのディレクトリへ移動します。

mkdir StrandsAgents
cd StrandsAgents

3. 仮想環境の作成と有効化:

uvを使って、このプロジェクト専用のPython仮想環境を作成し、有効化します。

# 仮想環境を作成
uv venv

# 仮想環境を有効化
source .venv/bin/activate

これで準備は完了です!次の検証ステップに進みます。

それでは、早速一つずつみていきましょう!!

1.  3行コード: 本当に3行でエージェントは動くのか?

事前準備が完了したところで、いよいよStrands Agentsの真骨頂である「3行コード」を試してみましょう。果たして、本当にこれだけでAIエージェントは動くのでしょうか。

ステップ1: main.pyの作成

まず、プロジェクトフォルダ (StrandsAgents) の中に main.py という名前でファイルを作成し、以下のコードを記述します。

from strands import Agent

agent = Agent()
agent("こんにちは!自己紹介してください。")

ステップ2:実行

仮想環境が有効になっているターミナルで、作成したスクリプトを実行します。

python main.py

ステップ3:結果の確認

実行すると、ターミナルにAIからの自己紹介がリアルタイムで表示されるはずです。

(StrandsAgents) ~/work/StrandsAgents $ python main.py
こんにちは!私はClaude(クロード)です。Anthropic社によって開発されたAIアシスタントです。

日本語での会話はもちろん、様々な質問にお答えしたり、文章の作成、翻訳、問題解決のお手伝いなど、幅広くサポートできます。分からないことがあれば正直にお伝えしますし、できる限り丁寧で役立つ回答を心がけています。

何かお手伝いできることがあれば、お気軽にお声がけください。今日はどのようなことでお話ししましょうか?

2. 外部モデルの利用: AWS以外のモデルも使えるのか?

 続いて、外部モデルも利用できるかについてですが、Strands AgentsはAWS製ですが、特定のクラウドやモデルに縛られることはありません。その証拠に、バックエンドのLLMをAmazon BedrockからGoogleのGeminiに差し替えてみましょう。

ステップ1:準備

「uv pip install litellm」を実行し LiteLLM をインストールし、Google AI Studioで取得したAPIキーを準備します。

ステップ2 :gemini_agent.pyを作成

以下のファイルを作成します。

from strands import Agent
from strands.models.litellm import LiteLLMModel

GEMINI_API_KEY = "YOUR_GEMINI_API_KEY_HERE"

gemini_model = LiteLLMModel(
    model_id="gemini/gemini-1.5-flash-latest",
    params={
        "api_key": GEMINI_API_KEY
    }
)

agent = Agent(model=gemini_model)
response = agent("あなたの名前と開発元を教えてください。")
print(response.message)

ステップ3:結果の確認

(StrandsAgents) ~/work/StrandsAgents $ python gemini_agent.py

Provider List: https://docs.litellm.ai/docs/providers

こんにちは!私はGoogleによってトレーニングされた、大規模言語モデルです。日本語で会話したり、さまざまな質問に答えたり、さまざまな種類の創造的なテキストを作成したりすることができます。  私の知識は広範囲に渡りますが、常に学習中であるため、完璧ではありません。

簡単に言うと、私はあなたと情報を共有し、あなたを助けるためにここにいます。  何か質問があれば、遠慮なく聞いてください!


{'role': 'assistant', 'content': [{'text': 'こんにちは!私はGoogleによってトレーニングされた、大規模言語モデルです。日本語で会話したり、さまざまな質問に答えたり、さまざまな種類の創造的なテキストを作成したりすることができます。  私の知識は広範囲に渡りますが、常に学習中であるため、完璧ではありません。\n\n簡単に言うと、私はあなたと情報を共有し、あなたを助けるためにここにいます。  何か質問があれば、遠慮なく聞いてください!\n'}]}

3. 会話履歴の保存: 会話履歴のS3保存は簡単?

 Strands Agentsを使えば、AIエージェントとの会話履歴をAmazon S3に簡単に永続化できます。これにより、エージェントが過去の文脈を記憶し、人間と対話するように連続した会話が可能になります。

ステップ1:S3バケットの準備と権限設定

会話履歴を保存するためのS3バケットを作成し、Strands Agentsを実行するIAMユーザーに、作成したバケットへのアクセス権限を付与します。

ステップ2:chat.pyの作成

S3SessionManagerを渡すだけで、あとは自動的にS3との間で会話履歴が同期されます。今回はユーザーが「exit」と入力するまで対話を続けるスクリプトを作成しました。

from strands import Agent
from strands.session.s3_session_manager import S3SessionManager

BUCKET_NAME = "strandsagents-s3"
SESSION_ID = "interactive-chat-session-001"

session_manager = S3SessionManager(
    session_id=SESSION_ID,
    bucket=BUCKET_NAME,
)

agent = Agent(session_manager=session_manager)
print("AIとの会話を開始します。終了するには 'exit' と入力してください。")

while True:
    user_input = input("あなた: ")
    if user_input.lower() == 'exit':
        print("会話を終了します。")
        break

    response = agent(user_input)
    print(f"AI: {response.message}")

ステップ3:実行と確認

このスクリプトを複数回実行し、会話が引き継がれることを確認します。

1回目の実行

(StrandsAgents) ~/work/StrandsAgents $ python chat.py
AIとの会話を開始します。終了するには 'exit' と入力してください。
あなた: 私の好きなAWSサービスはAmazon S3です。覚えておいてください。
Amazon S3がお気に入りのAWSサービスだということを覚えておきますね。S3は確かに便利なオブジェクトストレージサービスですね。

ただし、私は会話が終了すると記憶をリセットされるため、次回新しい会話を始められた際には、この情報を覚えていることができません。新しい会話では改めて教えていただく必要があります。

この会話の中では、S3についてのご質問や関連する話題があれば、お気に入りのサービスということを踏まえてお答えできます。S3について何かお聞きになりたいことはありますか?AI: {'role': 'assistant', 'content': [{'text': 'Amazon S3がお気に入りのAWSサービスだということを覚えておきますね。S3は確かに便利なオブジェクトストレージサービスですね。\n\nただし、私は会話が終了すると記憶をリセットされるため、次回新しい会話を始められた際には、この情報を覚えていることができません。新しい会話では改めて教えていただく必要があります。\n\nこの会話の中では、S3についてのご質問や関連する話題があれば、お気に入りのサービスということを踏まえてお答えできます。S3について何かお聞きになりたいことはありますか?'}]}
あなた: exit
会話を終了します。
(StrandsAgents) ~/work/StrandsAgents $

2回目の実行

(StrandsAgents) ~/work/StrandsAgents $ python chat.py
AIとの会話を開始します。終了するには 'exit' と入力してください。
あなた: 私が好きなAWSサービスは何でしたか?
あなたがお気に入りのAWSサービスはAmazon S3でしたね。先ほど教えていただいたばかりです。

S3について何かご質問がございましたら、お聞かせください。AI: {'role': 'assistant', 'content': [{'text': 'あなたがお気に入りのAWSサービスはAmazon S3でしたね。先ほど教えていただいたばかりです。\n\nS3について何かご質問がございましたら、お聞かせください。'}]}
あなた: exit
会話を終了します。
(StrandsAgents) ~/work/StrandsAgents $

エージェントが前回の会話を覚えていることが確認できました。

実際にS3バケット内に会話履歴が格納されているかも確認したいと思います。

以下のようにjsonファイルが作成されています。

中身を確認すると、会話履歴がしっかりと保存されているのが分かります。

message_0.json

{
  "message": {
    "role": "user",
    "content": [
      {
        "text": "私の好きなAWSサービスはAmazon S3です。覚えておいてください。"
      }
    ]
  },
  "message_id": 0,
  "redact_message": null,
  "created_at": "2025-09-24T02:40:26.998554+00:00",
  "updated_at": "2025-09-24T02:40:26.998562+00:00"
}

message_1.json

{
  "message": {
    "role": "assistant",
    "content": [
      {
        "text": "Amazon S3がお気に入りのAWSサービスだということを覚えておきますね。S3は確かに便利なオブジェクトストレージサービスですね。\n\nただし、私は会話が終了すると記憶をリセットされるため、次回新しい会話を始められた際には、この情報を覚えていることができません。新しい会話では改めて教えていただく必要があります。\n\nこの会話の中では、S3についてのご質問や関連する話題があれば、お気に入りのサービスということを踏まえてお答えできます。S3について何かお聞きになりたいことはありますか?"
      }
    ]
  },
  "message_id": 1,
  "redact_message": null,
  "created_at": "2025-09-24T02:40:34.971803+00:00",
  "updated_at": "2025-09-24T02:40:34.971815+00:00"
}

message_2.json

{
  "message": {
    "role": "user",
    "content": [
      {
        "text": "私が好きなAWSサービスは何でしたか?"
      }
    ]
  },
  "message_id": 2,
  "redact_message": null,
  "created_at": "2025-09-24T02:41:00.722950+00:00",
  "updated_at": "2025-09-24T02:41:00.722973+00:00"
}

message_3.json

{
  "message": {
    "role": "assistant",
    "content": [
      {
        "text": "あなたがお気に入りのAWSサービスはAmazon S3でしたね。先ほど教えていただいたばかりです。\n\nS3について何かご質問がございましたら、お聞かせください。"
      }
    ]
  },
  "message_id": 3,
  "redact_message": null,
  "created_at": "2025-09-24T02:41:03.592281+00:00",
  "updated_at": "2025-09-24T02:41:03.592292+00:00"
}

Strands Agentsのセッション管理機能を使えば、サーバーレスアーキテクチャとも相性の良い、ステートフルなAIエージェントを簡単に構築できますね。

4. 組み込みツール: use_awsなどの便利ツールとは?

 これまでのエージェントは、LLMが持つ知識だけで対話していましたが、Strands Agentsは「ツール」が利用できます。ツールとは、エージェントが呼び出せる関数のことで、これを与えることでエージェントは外部の情報を取得したり、システムを操作したりできるようになります。

 strands-agents-toolsというパッケージには、すぐに使える便利なツールがいくつか用意されています。今回はその中でも特に強力なuse_awsツールを試してみましょう。

ステップ1:準備

 use_awsツールはstrands-agents-toolsパッケージに含まれているため、追加でインストールします。

uv pip install strands-agents-tools

ステップ2:aws_agent.pyの作成

from strands import Agent
from strands_tools import use_aws

aws_agent = Agent(
    system_prompt="あなたはAWSリソースを調査する専門家です。'use_aws'ツールを使って、ユーザーの指示に正確に従ってください。",
    tools=[use_aws]
)

response = aws_agent("東京リージョンにあるS3一覧を教えて下さい。")

print(f"AI: {response.message}")

ステップ3:実行と確認

 use_awsツールを使って、AWSアカウントの東京リージョンにあるS3一覧を取得してくるよう指示しました。実際は14個存在するのに対し、5個しか取得してきませんでした。

おそらく原因として、LLMが途中で処理を打ち切ってしまったようで、「すべてのバケットをチェックせよ」という指示が曖昧だったようです。そこで、system_promptを以下のように強化しました。

修正版 aws_agent.pyの作成

from strands import Agent
from strands_tools import use_aws

def final_response_handler(event: AgentEvent) -> bool:
    return event.event_type == EventType.FINAL_RESPONSE

IMPROVED_SYSTEM_PROMPT = """
あなたは、AWSリソースを調査する非常に几帳面で正確な専門家です。'use_aws'ツールのみを使い、ユーザーの指示に完璧に従ってください。

## S3バケットのリージョンを特定する際の厳格なルール
S3の'list-buckets'はグローバルな結果を返すため、各バケットのリージョンは'get-bucket-location'で個別に確認する必要があります。
ユーザーから特定リージョンのバケット一覧を求められた場合、以下の思考プロセスと手順を**絶対に**守ってください。

### 思考プロセス
1.  まず'use_aws'ツールで's3 list-buckets'を実行し、アカウント内の**すべての**バケット名を取得する。
2.  取得した**すべての**バケット名のリストに対して、ループ処理を行う。省略は許されない。
3.  ループの中で、バケット名一つひとつに対して'use_aws'ツールで's3 get-bucket-location'を実行し、そのバケットのリージョンを特定する。
4.  ステップ3で特定したリージョンが、ユーザーの指定したリージョンと一致するものだけをリストとしてまとめる。
5.  最終的に、ステップ4で作成したリストが完全であることを確認し、ユーザーに報告する。
"""

aws_agent = Agent(
    system_prompt=IMPROVED_SYSTEM_PROMPT,
    tools=[use_aws]
)

response = aws_agent("東京リージョンにあるS3バケットを一覧表示して")

print(f"AI: {response.message}")

期待値通りの14個のバケットを取得できました。本番で実装しようとすると、まだまだこの辺りチューニングが必要ですね。

5. MCP接続: MCPサーバーに接続できる?

 Strands Agentsのもう一つの強力な機能が、MCP (Model Context Protocol) と接続できることです。MCPとは、AIエージェントと外部ツール群(MCPサーバー)との間の通信を標準化するオープンな規格のことです。

 今回は、AWS公式が提供している「AWS Documentation MCP Server」に接続してみましょう。これを連携させることで、エージェントはAWSの公式ドキュメントを検索し、その内容に基づいて回答するという新たな能力を実装できます。

ステップ1:準備
uvxというコマンドラインツールを使い、MCPサーバーをローカルで実行します。まだインストールしていない場合は、以下のコマンドでインストールしてください。

uv pip install uvx

ステップ2:mcp_agent.pyの作成

MCPClientを使って、uvx経由でAWS Documentation MCP Serverに接続します。withブロックの中でエージェントの処理を行うのが重要なポイントです。

from mcp import stdio_client, StdioServerParameters
from strands import Agent
from strands.tools.mcp import MCPClient

aws_doc_mcp_client = MCPClient(lambda: stdio_client(
    StdioServerParameters(
        command="uvx",
        args=["awslabs.aws-documentation-mcp-server@latest"]
    )
))

with aws_doc_mcp_client:
    print("MCPサーバーからツールを取得しています...")
    tools = aws_doc_mcp_client.list_tools_sync()
    
    print(f"取得したツール: {[tool.spec.name for tool in tools]}")

    agent = Agent(
        system_prompt="あなたはAWSの専門家です。AWS公式ドキュメントを検索できるツールを使い、質問に正確に答えてください。",
        tools=tools
    )
    
    response = agent("Amazon S3の耐久性について、公式ドキュメントに基づいて教えて")
    print(f"\nAI: {response.message}")

ステップ3: 実行と結果の確認

スクリプトを実行すると、バックグラウンドでuvxがMCPサーバーを起動し、エージェントがそこからツールを取得してタスクを実行します。

(StrandsAgents) ~/work/StrandsAgents $ python mcp_agent.py
MCPサーバーからツールを取得しています...
[09/24/25 13:15:13] INFO     Processing request of type ListToolsRequest                                                                                                                                                                                           server.py:623
取得したツール: ['read_documentation', 'search_documentation', 'recommend']
Amazon S3の耐久性について、公式ドキュメントを検索して詳細な情報をお調べします。
Tool #1: search_documentation
[09/24/25 13:15:16] INFO     Processing request of type CallToolRequest                                                                                                                                                                                            server.py:623
[09/24/25 13:15:18] INFO     HTTP Request: POST https://proxy.search.docs.aws.amazon.com/search?session=92b5748a-fd14-4a40-92b3-bc0a0aee3082 "HTTP/1.1 200 OK"                                                                                                   _client.py:1740
「Data protection in Amazon S3」が耐久性に関する情報を含んでいそうです。詳しく確認してみましょう。
Tool #2: read_documentation
[09/24/25 13:15:21] INFO     Processing request of type CallToolRequest                                                                                                                                                                                            server.py:623
                    INFO     HTTP Request: GET https://docs.aws.amazon.com/AmazonS3/latest/userguide/DataDurability.html?session=92b5748a-fd14-4a40-92b3-bc0a0aee3082 "HTTP/1.1 200 OK"                                                                          _client.py:1740
さらに詳しい情報を得るために、ストレージクラスに関するページも確認してみましょう。
Tool #3: read_documentation
[09/24/25 13:15:24] INFO     Processing request of type CallToolRequest                                                                                                                                                                                            server.py:623
                    INFO     HTTP Request: GET https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html?session=92b5748a-fd14-4a40-92b3-bc0a0aee3082 "HTTP/1.1 200 OK"                                                                     _client.py:1740
それでは、Amazon S3の耐久性について、公式ドキュメントから得られた情報をまとめてお答えします。

## Amazon S3の耐久性(Durability)について

### 高い耐久性の設計
Amazon S3は、**99.999999999%(11個の9)の耐久性**を提供するように設計されています。これは、年間で1,000万個のオブジェクトを保存した場合に、平均して1個のオブジェクトを失う可能性があるという意味です。

### 冗長化による耐久性の確保

#### 1. **マルチAZ冗長化**
- S3 Standard、S3 Intelligent-Tiering、S3 Standard-IA、S3 Glacier Instant Retrieval、S3 Glacier Flexible Retrieval、S3 Glacier Deep Archiveは、**最低3つのアベイラビリティゾーン(AZ)**にまたがって冗長的にデータを保存
- 各アベイラビリティゾーンは物理的に数キロメートル離れた独立したデータセンター
- **1つのAZ全体が失われても**データを保持可能

#### 2. **デバイスレベルの冗長化**
- 各AZ内で**複数のデバイス**にデータを冗長保存
- デバイス障害を迅速に検出し、失われた冗長性を素早く修復
- 定期的にチェックサムを使用してデータの整合性を検証

### ストレージクラスによる耐久性の違い

#### 高耐久性クラス
- **S3 Standard**: 99.999999999%の耐久性
- **S3 Intelligent-Tiering**: 99.999999999%の耐久性
- **その他のGlacierクラス**: すべて99.999999999%の耐久性

#### 特別なケース
- **S3 One Zone-IA**: 単一のAZ内でのみ冗長化(コスト削減のため)
- **S3 Express One Zone**: 単一のAZ内で冗長化、最高性能を提供
- **Reduced Redundancy Storage (RRS)**: 年間0.01%のオブジェクト損失率(**推奨されません**)

### 追加の保護機能

#### 1. **バージョニング**
- オブジェクトのすべてのバージョンを保持
- 意図しない削除や変更からの保護
- アプリケーション障害からの復旧支援

#### 2. **その他の保護機能**
- **S3 Object Lock**: オブジェクトの変更・削除を防止
- **S3 Replication**: 別のリージョンへの複製
- **データ整合性の監視**: チェックサムによる定期検証

### まとめ
Amazon S3は、複数のAZにまたがる冗長化、デバイスレベルの冗長化、継続的な監視・修復により、**99.999999999%という極めて高い耐久性**を実現しています。これにより、ミッションクリティカルなデータの長期保存に適した信頼性の高いストレージサービスとなっています。

エージェントがMCPサーバーと連携し、AWS公式ドキュメントに基づいた正確な回答を返してくれました。

このように、MCPを使えばエージェントの機能を動的に拡張できます。自社内のドキュメントを検索するMCPサーバーを構築すれば、社内情報に詳しいAIアシスタントを開発することも可能になりますね。

6. マルチエージェント: これらを組み合わせて実用的な調査エージェントを作れるのか?

 最後に、これまで作成したAWSリソースを直接操作するエージェントと、公式ドキュメントを検索するエージェントを組み合わせて、より高度で実用的な「AWS統合調査エージェント」を構築してみましょう。

 ここでは、AIエージェント開発で一般的な「スーパーバイザー」という設計パターンを利用します。これは、ユーザーからの指示を分析して最適な小エージェントにタスクを振り分ける監督役(スーパーバイザー)を置く方法です。

構成は以下の通りです。

  • スーパーバイザー:ユーザーの質問が「アカウント内のリソースに関するもの」か「一般的な知識に関するもの」かを判断する小エージェントを監督するエージェント。
  • 小エージェント1 (aws_operator):use_awsツールを使い、実際のアカウントを調査するエージェント。
  • 小エージェント2 (aws_investigator):MCP経由でAWS公式ドキュメントを検索するエージェント。

ステップ1: multi_agent.pyの作成と実装

import boto3
from mcp import stdio_client, StdioServerParameters
from strands import Agent, tool
from strands.models import BedrockModel
from strands.tools.mcp import MCPClient
from strands_tools import use_aws

# --- 小エージェント1: AWSリソース操作担当 ---
@tool
def aws_operator(query: str) -> str:
    """
    ユーザーの実際のアカウントを操作し、AWSリソースの現在の状態を取得する場合に使用します。
    (例: 「S3の一覧を教えて」)
    """
    IMPROVED_SYSTEM_PROMPT = """
    あなたは、AWSリソースを調査する非常に几帳面で正確な専門家です。'use_aws'ツールのみを使い、ユーザーの指示に完璧に従ってください。

    ## S3バケットのリージョンを特定する際の厳格なルール
    S3の'list-buckets'はグローバルな結果を返すため、各バケットのリージョンは'get-bucket-location'で個別に確認する必要があります。
    ユーザーから特定リージョンのバケット一覧を求められた場合、以下の思考プロセスと手順を**絶対に**守ってください。

    ### 思考プロセス
    1.  まず'use_aws'ツールで's3 list-buckets'を実行し、アカウント内の**すべての**バケット名を取得する。
    2.  取得した**すべての**バケット名のリストに対して、ループ処理を行う。省略は許されない。
    3.  ループの中で、バケット名一つひとつに対して'use_aws'ツールで's3 get-bucket-location'を実行し、そのバケットのリージョンを特定する。
    4.  ステップ3で特定したリージョンが、ユーザーの指定したリージョンと一致するものだけをリストとしてまとめる。
    5.  最終的に、ステップ4で作成したリストが完全であることを確認し、ユーザーに報告する。
    """
    agent = Agent(
        system_prompt=IMPROVED_SYSTEM_PROMPT,
        tools=[use_aws]
    )
    return agent(query).message

# --- 小エージェント2: AWSドキュメント調査担当 ---
aws_doc_mcp_client = MCPClient(lambda: stdio_client(
    StdioServerParameters(command="uvx", args=["awslabs.aws-documentation-mcp-server@latest"])
))
@tool
def aws_investigator(query: str) -> str:
    """AWSのサービス仕様やベストプラク-ティス、料金など、一般的な知識について調べる場合に使用します。"""
    with aws_doc_mcp_client:
        tools = aws_doc_mcp_client.list_tools_sync()
        agent = Agent(
            system_prompt="あなたはAWSドキュメント調査の専門家です。取得したツールを使い、質問に正確に答えてください。",
            tools=tools
        )
        return agent(query).message

# --- スーパーバイザーエージェントの定義---
supervisor = Agent(
    system_prompt="""
    あなたはAWS調査を監督するスーパーバイザーです。ユーザーの質問を分析し、最も適切なツール(aws_operatorかaws_investigator)を一つだけ選択して実行してください。
    """,
    tools=[aws_operator, aws_investigator]
)

# --- 対話ループの実行部分---
if __name__ == "__main__":
    print("AWS統合調査エージェントを起動しました。終了するには 'exit' と入力してください。")
    while True:
        user_input = input("あなた: ")
        if user_input.lower() == 'exit':
            print("エージェントを終了します。")
            break
        
        response = supervisor(user_input)
        print(f"スーパーバイザー:\n{response.message}\n")

これまでの検証内容をすべて統合し、スーパーバイザーエージェントと2体の子エージェントを単一のファイルmulti_agent.pyに実装します。

ステップ2: 実行と確認

それでは、ターミナルでスクリプトを実行し、スーパーバイザーと対話してみましょう。

「東京リージョンにあるS3バケットはすべてでいつくありますか?」と聞いたところ監督者エージェントがaws_operatorに聞く内容と判断し、ちゃんと動いていることが分かります。

続いて、「Amazon EFSとAmazon FSxの違いを表形式でまとめて」と聞いてみたところ、こちらもちゃんと監督者エージェントが判断し、aws_investigatoが動いているのが確認できます。

事前に公式ドキュメントから情報を収集して、

比較内容をアウトプットしてくれていることが分かります。

Strands Agentsを使えば、このように高度な判断能力を持つマルチエージェントシステムも、非常に直感的なコードで構築できることが確認できました。

まとめ

 本ブログでは、AWS製のAIエージェントフレームワーク「Strands Agents」を使って、最小3行のコードから、最終的には複数の専門家が連携するマルチエージェントシステムまでを一気に構築する過程を検証しました。

実際に手を動かして分かったのは、Strands Agentsが持つ以下の特長です。

  • 圧倒的なシンプルさ:Agentクラスを初期化するだけで、すぐにAIエージェント開発を始められる。
  • 高い柔軟性:modelを差し替えるだけで、BedrockだけでなくGeminiやOpenAIなど、様々なLLMに柔軟に対応できる。
  • 優れた拡張性:use_awsのような組み込みツールや、MCP経由で外部ツールを追加することで、エージェントの能力を動的に拡張できる。

特に、小エージェントをツールとして定義し、監督者エージェントがタスクを振り分けるマルチエージェントの仕組みは、非常に直感的かつ強力でした。

今回作成したエージェントはまだプロトタイプですが、今後はBedrock AgentCoreといったサービスを使って、これをどのように本格的なアプリケーションとしてデプロイ・運用していくのか、といった領域も探求していきたいと思います。

この記事が、皆さんがAIエージェント開発の第一歩を踏み出すきっかけになれば幸いです。

 

元記事発行日: 2025年11月05日、最終更新日: 2025年10月31日