
Amazon Bedrock AgentCoreで始めるエージェント開発
こんにちは!AI事業本部のこーすけです。
今回は、Amazon Bedrock AgentCoreについて、実際にエージェントをデプロイしながら紹介していきます。
はじめに
ChatGPTが登場して約3年が経ちました。当時は「LLM」という言葉も真新しく、AIと自然に会話できるというだけで衝撃を受けたことを覚えています。学習データに含まれる知識をもとに質問に答えてくれますが、外部の情報にアクセスする手段は持っていませんでした。
しかし、この3年でLLMを取り巻く技術は急速に進化しています。
LLMは学習時のデータしか知らないという課題を解決するため、RAG(検索拡張生成)が普及しました。テスト中に教科書を持ち込めるようなイメージで、外部の情報を検索してプロンプトに含めることで、回答の幅を広げる手法です。
さらにLLMを外界と接続させる動きも活発になり、Function CallingやTool Useと呼ばれる手法、最近ではMCPにより、LLMが検索エンジンや外部APIを呼び出せるようになりました。今日の天気を調べたり、社内システムを操作したり、素のLLMではできなかったことが可能になってきています。
ただし、これらの技術では、どのツールを使うか、どの情報源を検索するかといった設計は人間が事前に行う必要がありました。エージェントは違います。ゴールを与えるだけで、自ら計画を立て、必要なツールを選び、複数のステップを自律的に実行できる存在です。
本記事では、AWSでのエージェント開発を支える「AgentCore」の機能を、実際に触りながら紹介していきます。
Amazon Bedrock AgentCoreとは
Amazon Bedrock AgentCoreはAIエージェントをローカルの試作段階から、本番環境で安全かつ大規模に運用するためのマネージド基盤です。特定のフレームワークやモデルに依存しない開発ができるほか、ダッシュボード(Observability)を備えており、エージェントの複雑な推論ステップを追跡できます。
Amazon Bedrock AgentCoreは複合して使用できる様々なサービスからなっています。
- Runtime:エージェントを実行するためのサーバーレスランタイム
- Memory:エージェントの会話履歴や状態を永続化するためのメモリ機能
- Gateway:外部クライアントからエージェントを呼び出すためのAPIエントリーポイント
- Identity:エージェント実行時の認証・認可や権限を管理するための仕組み
- Built-in Tools:エージェントからすぐに使えるツール群
- Code Interpreter:コードを安全に実行するためのツール
- Browser:Webページへアクセスし情報を取得するためのツール
- Observability:推論やツール実行など、エージェントの内部挙動を可視化するための機能
- Evaluations:エージェントの出力品質を評価・比較するための評価機能
順番に触っていきますが、今回はRuntimeについて深掘りしていきます。
Amazon Bedrock AgentCore Runtimeとは
AgentCore Runtimeは、AIエージェントをAWS上でホスティングするためのサーバーレス実行環境です。
私個人的に思う特徴は以下の通りです。
- フレームワーク非依存: LangGraph、Strands Agentsなど、好みのフレームワークで開発したエージェントをそのままデプロイできます。
- サーバーレス: インフラの管理が不要で、リクエストに応じて自動的にスケールします。
- ストリーミング対応: エージェントの応答をリアルタイムでストリーミング出力できます。
開発者はエージェントのロジックに集中でき、デプロイや運用の複雑さはAgentCore Runtimeが吸収してくれます。
デプロイまでの手順
前提
私が使用したpythonバージョンは3.13.5で、ライブラリ等のバージョンは以下の通りです。
bedrock-agentcore: 1.2.0
bedrock-agentcore-starter-toolkit: 0.2.8
strands-agents: 1.23.0
strands-agents-tools: 0.2.19
今回は、Amazon Bedrock AgentCore starter toolkitを使用してエージェントをデプロイします。
公式サイトにハンズオンの手順が記載されているので、そちらも参考になります。
仮想環境の構築
uvで仮想環境を作成します。以下のコマンドを実行しました。
uv venv
source .venv/bin/activate
uv add bedrock-agentcore strands-agents bedrock-agentcore-starter-toolkit
エージェントの作成
main.pyにエージェントを作成しました。ツールを1つ渡したシンプルな構成です。モデルはClaude 3.5 Sonnetを使用しています。
from strands import Agent, tool
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp
app = BedrockAgentCoreApp()
log = app.logger
def load_model() -> BedrockModel:
return BedrockModel(
model_id="anthropic.claude-3-5-sonnet-20240620-v1:0",
region_name="us-east-1"
)
@tool
def add_numbers(a: int, b: int) -> int:
return a + b
@app.entrypoint
async def entrypoint(payload):
# エージェントの作成
agent = Agent(
model=load_model(),
system_prompt="""
必要に応じてツールを使用して、ユーザーの質問に答えてください。
特に計算が必要な場合は、add_numbersツールを活用してください。
""",
tools=[add_numbers]
)
# プロンプトの取得
prompt = payload.get("prompt", "")
# ストリーミングレスポンスの生成
stream = agent.stream_async(prompt)
async for message in stream:
if "event" in message:
yield message
# テスト用
async def test_agent():
"""
エージェントのテスト関数
"""
test_payloads = [
{"prompt": "123と456を足してください"},
]
for payload in test_payloads:
# エージェントを実行
async for chunk in entrypoint(payload):
pass
print("\n" + "-" * 50)
if __name__ == "__main__":
# AgentCore Runtimeとして起動
app.run()
# ローカルテストを実行する場合は以下をコメントアウトして使用
# import asyncio
# asyncio.run(test_agent())
ローカルで検証
「123と456を足してください」というプロンプトでテスト用の関数を実行してみました。

