こんにちは、丸山です。
最近、AgentCoreを利用する仕事が増え、日々いろいろな利用方法を調べています。
さて、AgentCoreは、2025年7月にプレビュー公開されて以降、10月には一般提供開始(GatewayのMCP対応/Memoryの長期記憶対応など)、12月にはさらに機能追加がされ(Evaluations/Policy)、あっという間にアップデートされていきますね。
さて今回は、AgentCore Runtime が対応している A2A(Agent2Agent)プロトコルに注目します。
A2A を利用することで、エージェント同士を標準化されたプロトコルで連携させることができます。
さらに Strands Agents には A2AClientToolProvider が追加され、
わずか数行のコードでエージェント間通信を実装できるようになっています。
本記事では、AgentCore と Strands Agents を用いた簡単な A2A 通信の実装例を紹介します。
1. はじめに
1.1. A2Aとは
A2A(Agent2Agent)プロトコル とは、複数の AI エージェントが相互に通信・協調するためのプロトコルです。
A2A は Google によって提唱され、その後 Linux Foundation に寄贈されました。
現在は Linux Foundation の管理のもと、仕様が公開され、複数の組織が議論に参加できる形で運営されています。
従来、1つのエージェントに多数のツールや知識を詰め込む設計では、構造が複雑化し、拡張や保守が難しくなりがちでした。
A2A は、エージェントを 「役割ごとに分割」 し、それらを標準化されたプロトコルで接続することで、
柔軟かつ疎結合なマルチエージェント構成を可能にします。
A2A の仕様は以下で公開されています。
a2a-protocol.org
これまでマルチエージェントで課題となるような内容が、A2Aを利用することで、以下のように解決されます。
| 課題 | A2Aの目的 |
|---|---|
| AIエージェントが増えたが、それぞれが独自仕様で連携が困難 | エージェント間通信を 標準化 し、異なる基盤でも協調できるようにする |
| 単一エージェントに多機能を詰め込むと、拡張・保守が複雑になる | エージェントを 役割ごとに分離 し疎結合構成を実現 |
| 信頼できないエージェント間通信はセキュリティ上のリスクとなる | 認証・署名・認可を含む 安全な相互通信モデル の提供 |
1.2. Amazon Bedrock AgentCoreとは
Amazon Bedrock AgentCore は、生成AIエージェントを 安全に・スケーラブルに・統合的に運用するためのマネージド基盤 です。
単なるモデル実行環境ではなく、エージェントの実行、状態管理、ツール連携、エージェント間通信までを包含した エージェント運用のための総合基盤 と位置づけられています。
この AgentCore を構成する中核コンポーネントのひとつが、Amazon Bedrock AgentCore Runtime です。
Amazon Bedrock AgentCore Runtime は、エージェントをクラウド環境で安全かつ効率的に実行するための ランタイム基盤 です。
AgentCore Runtime は以下のような役割を持ちます。
- エージェントのホスティング
- ツール呼び出し(外部 API / DB / ワークフロー)の管理
- セッション状態やコンテキストの管理
- A2A プロトコルによるエージェント間通信のサポート
10月にあったAgentCoreの一般公開に伴い、AgentCore RuntimeがA2Aプロトコルに正式対応し、標準化されたエージェント間通信が可能になりました。
これにより、異なる基盤で開発されたエージェント同士でも、統一されたプロトコルで協調動作できるようになります。
2. 検証アプリケーションの構成
AgentCore Runtime上にホストした計算A2Aサーバーに、A2Aクライアントが処理を委譲するシステムを考えます。

