はじめに
ご注意
非エンジニアが右往左往しながら書いています。誤りや無駄なコードを含む場合がありますのでご容赦ください。
Amazon Bedrock AgentCoreが東京リージョンでも利用可能になったので、その記憶機能(AgentCore Memory)を試してみました。本記事では、AgentCoreの基本的なデプロイから、組み込みの記憶ストラテジーを活用した実装までを実践します。
この記事は、AWS公式ドキュメントおよびクラスメソッドさんのブログを参考に、自己学習のために取り組んだ内容をまとめたものです。
Amazon Bedrock AgentCoreとは
Amazon Bedrock AgentCoreは、AIエージェントを安全かつスケーラブルにデプロイ・運用するためのAWSのマネージドサービス群です。
主な特徴
- フレームワーク・モデル非依存: Strands Agents、LangGraph、CrewAIなど多様なフレームワークに対応
- マネージドな実行環境: インフラ管理不要で、トラフィックに応じた自動スケール
- セッション分離: 各セッションが専用microVMで実行され、完全に分離
- サーバーレス: 使った分だけの従量課金
AgentCoreのサービス群
AgentCoreは以下のような複数のサービスで構成されています:
| サービス | 役割 |
|---|---|
| AgentCore Runtime | エージェントの実行環境。セッション分離、長時間実行、マルチモーダル対応 |
| AgentCore Memory | 短期・長期記憶の管理。会話履歴と学習内容の保持 |
| AgentCore Gateway | API/Lambda関数をMCP互換ツールに変換。統一的なツールアクセス |
| AgentCore Identity | 認証・認可の管理。OAuth 2.0対応、トークン管理 |
| AgentCore Code Interpreter | コード実行環境。サンドボックスでの安全な実行 |
| AgentCore Browser | Webブラウザ機能。エージェントによるWeb操作 |
| AgentCore Observability | 監視・デバッグ。X-Ray、CloudWatch統合 |
本記事では、この中でもAgentCore Memoryに焦点を当てて実装していきます。
AgentCore Memoryとは
AgentCore Memoryは、AIエージェントに記憶能力を持たせるマネージドサービスです。エージェントが過去の会話を記憶し、ユーザーごとにパーソナライズされた応答を実現します。AIチャットアプリを作る際、セッションの一連の会話歴を全て入力に使うことが私の場合多かったですが、少し実装方法が変わりそうですね。
短期記憶と長期記憶
AgentCore Memoryは2種類の記憶を提供します:
短期記憶(Short-term Memory)
- セッション内の会話履歴を保持
-
create_eventAPIで会話を保存 -
list_eventsAPIで即座に取得可能 - セッション終了後も一定期間保持(設定可能)
長期記憶(Long-term Memory)
- 会話から重要な情報を自動抽出
- 非同期のバックグラウンド処理で生成
- ユーザー情報や学習内容を永続化
-
retrieve_memory_recordsAPIで検索・取得
3つの組み込みストラテジー
AgentCoreは、会話から自動的に以下の3種類の情報を抽出します:
| ストラテジー | 役割 | 例 | デフォルト名前空間 |
|---|---|---|---|
| SEMANTIC | 事実や知識 | 「太郎です」「Pythonを勉強中」 | /users/{actorId}/facts |
| USER_PREFERENCE | ユーザーの好み | 「実践的な例が好き」 | /users/{actorId}/preferences |
| SUMMARIZATION | 会話の要約 | セッション全体のサマリー | /summaries/{actorId}/{sessionId} |
- 名前空間を使ってユーザーごと・種類ごとにデータを分離
ID階層の3層構造
AgentCore Memoryは以下の3層でデータを管理します:
| レベル | ID種別 | 役割 | 具体例 |
|---|---|---|---|
| 1 | Memory ID | メモリインスタンス全体 | app_mem-xxxxxxxx |
| 2 | Actor ID | ユーザーを識別 |
user-001, user-002
|
| 3 | Session ID | セッションを識別 | session-001-abc123... |
この階層構造により、ユーザーごと・セッションごとにデータを適切に分離できます。
前提条件
- AWSアカウント
- IAMユーザーの作成とアクセスキーの取得
- Python 3.11以上
- boto3
- AWS CLIの設定
環境構築
プロジェクトの作成
mkdir agentcore_memory_demo
cd agentcore_memory_demo
必要なファイルの作成
touch requirements.txt .env app.py
mkdir prompts
touch prompts/agent_prompt.txt
requirements.txt
python-dotenv
strands-agents
strands-agents-tools
bedrock-agentcore
bedrock-agentcore-starter-toolkit
boto3>=1.39.8
botocore>=1.33.8
Python仮想環境のセットアップ
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
環境変数の設定
AWS_ACCESS_KEY_ID=your_access_key_id
AWS_SECRET_ACCESS_KEY=your_secret_access_key
AWS_DEFAULT_REGION=ap-northeast-1
MODEL=jp.anthropic.claude-haiku-4-5-20251001-v1:0
# MEMORY_IDは初回デプロイ後に追加します
注意: .envファイルはローカル開発用です。AgentCoreにデプロイする際は、agentcore launch --envで環境変数を渡します。
AgentCore Starter Toolkitについて
AgentCore Starter Toolkitは、AgentCoreへのデプロイを簡単にするCLIツールです。
Starter Toolkitの特徴
-
簡単なデプロイ:
agentcore configureとagentcore launchだけでデプロイ完了 - 自動インフラ構築: CodeBuildやECRなどのインフラを自動作成
- 開発に最適: プロトタイプや学習目的に最適
本番環境でのデプロイ方法
本番環境では、より制御可能な方法が推奨されると思います:
AWS CDK
CloudFormation
Terraform
- インフラをコードで管理でき、バージョン管理が可能
- 複数環境(dev/staging/prod)の管理が容易
本記事では、学習目的のためStarter Toolkitを使用します。
実装:記憶機能付きエージェント
それでは、3つの組み込みストラテジーを活用したエージェントを実装していきます。
プロンプトファイル
まず、エージェントのシステムプロンプトを作成します。
あなたは親切で知識豊富なAIアシスタントです。ユーザーとの会話を通じて、質問に答えたり、情報を提供したりします。
【あなたの役割】
- ユーザーの質問に丁寧に答える
- 会話の文脈を理解し、自然な対話を行う
- ユーザーについて学んだ情報を覚えておく
- 必要に応じて過去の会話を参照する
【対応方針】
- 簡潔で分かりやすい説明を心がける
- 不確かな情報については、その旨を伝える
- ユーザーの意図を汲み取り、適切に応答する
app.py
試行錯誤しながら落ち着いたコードが以下です。
import os
import boto3
from dotenv import load_dotenv
from strands import Agent
from bedrock_agentcore.runtime import BedrockAgentCoreApp
load_dotenv()
MODEL = os.environ.get("MODEL", "jp.anthropic.claude-haiku-4-5-20251001-v1:0")
MEMORY_ID = os.environ.get("MEMORY_ID", "")
# AgentCore data clientの初期化
try:
data_client = boto3.client('bedrock-agentcore', region_name='ap-northeast-1')
print("✓ AgentCore data client initialized")
except Exception as e:
print(f"Warning: Failed to initialize data client: {e}")
data_client = None
def load_prompt(filename: str) -> str:
"""プロンプトファイルを読み込む"""
prompt_path = os.path.join(os.path.dirname(__file__), "prompts", filename)
with open(prompt_path, "r", encoding="utf-8") as f:
return f.read()
def get_short_term_memory(actor_id: str, session_id: str) -> list:
"""短期記憶(会話履歴)を取得"""
if not data_client or not MEMORY_ID or not session_id:
return []
try:
response = data_client.list_events(
memoryId=MEMORY_ID,
actorId=actor_id,
sessionId=session_id,
maxResults=10
)
events = response.get('events', [])
print(f"✓ Retrieved {len(events)} events from short-term memory")
return events
except Exception as e:
print(f"短期記憶取得エラー: {e}")
return []
def save_event(actor_id: str, session_id: str, role: str, content: str):
"""イベントを保存"""
if not data_client or not MEMORY_ID or not session_id:
return
try:
import time
data_client.create_event(
memoryId=MEMORY_ID,
actorId=actor_id,
sessionId=session_id,
eventTimestamp=time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
payload=[
{
'conversational': {
'role': role,
'content': {'text': content}
}
}
]
)
print(f"✓ Event saved: {role}")
except Exception as e:
print(f"イベント保存エラー: {e}")
def get_semantic_facts(actor_id: str) -> list:
"""事実・知識を取得(SEMANTICストラテジー)"""
if not data_client or not MEMORY_ID:
return []
try:
namespace = f"/users/{actor_id}/facts"
query = "user facts knowledge information"
print(f" Facts Namespace: {namespace}")
response = data_client.retrieve_memory_records(
memoryId=MEMORY_ID,
namespace=namespace,
searchCriteria={"searchQuery": query}
)
records = response.get('memoryRecordSummaries', [])
print(f"✓ Retrieved {len(records)} fact records")
return records
except Exception as e:
print(f"事実取得エラー: {e}")
return []
def get_user_preferences(actor_id: str) -> list:
"""ユーザーの好みを取得(USER_PREFERENCEストラテジー)"""
if not data_client or not MEMORY_ID:
return []
try:
namespace = f"/users/{actor_id}/preferences"
query = "user preferences likes dislikes style"
print(f" Preferences Namespace: {namespace}")
response = data_client.retrieve_memory_records(
memoryId=MEMORY_ID,
namespace=namespace,
searchCriteria={"searchQuery": query}
)
records = response.get('memoryRecordSummaries', [])
print(f"✓ Retrieved {len(records)} preference records")
return records
except Exception as e:
print(f"好み取得エラー: {e}")
return []
def get_session_summaries(actor_id: str, session_id: str = None) -> list:
"""セッションサマリーを取得(SUMMARIZATIONストラテジー)"""
if not data_client or not MEMORY_ID:
return []
try:
if session_id:
namespace = f"/summaries/{actor_id}/{session_id}"
else:
namespace = f"/summaries/{actor_id}"
query = "session summary"
print(f" Summaries Namespace: {namespace}")
response = data_client.retrieve_memory_records(
memoryId=MEMORY_ID,
namespace=namespace,
searchCriteria={"searchQuery": query}
)
records = response.get('memoryRecordSummaries', [])
print(f"✓ Retrieved {len(records)} summary records")
return records
except Exception as e:
print(f"サマリー取得エラー: {e}")
return []
def build_context_prompt_with_strategies(base_prompt: str, short_term: list,
facts: list, preferences: list,
summaries: list) -> str:
"""3つのストラテジーからの情報を統合してプロンプトを構築"""
context_parts = []
# 事実・知識
if facts:
context_parts.append("【ユーザーについての事実】")
for record in facts:
content = record.get('content', record.get('summary', ''))
if content:
context_parts.append(f"- {content}")
# ユーザーの好み
if preferences:
context_parts.append("\n【ユーザーの好み】")
for record in preferences:
content = record.get('content', record.get('summary', ''))
if content:
context_parts.append(f"- {content}")
# セッションサマリー
if summaries:
context_parts.append("\n【過去のセッション】")
for record in summaries:
content = record.get('content', record.get('summary', ''))
if content:
context_parts.append(f"- {content}")
# 短期記憶(会話履歴)
if short_term:
context_parts.append("\n【今回の会話】")
for event in reversed(short_term):
payload = event.get('payload', [])
for item in payload:
if 'conversational' in item:
conv = item['conversational']
role = conv.get('role', '')
content = conv.get('content', {}).get('text', '')
if role == 'USER':
context_parts.append(f"ユーザー: {content}")
elif role == 'ASSISTANT':
context_parts.append(f"アシスタント: {content}")
if context_parts:
return "\n".join(context_parts) + f"\n\n【現在のリクエスト】\n{base_prompt}"
return base_prompt
# AgentCore Appの初期化
app = BedrockAgentCoreApp()
@app.entrypoint
def invoke_agent(payload, context):
"""エージェントのエントリーポイント"""
prompt = payload.get("inputText", "")
# Session IDの取得
session_id = ""
if hasattr(context, "sessionId"):
session_id = context.sessionId
elif hasattr(context, "session_id"):
session_id = context.session_id
elif isinstance(context, dict):
session_id = context.get("sessionId", context.get("session_id", ""))
print(f"=== AgentCore Memory Demo ===")
print(f"Session ID: {session_id}")
# Session IDからUser IDを抽出
user_id = "default"
if session_id and session_id.startswith("session-"):
parts = session_id.split("-")
if len(parts) >= 2:
user_id = parts[1]
actor_id = f"user-{user_id}"
print(f"Actor ID: {actor_id}")
# 3つのストラテジーからメモリを取得
short_term = get_short_term_memory(actor_id, session_id)
facts = get_semantic_facts(actor_id)
preferences = get_user_preferences(actor_id)
summaries = get_session_summaries(actor_id)
# ユーザーの入力を保存
save_event(actor_id, session_id, "USER", prompt)
# 3つのストラテジーからの情報を統合してプロンプトを構築
full_prompt = build_context_prompt_with_strategies(
prompt, short_term, facts, preferences, summaries
)
# エージェントを実行
agent = Agent(
model=MODEL,
system_prompt=load_prompt("agent_prompt.txt")
)
response = agent(full_prompt)
# アシスタントの応答を保存
response_text = str(response.message)
save_event(actor_id, session_id, "ASSISTANT", response_text)
return response_text
# アプリケーションを起動
app.run()
コードの解説
ポイント:
-
3つのストラテジーからの取得:
get_semantic_facts、get_user_preferences、get_session_summariesで、それぞれの名前空間から情報を取得 -
名前空間の設計:
- 事実:
/users/{actorId}/facts - 好み:
/users/{actorId}/preferences - サマリー:
/summaries/{actorId}/{sessionId}
- 事実:
-
フィールド名の注意: メモリレコードの内容は
contentフィールドに格納されている -
プロンプトの構造化:
build_context_prompt_with_strategiesで、事実・好み・サマリー・会話履歴を明確に分けて提示
デプロイ
AgentCoreへのデプロイ
agentcore configure --entrypoint app.py
対話形式で設定します:
- Agent name: Enterを押せばPythonファイル名に合わせてくれます。appだと見分けにくいので命名推奨。
- 依存関係: Enter(requirements.txtを使用)
- デプロイタイプ: Enter(Direct Code Deploy)
-
Python version:
2(Python 3.11) - 実行ロール: Enter(自動作成)
-
認証:
no - メモリ: Enter(新規作成)
-
長期記憶:
yes← デフォルトはnoですが今回検証のためにONにしました
.bedrock_agentcore.yamlが生成されます。
agentcore launch
デプロイが完了したら、.bedrock_agentcore.yamlに記述されたメモリIDを確認します:
あるいは下記でも確認できます。
agentcore memory list
出力例:
Memory ID: app_mem-xxxxxxxx
Name: app-memory
Status: ACTIVE
環境変数の設定
.envファイルにメモリIDを追加:
AWS_ACCESS_KEY_ID=your_access_key_id
AWS_SECRET_ACCESS_KEY=your_secret_access_key
AWS_DEFAULT_REGION=ap-northeast-1
MODEL=jp.anthropic.claude-haiku-4-5-20251001-v1:0
MEMORY_ID=app_mem-xxxxxxxx # ← 追加
メモ: 今回のやり方では--envオプションで明示的に渡してもう一度デプロイしなおす必要があります:
agentcore launch --auto-update-on-conflict \
--env MEMORY_ID=app_mem-xxxxxxxx \
--env MODEL=jp.anthropic.claude-haiku-4-5-20251001-v1:0
参考:オブザーバビリティ
今回はメインで取り扱いませんが、AgentCore重要機能の一つであるオブザーバビリティについてマネジメントコンソールの画面を紹介します。確かにわかりやすい
Runtime metrics
Amazon Bedrock AgentCore -> エージェントランタイム -> エンドポイント -> Dashboard