ストリーミングで回答が出力され、ツールを使用して正しく回答がされていることを確認できました。
デプロイ設定
続いてagentcore configureコマンドを実行し、デプロイの設定を行います。
agentcore configure --entrypoint main.py
❯ agentcore configure --entrypoint main.py
Configuring Bedrock AgentCore...
✓ Using file: main.py
🏷️ Inferred agent name: main
Press Enter to use this name, or type a different one (alphanumeric without '-')
Agent name [main]:
✓ Using agent name: main
🔍 Detected dependency file: pyproject.toml
Press Enter to use this file, or type a different path (use Tab for autocomplete):
Path or Press Enter to use detected dependency file: pyproject.toml
✓ Using requirements file: pyproject.toml
🚀 Deployment Configuration
Warning: Direct Code Deploy deployment unavailable (zip utility not found). Falling back to Container deployment.
Select deployment type:
1. Container - Docker-based deployment
✓ Deployment type: Container
🔐 Execution Role
Press Enter to auto-create execution role, or provide execution role ARN/name to use existing
Execution role ARN/name (or press Enter to auto-create):
✓ Will auto-create execution role
🏗️ ECR Repository
Press Enter to auto-create ECR repository, or provide ECR Repository URI to use existing
ECR Repository URI (or press Enter to auto-create):
✓ Will auto-create ECR repository
🔐 Authorization Configuration
By default, Bedrock AgentCore uses IAM authorization.
Configure OAuth authorizer instead? (yes/no) [no]:
✓ Using default IAM authorization
🔒 Request Header Allowlist
Configure which request headers are allowed to pass through to your agent.
Common headers: Authorization, X-Amzn-Bedrock-AgentCore-Runtime-Custom-*
Configure request header allowlist? (yes/no) [no]:
✓ Using default request header configuration
Configuring BedrockAgentCore agent: main
Memory Configuration
Tip: Use --disable-memory flag to skip memory entirely
No existing memory resources found in your account
Options:
• Press Enter to create new memory
• Type 's' to skip memory setup
Your choice: s
✓ Skipping memory configuration
Memory disabled by user choice
Network mode: PUBLIC
⚠️ Platform mismatch: Current system is 'linux/amd64' but Bedrock AgentCore requires 'linux/arm64', so local builds won't work.
Please use default launch command which will do a remote cross-platform build using code build.For deployment other options and workarounds, see: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/getting-started-custom.html
📄 Generated Dockerfile: /home/project/.bedrock_agentcore/main/Dockerfile
Setting 'main' as default agent
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────── Configuration Success ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Agent Details │
│ Agent Name: main │
│ Deployment: container │
│ Region: ap-northeast-1 │
│ Account: ****** │
│ │
│ Configuration │
│ Execution Role: Auto-create │
│ ECR Repository: Auto-create │
│ Network Mode: Public │
│ ECR Repository: Auto-create │
│ Authorization: IAM (default) │
│ │
│ │
│ Memory: Disabled │
│ │
│ │
│ 📄 Config saved to: /home/project/.bedrock_agentcore.yaml │
│ │
│ Next Steps: │
│ agentcore deploy │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
基本的にデフォルト値のまま設定しました。実行用のIAMロールやコンテナイメージの保存先は自動で作成を行ってくれるため非常に便利です。
今回はMemory機能を別途検証したいため、オフに設定しています。
agentcore configureを実行すると、作業フォルダ以下に3つのセッティングファイルが作成されます。
project/
├── .bedrock_agentcore.yaml # AgentCore 設定ファイル
├── .dockerignore # Docker ignore
└── .bedrock_agentcore/
└── main/
└── Dockerfile # Dockerfile
.bedrock_agentcore.yaml
default_agent: main
agents:
main:
name: main
language: python
node_version: '20'
entrypoint: main.py
deployment_type: container
runtime_type: null
platform: linux/arm64
container_runtime: docker
source_path: project
aws:
execution_role: arn:aws:iam::************:role/AmazonBedrockAgentCoreSDKRuntime-ap-northeast-1-0d6e4079e3
execution_role_auto_create: false
account: '************'
region: ap-northeast-1
ecr_repository: ************.dkr.ecr.ap-northeast-1.amazonaws.com/bedrock-agentcore-main
ecr_auto_create: false
s3_path: null
s3_auto_create: false
network_configuration:
network_mode: PUBLIC
network_mode_config: null
protocol_configuration:
server_protocol: HTTP
observability:
enabled: true
lifecycle_configuration:
idle_runtime_session_timeout: null
max_lifetime: null
bedrock_agentcore:
agent_id: main-qg5Yyx2SKa
agent_arn: arn:aws:bedrock-agentcore:ap-northeast-1:************:runtime/main-qg5Yyx2SKa
agent_session_id: e8eb4555-c1e6-4a8b-a833-6a8fc4bf945b
codebuild:
project_name: bedrock-agentcore-main-builder
execution_role: arn:aws:iam::************:role/AmazonBedrockAgentCoreSDKCodeBuild-ap-northeast-1-0d6e4079e3
source_bucket: bedrock-agentcore-codebuild-sources-************-ap-northeast-1
memory:
mode: NO_MEMORY
memory_id: null
memory_arn: null
memory_name: null
event_expiry_days: 30
first_invoke_memory_check_done: false
was_created_by_toolkit: false
identity:
credential_providers: []
workload: null
aws_jwt:
enabled: false
audiences: []
signing_algorithm: ES384
issuer_url: null
duration_seconds: 300
authorizer_configuration: null
request_header_configuration: null
oauth_configuration: null
api_key_env_var_name: null
api_key_credential_provider_name: null
is_generated_by_agentcore_create: false
Dockerfile
FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim
WORKDIR /app
# All environment variables in one layer
ENV UV_SYSTEM_PYTHON=1 \
UV_COMPILE_BYTECODE=1 \
UV_NO_PROGRESS=1 \
PYTHONUNBUFFERED=1 \
DOCKER_CONTAINER=1 \
AWS_REGION=ap-northeast-1 \
AWS_DEFAULT_REGION=ap-northeast-1
COPY . .
# Install from pyproject.toml directory
RUN cd . && uv pip install .
RUN uv pip install aws-opentelemetry-distro==0.12.2
# Signal that this is running in Docker for host binding logic
ENV DOCKER_CONTAINER=1
# Create non-root user
RUN useradd -m -u 1000 bedrock_agentcore
USER bedrock_agentcore
EXPOSE 9000
EXPOSE 8000
EXPOSE 8080
# Copy entire project (respecting .dockerignore)
COPY . .
# Use the full module path
CMD ["opentelemetry-instrument", "python", "-m", "main"]
デプロイの実行
続いてagentcore deployコマンドでAWS にエージェントをデプロイします。完了まで3分ほどかかりました。
agentcore deploy
デプロイが完了すると以下の内容が出力されました。
╭───────────────────────────────────────────────────────────────────────────────────────────────────────────── Deployment Success ─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Agent Details: │
│ Agent Name: main │
│ Agent ARN: arn:aws:bedrock-agentcore:ap-northeast-1:************:runtime/main-qg5Yyx2SKa │
│ ECR URI: ************.dkr.ecr.ap-northeast-1.amazonaws.com/bedrock-agentcore-main:20260124-102418-858 │
│ CodeBuild ID: bedrock-agentcore-main-builder:1a16c401-1eed-4d27-87da-c886e8e64c29 │
│ │
│ 🚀 ARM64 container deployed to Bedrock AgentCore │
│ │
│ Next Steps: │
│ agentcore status │
│ agentcore invoke '{"prompt": "Hello"}' │
│ │
│ 📋 CloudWatch Logs: │
│ /aws/bedrock-agentcore/runtimes/main-qg5Yyx2SKa-DEFAULT --log-stream-name-prefix "2026/01/24/[runtime-logs]" │
│ /aws/bedrock-agentcore/runtimes/main-qg5Yyx2SKa-DEFAULT --log-stream-names "otel-rt-logs" │
│ │
│ 🔍 GenAI Observability Dashboard: │
│ https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#gen-ai-observability/agent-core │
│ │
│ Note: Observability data may take up to 10 minutes to appear after first launch │
│ │
│ 💡 Tail logs with: │
│ aws logs tail /aws/bedrock-agentcore/runtimes/main-qg5Yyx2SKa-DEFAULT --log-stream-name-prefix "2026/01/24/[runtime-logs]" --follow │
│ aws logs tail /aws/bedrock-agentcore/runtimes/main-qg5Yyx2SKa-DEFAULT --log-stream-name-prefix "2026/01/24/[runtime-logs]" --since 1h │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
コンソールからも作成されていることが確認できました。

