Strands AgentsをAmazon Bedrock AgentCore Runtimeにデプロイする
Strands AgentsをAmazon Bedrock AgentCore Runtimeにデプロイしてみた
はじめに
本記事は、Strands Agents公式ドキュメントのPython Deployment to Amazon Bedrock AgentCore Runtimeに沿って、実際にデプロイを試した記録です。
Amazon Bedrock AgentCore Runtimeは、AIエージェントをAWS上でホスティングするためのマネージドサービスです。Strands Agentsフレームワークを使用してシンプルなエージェントを作成し、AgentCore Runtimeにデプロイする手順を紹介します。
前提条件
- Python 3.10以上
- AWSアカウントと適切なIAM権限
- AWS CLI設定済み
- uv(Pythonパッケージマネージャー)
デプロイ方法の選択
AgentCore Runtimeへのデプロイには2つのアプローチがあります:
| 方法 | 特徴 | 用途 |
|---|---|---|
| Option A: SDK Integration | 自動HTTPサーバー設定、デプロイツール内蔵 | シンプルなエージェント、プロトタイピング |
| Option B: Custom Agent | FastAPIで完全制御、カスタムルーティング | 複雑なエージェント、本番システム |
今回はOption A: SDK Integrationを使用します。
セットアップ〜デプロイ
Step 1: プロジェクトの作成
mkdir strands-agentcore && cd strands-agentcore
uv init --python 3.11
Step 2: 依存関係のインストール
uv add strands-agents bedrock-agentcore bedrock-agentcore-starter-toolkit
インストールされる主要パッケージ:
-
strands-agents: Strands Agentsフレームワーク(LLM呼び出し) -
bedrock-agentcore: AgentCore Runtime SDK(HTTPサーバー) -
bedrock-agentcore-starter-toolkit: デプロイ自動化ツール
Step 3: エージェントコードの作成
agent_example.pyを作成します:
from strands import Agent
from bedrock_agentcore.runtime import BedrockAgentCoreApp
agent = Agent()
app = BedrockAgentCoreApp()
@app.entrypoint
def invoke(payload):
"""Process user input and return a response"""
user_message = payload.get("prompt", "Hello")
response = agent(user_message)
return str(response)
if __name__ == "__main__":
app.run()
Step 4: __init__.pyの作成
Pythonパッケージとして認識させるため、空の__init__.pyを作成します:
touch __init__.py
Step 5: ローカルテスト
エージェントを起動:
AWS_PROFILE=your_profile uv run python agent_example.py
別ターミナルでテスト:
curl -X POST http://localhost:8080/invocations \
-H "Content-Type: application/json" \
-d '{"prompt":"Hello"}'
レスポンス例:
"Hello! How are you doing today? Is there anything I can help you with?"
Step 6: agentcore configure
agentcore configure --entrypoint agent_example.py
対話形式で以下を設定:
Agent name [agent_example]: (Enter)
Select deployment type:
1. Direct Code Deploy (recommended)
2. Container
Choice [1]: 1
Select Python runtime version:
Choice [2]: 2 # PYTHON_3_11
Execution role ARN/name: (Enter) # 自動作成
S3 URI/path: (Enter) # 自動作成
Memory Configuration:
Your choice: (Enter) # 新規作成
Enable long-term memory? [no]: (Enter)
Step 7: agentcore launch
agentcore launch
デプロイには数分かかります。完了時の出力:
✅ Deployment completed successfully
Agent ARN: arn:aws:bedrock-agentcore:ap-northeast-1:XXXXXXXXXXXX:runtime/agent_example-XXXXXXXXXX
Step 8: デプロイ後のテスト
agentcore invoke '{"prompt": "こんにちは"}'
レスポンス:
Response:
こんにちは! Nice to meet you. Are you interested in practicing Japanese,
or is there something specific I can help you with today?
運用コマンド
# ステータス確認
agentcore status
# エージェント呼び出し
agentcore invoke '{"prompt": "Hello"}'
# ログ確認(リアルタイム)
aws logs tail /aws/bedrock-agentcore/runtimes/agent_example-XXXXXXXXXX-DEFAULT \
--log-stream-name-prefix "$(date +%Y/%m/%d)/[runtime-logs" --follow
# リソース削除
agentcore destroy
Observabilityダッシュボード
CloudWatchのGenAI Observabilityダッシュボードで監視できます:
※ データが表示されるまで最大10分かかる場合があります。
補足: SDKアーキテクチャ
bedrock-agentcoreとstrands-agentsは異なる役割を持っています:
┌─────────────────────────────────────────────────────────────┐
│ クライアント (curl / agentcore invoke) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ bedrock-agentcore SDK (BedrockAgentCoreApp) │
│ - POST /invocations ← エージェント呼び出し │
│ - GET /ping ← ヘルスチェック │
│ - WebSocket /ws ← WebSocket通信 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ strands-agents (Agent) │
│ - Amazon Bedrockモデル呼び出し │
│ - ツール実行 │
└─────────────────────────────────────────────────────────────┘
Strandsなしでも動作可能
bedrock-agentcoreはHTTPサーバーのラッパーなので、Strandsなしでもエージェントを作成できます:
from bedrock_agentcore.runtime import BedrockAgentCoreApp
app = BedrockAgentCoreApp()
@app.entrypoint
def invoke(payload):
user_message = payload.get("prompt", "")
return {"message": f"あなたは「{user_message}」と言いました"}
if __name__ == "__main__":
app.run()
| パターン | 使用ライブラリ |
|---|---|
| 固定値を返す |
bedrock-agentcoreのみ |
| 外部API呼び出し |
bedrock-agentcore + requests
|
| LLM(Bedrock)を使う |
bedrock-agentcore + strands-agents
|
補足: @app.entrypointの詳細
単一エンドポイント設計
AgentCore SDKは「1エージェント = 1エンドポイント」の設計です。@app.entrypointを複数定義すると、最後に定義した関数だけが有効になります。
引数
# パターン1: payloadのみ(基本)
@app.entrypoint
def invoke(payload):
user_message = payload.get("prompt")
return {"response": "..."}
# パターン2: payload + context(拡張)
@app.entrypoint
def invoke(payload, context):
session_id = context.session_id
headers = context.request_headers
return {"response": "..."}
第2引数は必ずcontextという名前にする必要があります。
他のデコレータ
| デコレータ | 用途 |
|---|---|
@app.entrypoint |
メインエンドポイント(/invocations) |
@app.ping |
カスタムヘルスチェック(/ping) |
@app.websocket |
WebSocketハンドラー(/ws) |
@app.async_task |
非同期タスク追跡 |
複数のルーティングが必要な場合はOption B(FastAPI)を使う必要があります。
補足: 設定ファイル
agentcore configure実行後、.bedrock_agentcore.yamlが生成されます:
agents:
agent_example:
deployment_type: direct_code_deploy
runtime_type: PYTHON_3_11
aws:
region: ap-northeast-1
network_configuration:
network_mode: PUBLIC
memory:
mode: STM_ONLY
event_expiry_days: 30
| 項目 | 説明 |
|---|---|
deployment_type |
direct_code_deploy(Dockerなし)またはcontainer
|
runtime_type |
Python 3.10〜3.13から選択 |
network_mode |
PUBLICまたはVPC
|
memory.mode |
STM_ONLY(短期記憶)またはSTM_AND_LTM(長期記憶含む) |
設定を変更する場合は、YAMLを編集後にagentcore launchを実行します。
補足: メモリ機能
AgentCore Memoryは2層構造のメモリシステムを提供します。
STM(短期記憶)とLTM(長期記憶)
┌─────────────────────────────────────────────────────────────┐
│ Short-Term Memory (STM) - 短期記憶 │
│ • セッション内の会話履歴を保持 │
│ • 即座に利用可能、30日間保持 │
└─────────────────────────────────────────────────────────────┘
↓ 非同期抽出(LTM有効時)
┌─────────────────────────────────────────────────────────────┐
│ Long-Term Memory (LTM) - 長期記憶 │
│ • セッション間で永続化 │
│ • ユーザーの好み・事実・パターンを自動抽出 │
└─────────────────────────────────────────────────────────────┘
セッションIDの仕組み
# セッションID未指定 → 自動生成
agentcore invoke '{"prompt": "私は田中です"}'
# → Session: ef57535e-b8b5-4f40-9bf1-5226fee4ff3d
# 同じセッションIDで継続 → 会話を覚えている
agentcore invoke '{"prompt": "私の名前は?"}' --session-id ef57535e-...
# → 「田中さんですね」
# 別のセッションID → 覚えていない
agentcore invoke '{"prompt": "私の名前は?"}' --session-id new-session-xxx...
# → 「お名前をお聞きしていません」
セッションIDは33文字以上が必要です(UUID形式推奨)。
※ 本記事ではLTM(長期記憶)は試していません。詳細は公式ドキュメントを参照してください。
補足: リソース管理
agentcore CLIはCloudFormationを使用しない
agentcore CLIは直接AWS APIを呼び出してリソースを作成します。状態管理はローカルの.bedrock_agentcore.yamlファイルで行われます。
作成されるリソース:
- IAM Role
- S3 Bucket
- AgentCore Runtime
- Memory
- CloudWatch Logs
カスタムドメインの設定
デフォルトではエージェント作成時にユニークなIDが付与されます。固定のカスタムドメインを使用したい場合は、CloudFront + Route 53 + ACMで設定できます。
詳細はAWS公式ブログを参照してください。
まとめ
Strands AgentsをAmazon Bedrock AgentCore Runtimeにデプロイする手順を紹介しました。
メリット:
- 数コマンドでデプロイ可能
- Dockerなしで直接コードをデプロイ
- メモリ機能・Observabilityが組み込み
デメリット:
- CloudFormation/Terraformでの管理ができない
- プロトタイピング向け
参考リンク
公式ドキュメント
- Strands Agents Documentation
- Amazon Bedrock AgentCore Runtime Documentation
- Deploy to Bedrock AgentCore (Python)
メモリ機能
- Amazon Bedrock AgentCore Memory: Building context-aware agents
- Building smarter AI agents: AgentCore long-term memory deep dive
Discussion