メモリー
Amazon Bedrock AgentCore -> メモリー

動作確認
会話の実行
ユーザー001として会話してみます:
# 自己紹介と事実を伝える。ユーザーIDはsession-の後です。
agentcore invoke '{"inputText": "こんにちは。太郎です。Pythonのデータ分析を勉強しています"}' \
--session-id session-001-abc123def456ghi789jkl000
# そのまま続けて好みを伝える
agentcore invoke '{"inputText": "私は実践的な例を見ながら学ぶのが好きです。理論だけだと眠くなります"}' \
--session-id session-001-abc123def456ghi789jkl000
# 同じセッションで質問してみる
agentcore invoke '{"inputText": "私の名前は?"}' \
--session-id session-001-abc123def456ghi789jkl000
問題なく会話を覚えていそうです
Response:
{'role': 'assistant', 'content': [{'text': 'こんにちは、太郎さん!\n\n**ここまでの会話内容をまとめます:**\n\n1.
**自己紹介**\n - あなたは太郎さん\n - Pythonのデータ分析を勉強中\n - PandasとMatplotlibを使用\n\n2.
**あなたの学習スタイル** ⭐重要\n - 実践的な例(コード)を見ながら学ぶのが好き...(以下略)'}]}
ログの確認
CloudWatch Logsでエージェントの動作を確認できます:
# このスクリプトはエージェント実行時にターミナルに表示されています
aws logs tail /aws/bedrock-agentcore/runtimes/app-xxxxxxxx-DEFAULT \
--log-stream-name-prefix "2xx/xx/xx/[runtime-logs" --follow
ログには以下のような出力が表示されます:
=== AgentCore Memory Demo ===
Session ID: session-001-abc123def456ghi789jkl000
Actor ID: user-001
Facts Namespace: /users/user-001/facts
✓ Retrieved 2 fact records
Preferences Namespace: /users/user-001/preferences
✓ Retrieved 1 preference records
Summaries Namespace: /summaries/user-001
✓ Retrieved 0 summary records
✓ Event saved: USER
✓ Event saved: ASSISTANT
別のユーザーで確認
ユーザー002として会話してみます:
agentcore invoke '{"inputText": "私の名前は?"}' \
--session-id session-002-xyz123def456ghi789jkl000
ユーザー001の情報(太郎さん)は返ってこないことが確認できます。これは、名前空間によってユーザーごとにデータが分離されているためです。
Response:
{'role': 'assistant', 'content': [{'text':
'申し訳ありませんが、これが私たちの最初の会話です。以前のお話はないようです。...(以下略)'}]}
ユーザーが002として扱われ、記憶データも入っていないことがわかります。
ログも見てみます。
# ログの抜粋
✓ AgentCore data client initialized
=== Phase 3: Built-in Strategies ===
Actor ID: user-002 # ユーザーは002
✓ Retrieved 0 events from short-term memory # 短期記憶なし
Facts Namespace: /users/user-002/facts
Query: user facts knowledge information
✓ Retrieved 0 fact records # ファクトデータ何も引用できず
Preferences Namespace: /users/user-002/preferences
Query: user preferences likes dislikes style
✓ Retrieved 0 preference records # 好みのデータ何も引用できず
Summaries Namespace: /summaries/user-002
✓ Retrieved 0 summary records # 要約データ何も引用できず
✓ Event saved: USER
長期記憶の確認
次は長期記憶の確認です。ユーザーは001としながら、別のセッションを開始した時にエージェント側は001のことを覚えられているのか確認してみます。
# ユーザーは001のままセッションID末尾を変更。会話自体は新規で開始される
agentcore invoke '{"inputText": "私のこと覚えて います?"}' --session-id session-001-abc123def456ghi789jkl9999
正確にユーザーのことを把握しているようです。
Response:
{'role': 'assistant', 'content': [{'text': 'こんにちは、太郎さん!会話内容を整理してお伝えします。\n\n## 📚
これまでの話の流れ\n\n**1. あなたについて**\n- Pythonのデータ分析を勉強中\n- pandasとmatplotlibを使用している\n-
**実践的なコード例を見ながら学ぶのが好き**(理論だけだと眠くなるタイプ)\n\n**2. アシスタントの対応方針**\n-
理論的な説明は最小限に\n- **実際に動くコード例を中心**に説明する\n- あなたのスタイルに合わせて進める\n\n**3.
具体例**\n- 月別売上推移のようなデータ分析の実例をコードで提示しました\n\n## 🎯
次のステップ\n\nここからどうしたいですか?例えば:\n- ✅ 具体的なデータ分析テーマを決めて練習したい\n- ✅
pandasの特定の操作方法を学びたい\n- ✅ matplotlibでグラフを作る方法を知りたい\n- ✅
新しいテーマから始めたい\n\nどんなことをやってみたいですか?'}]}
先ほど同様の方法でログを見てみます。
# ログ1部抜粋
✓ AgentCore data client initialized
=== Phase 3: Built-in Strategies ===
Session ID: session-010-abc123def456ghi789jkl999 # 新規セッション
Actor ID: user-010
✓ Retrieved 0 events from short-term memory # 新規なので短期記憶なし
Facts Namespace: /users/user-010/facts
Query: user facts knowledge information
✓ Retrieved 2 fact records # ファクト情報を検索できている
DEBUG: First record keys: ['memoryRecordId', 'content', 'memoryStrategyId', 'namespaces', 'createdAt', 'score']
DEBUG: First record content: {'text': '太郎はpandasとmatplotlibを使っている'}
Preferences Namespace: /users/user-010/preferences
Query: user preferences likes dislikes style
✓ Retrieved 2 preference records # 嗜好の話題を検索できている
Summaries Namespace: /summaries/user-010
✓ Retrieved 2 summary records # 要約を検索できている
✓ Event saved: USER
短期記憶でなく、このユーザーとの長期記憶から会話を続けようとしていることがわかります。期待通りの結果です。
メモ
体感ですが、長期記憶が固定されるまで数分かかるように思います
実装のポイント
名前空間の設計
組み込みストラテジーを使う場合、以下のデフォルト名前空間を使用します:
| ストラテジー | 名前空間パターン |
|---|---|
| SEMANTIC | /users/{actorId}/facts |
| USER_PREFERENCE | /users/{actorId}/preferences |
| SUMMARIZATION | /summaries/{actorId}/{sessionId} |
プロンプトの構造化
記憶の種類ごとに明確に分けて提示することで、LLMが適切に文脈を理解しやすくなると思います:
【ユーザーについての事実】
- 太郎です
- Pythonのデータ分析を勉強しています
【ユーザーの好み】
- 実践的な例を見ながら学ぶのが好き
【今回の会話】
ユーザー: 私の名前は?
【現在のリクエスト】
私の名前は?
まとめ
本記事では、Amazon Bedrock AgentCore Memoryを使って、記憶機能付きAIエージェントを実装しました。
ChatGPTやClaudeでも記憶機能は充実してきていますが、それと似たようなことが割と簡単にできるというのが結構嬉しいポイントだなと思います。
AgentCoreの他の機能
本記事ではMemoryに焦点を当てましたが、AgentCoreには他にも多くの機能があります:
AgentCore Gateway
- 既存のAPI/Lambda関数をMCP互換ツールに変換
- 統一的なツールアクセスを提供
- OAuth認証、API Key認証に対応
- Salesforce、Slack、Jiraなどの1クリック統合
AgentCore Identity
- エージェントの認証・認可を管理
- OAuth 2.0フロー(Authorization Code Grant、Client Credentials Grant)をサポート
- トークンボルトで安全にクレデンシャルを保管
- IAM、Cognito、JWT認証に対応
AgentCore Code Interpreter
- エージェントが生成したコードを安全に実行
- サンドボックス環境で分離
- Python実行環境を提供
AgentCore Browser
- エージェントがWebブラウザを操作
- セッション分離、記録機能
- Web自動化ワークフローに対応
AgentCore Observability
- X-Ray、CloudWatch統合
- エージェントの実行をステップバイステップで可視化
- メトリクス、ログ、トレースの統合監視
これらの機能を組み合わせることで、より高度なエージェントシステムを構築できます。特に、Gateway + Identity + Memoryの組み合わせは、本番環境でのエンタープライズグレードのエージェントにかなり有用な気はしますので深掘りしていきたいなと思います。
リソースの削除
検証が終わったら、リソースを削除しておきましょう。
# エージェントとメモリを削除
agentcore destroy --agent-name app
# 確認
agentcore list
agentcore memory list
注意: メモリを削除すると、保存されていた全ての会話履歴と長期記憶が失われます。必要なデータは事前にバックアップしてください。
参考文献
AWS公式ドキュメント
- Amazon Bedrock AgentCore Documentation
- Memory strategies - Amazon Bedrock AgentCore
- Built-in strategies - Amazon Bedrock AgentCore
- Specify long-term memory organization with namespaces
- Get started with the Amazon Bedrock AgentCore starter toolkit
AWSブログ
- Building smarter AI agents: AgentCore long-term memory deep dive
- Amazon Bedrock AgentCore Memory: Building context-aware agents
- Move your AI agents from proof of concept to production with Amazon Bedrock AgentCore
- Introducing Amazon Bedrock AgentCore: Securely deploy and operate AI agents at any scale
コミュニティ
あとがき
AWSのリソース情報を調べるのにAWS Knowledge MCP Serverが便利すぎますね。