動作確認
CLIから呼び出す
以下のプロンプトを入力として、agentcore invokeコマンドを呼び出してみます。
agentcore invoke '{"prompt": "123+456は?"}'
ストリーミングでレスポンスが返ってくることを確認できました。
❯ agentcore invoke '{"prompt": "123+456は?"}'
{"event": {"messageStart": {"role": "assistant"}}}
{"event": {"contentBlockDelta": {"delta": {"text": "この"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "計算を行う"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "ために、ad"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "d_numbersツ"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "ールを使用"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "しましょう。"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "123"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "と456を"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "足し"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "合わせる"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "必要があります。"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockStop": {"contentBlockIndex": 0}}}
{"event": {"contentBlockStart": {"start": {"toolUse": {"toolUseId": "tooluse_PJQtRSZCTMy32Q-Iyt6W0w", "name": "add_numbers"}}, "contentBlockIndex": 1}}}
{"event": {"contentBlockDelta": {"delta": {"toolUse": {"input": ""}}, "contentBlockIndex": 1}}}
{"event": {"contentBlockDelta": {"delta": {"toolUse": {"input": "{\""}}, "contentBlockIndex": 1}}}
{"event": {"contentBlockDelta": {"delta": {"toolUse": {"input": "a\": 123"}}, "contentBlockIndex": 1}}}
{"event": {"contentBlockDelta": {"delta": {"toolUse": {"input": ", \"b\": 456}"}}, "contentBlockIndex": 1}}}
{"event": {"contentBlockStop": {"contentBlockIndex": 1}}}
{"event": {"messageStop": {"stopReason": "tool_use"}}}
{"event": {"metadata": {"usage": {"inputTokens": 439, "outputTokens": 108, "totalTokens": 547}, "metrics": {"latencyMs": 2462}}}}
{"event": {"messageStart": {"role": "assistant"}}}
{"event": {"contentBlockDelta": {"delta": {"text": "計"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "算結果が"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "返ってきました"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "。123 + 456 "}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": "の答えは 579"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockDelta": {"delta": {"text": " です。"}, "contentBlockIndex": 0}}}
{"event": {"contentBlockStop": {"contentBlockIndex": 0}}}
{"event": {"messageStop": {"stopReason": "end_turn"}}}
{"event": {"metadata": {"usage": {"inputTokens": 559, "outputTokens": 30, "totalTokens": 589}, "metrics": {"latencyMs": 1717}}}}
boto3から呼び出す
続いて、pythonプログラムからも呼び出してみます。ここではログが見やすいように、session_idを1ラリーごとに付与しています。
import boto3
import json
import uuid
client = boto3.client('bedrock-agentcore', region_name="ap-northeast-1")
def streaming(response):
for line in response["response"].iter_lines(chunk_size=5):
if line:
line_text = line.decode("utf-8")
if line_text.startswith("data: "):
line_text = line_text[6:]
data = json.loads(line_text)
yield data
def main():
prompts = [
"123と456を足してください",
]
for prompt in prompts:
# 各リクエストごとに一意のIDを生成
session_id = str(uuid.uuid4())
print("=" * 60)
print(f"プロンプト: {prompt}")
print("=" * 60)
print()
input_payload = {"prompt": prompt}
try:
# エージェントランタイムを呼び出し
response = client.invoke_agent_runtime(
agentRuntimeArn="arn:aws:bedrock-agentcore:ap-northeast-1:************:runtime/main-qg5Yyx2SKa",
runtimeSessionId=session_id, # セッション管理用
qualifier="DEFAULT",
payload=json.dumps(input_payload)
)
# ストリーミングでレスポンスを処理
text_buffer = []
for chunk in streaming(response):
event_obj = chunk.get("event", {})
# メッセージ開始
if "messageStart" in event_obj:
pass
# コンテンツブロック開始
elif "contentBlockStart" in event_obj:
start = event_obj.get("contentBlockStart",{}).get("start", {})
# ツール使用開始
if "toolUse" in start:
tool = start["toolUse"]
tool_name = tool.get("name", "unknown")
print(f"\n[ツール使用: {tool_name}] ", flush=True)
# コンテンツデルタ
elif "contentBlockDelta" in event_obj:
delta = event_obj.get("contentBlockDelta",{}).get("delta", {})
# テキストデルタ
if "text" in delta:
text = delta["text"]
print(text, end="", flush=True)
text_buffer.append(text)
# ツール入力デルタ
elif "toolUse" in delta:
pass
# コンテンツブロック終了
elif "contentBlockStop" in event_obj:
pass
# メッセージ終了
elif "messageStop" in event_obj:
pass
except client.exceptions.ResourceNotFoundException:
print("エラー: ランタイムが見つかりません")
except Exception as e:
print(f"エラー: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()
こちらもストリーミングで返ってくることを確認できました!

ログを確認する
デプロイしたエージェントの挙動は、AgentCore の Observability ダッシュボードから詳細に確認できます。
まず、エージェントランタイムの一覧から作成したエージェントを選択し、「ダッシュボード」を押下します。

ダッシュボードでは、これまでに実行されたセッション一覧が表示されます。
セッションを選択します。

続いて、セッションに紐づくトレースIDを選択すると、そのリクエストに対してエージェントが実行した一連のアクション(推論やツール呼び出し)を時系列で確認できます。

今回の例では、
- LLMの推論ステップ
add_numbersツールの呼び出し- ツール実行後の最終レスポンス生成
といった流れを確認でき、エージェントがどの判断でツールを使用したのかを追跡できました。
このようにAgentCoreのObservability機能を使うことで、
- 想定外のツールが呼ばれていないか
- どのステップで時間がかかっているか
- プロンプト設計やツール定義に問題がないか
といった点を、トレースをもとにデバッグできます。
エージェントは内部で複数の推論・判断を行うため、ブラックボックス化しがちな挙動を可視化できる点は、開発から本番運用において非常に大きなメリットだと感じました。
おわりに
今回は、Amazon Bedrock AgentCore Runtimeを使って、シンプルなエージェントをAWS上にデプロイする手順と、ログの確認方法を紹介しました。
agentcoreコマンドを使うことで、IAMロールやECRリポジトリの作成からデプロイまでを簡単に行えることがわかりました。特定のフレームワークに依存せず、Strands Agentsで作成したエージェントをそのままデプロイできる点も魅力的です。
次回以降は、AgentCoreの他の機能(Memory、Gatewayなど)についても触っていきたいと思います。