3. 実装
構成図中のA2AサーバーとA2AクライアントはそれぞれStrandsAgentsで実装し、A2AサーバーをAgentCore Runtimeにデプロイしました。
3.1. A2Aサーバー
AWS公式の手順に則って、A2Aサーバーを実装し、AgentCore Runtimeにデプロイします。
具体的には、Strands Agentsを使ってcalculatorツールを持つCalculator Agentを実装し、A2AServerでラップしてFastAPIアプリケーションとして公開します。
docs.aws.amazon.com
RUNTIME_RUL = os.environ.get("AGENTCORE_RUNTIME_URL", "http://127.0.0.1:9000/") PORT = int(os.environ.get("PORT", "9000")) HOST = "0.0.0.0" def _create_agent(): calculator_agent = Agent( name="Calculator Agent", description="A Calculator agent that can perform basic arithmetic operations.", tools=[calculator], # strands_tools.calculator.calculatorを設定 callback_handler=None, ) return calculator_agent def _create_app(agent: Agent): app = FastAPI() # AgentCoreのA2Aを使う場合、/pingにヘルスチェック用のAPIを実装する必要がある @app.get("/ping") def ping(): return {"status": "healthy"} # Pass runtime_url to http_url parameter AND use serve_at_root=True logging.info("Runtime URL: %s", RUNTIME_RUL) a2a_server = A2AServer( agent=agent, http_url=RUNTIME_RUL, serve_at_root=True, # Serves locally at root (/) regardless of remote URL path complexity ) app.mount("/", a2a_server.to_fastapi_app()) return app if __name__ == "__main__": _agent = _create_agent() _app = _create_app(_agent) uvicorn.run(_app, host=HOST, port=PORT)
3.2. A2Aクライアント
次にA2Aクライアントを実装します。
3.2.1. 認証設定の簡素化
Strands AgentsのA2AClientToolProviderは、エージェント間通信を簡略化する便利なツールです。
ですが、以前はA2AClientToolProviderに認証ヘッダーを設定する方法がありませんでした。
AgentCore Runtimeとの通信には認証が必須であるため、以前はAWS公式の手順に従って以下のような実装が必要でした:
- カスタムHTTPクライアントを作成し、認証ヘッダーを手動で設定
- エージェントカード(
.well-known/agent-card.json)を取得するコードを実装 - A2Aメッセージ送信用のツールを手動で定義
- これらのツールをAgentに登録
このアプローチでは、数十行のコードが必要でした。
しかし、最近A2AClientToolProviderにhttpx_client_argsプロパティが追加されました。
このプロパティにより、認証ヘッダーやタイムアウト設定などのHTTPクライアント設定を直接指定できるようになり、以下のように簡潔に記述できるようになりました:
3.2.2. 実装コード
A2AClientToolProviderを使った実装は以下の通りです。わずか数行でエージェント間通信が実現できます:
logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) DEFAULT_TIMEOUT = 300 # set request timeout to 5 minutes RUNTIME_URL = os.getenv("RUNTIME_URL") BEARER_TOKEN = os.getenv("BEARER_TOKEN") async def send_message(message: str): # Generate a unique session ID session_id = str(uuid4()) print(f"Generated session ID: {session_id}") print("==================" * 5) # Add authentication headers for Amazon Bedrock AgentCore headers = { "Authorization": f"Bearer {BEARER_TOKEN}", } # A2AClientToolProviderが以下を自動的に行います: # 1. エージェントカード(.well-known/agent-card.json)の取得 # 2. A2A通信用ツール(a2a_list_discovered_agents, a2a_send_message)の生成 # 3. HTTPクライアントの設定(httpx_client_argsで指定) provider = A2AClientToolProvider( known_agent_urls=[RUNTIME_URL], httpx_client_args={ # 新しく追加されたプロパティ "headers": headers, # 認証ヘッダーを簡単に設定 "timeout": DEFAULT_TIMEOUT, # タイムアウトも簡単に設定 }, ) # 生成されたツールをAgentに登録するだけで使用可能 agent = Agent(tools=provider.tools) agent(message) asyncio.run( send_message("A2Aサーバーを利用してsin(x^2)のテイラー展開を計算してください") )
4. 検証結果と考察
「3. 実装」で実装したA2Aクライアントを実行した結果、以下の動作を確認できました。
- クライアントは、まず
.well-known/agent-card.jsonからサーバーの機能情報を取得し、その後計算タスクをサーバーに委譲しています。 - 短いコードでドメイン特化したエージェント間の連携を実現できることが確認できました。
▼A2Aクライアント実行結果
Generated session ID: <session ID>
==========================================================================================
A2Aサーバーを使ってsin(x^2)のテイラー展開を計算するために、まず利用可能なエージェントを確認します。
Tool #1: a2a_list_discovered_agents
INFO:strands_tools.a2a_client:A2ACardResolver created for <RUNTIME_URL>
INFO:httpx:HTTP Request: GET <RUNTIME_URL>/.well-known/agent-card.json "HTTP/1.1 200 OK"
INFO:a2a.client.card_resolver:Successfully fetched agent card data from <RUNTIME_URL>/.well-known/agent-card.json: {'capabilities': <agent-cardの中身が続く ※長いため割愛>}
INFO:strands_tools.a2a_client:Successfully discovered and cached agent card for <RUNTIME_URL>
利用可能なエージェントが見つかりました。Calculator Agentがcalculatorスキルを持っており、series(級数展開)モードでsin(x^2)のテイラー展開を計算できます。
Tool #2: a2a_send_message
INFO:strands_tools.a2a_client:A2ACardResolver created for <RUNTIME_URL>/
INFO:httpx:HTTP Request: GET <RUNTIME_URL>/.well-known/agent-card.json "HTTP/1.1 200 OK"
INFO:a2a.client.card_resolver:Successfully fetched agent card data from <RUNTIME_URL>/.well-known/agent-card.json: {'capabilities': <agent-cardの中身が続く ※長いため割愛>}
INFO:strands_tools.a2a_client:Successfully discovered and cached agent card for <RUNTIME_URL>/
INFO:strands_tools.a2a_client:Sending message to <RUNTIME_URL>/
INFO:httpx:HTTP Request: POST <RUNTIME_URL>/ "HTTP/1.1 200 OK"
より詳細なテイラー展開が必要ですので、高次の項まで計算してもらいましょう。
Tool #3: a2a_send_message
INFO:strands_tools.a2a_client:Sending message to <RUNTIME_URL>/
INFO:httpx:HTTP Request: POST <RUNTIME_URL>/ "HTTP/1.1 200 OK"
A2Aサーバーを使用してsin(x²)のテイラー展開を計算しました。結果をまとめると:
## sin(x²)のテイラー展開
**10次までの展開結果:**
sin(x²) = x² - x⁶/6 + O(x¹⁰)
**完全な展開式:**
sin(x²) = x² - x⁶/6 + x¹⁰/120 - x¹⁴/5040 + ...
### 展開の説明:
1. **基本原理**: sin(u)の通常のテイラー展開にu = x²を代入
- sin(u) = u - u³/3! + u⁵/5! - u⁷/7! + ...
2. **各項の導出**:
- **x²項**: sin(u)の1次項uにu = x²を代入 → x²
- **-x⁶/6項**: sin(u)の3次項-u³/3!にu = x²を代入 → -(x²)³/6 = -x⁶/6
- **x¹⁰/120項**: sin(u)の5次項u⁵/5!にu = x²を代入 → (x²)⁵/120 = x¹⁰/120
3. **特徴**:
- sin(x²)は偶関数なので、奇数次の項(x, x³, x⁵など)は存在しない
- 項は2の倍数次(2, 6, 10, 14...)のみ現れる
この計算はA2AサーバーのCalculator Agentが持つSymPy計算機能を使って実行されました。
5. まとめ
本記事では、A2Aプロトコルに対応したAmazon Bedrock AgentCoreとStrands Agentsを活用したエージェント間通信の実装例を紹介しました。
AgentCore RuntimeのA2A対応により、標準化されたエージェント間通信が可能になりました。
今回の検証を通じて、A2Aプロトコルが提供する3つの価値を実感できました。
| A2Aの観点 | 今回の検証での対応 |
|---|---|
| 標準化による相互運用性 | .well-known/agent-card.json を通じてサーバーのcapabilitiesを自動発見し、A2AClientToolProviderでわずか数行のコードで連携を実現 |
| 役割ごとの分離 | クライアント側(ユーザー対話・タスク管理)とサーバー側(数式計算専門処理)を分離し、サーバー機能を拡張してもクライアントコードは変更不要 |
| 安全な相互通信 | Bearer認証トークンを用いたHTTPSヘッダー認証により、AgentCore Runtime上で認可されたエージェント間のみの通信を実現 |
Acroquest Technologyでは、キャリア採用を行っています。少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com
- Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- マイクロサービス、DevOps、最新のOSSやクラウドサービスを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長