🤖

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ダッシュボードで監視できます:

https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#gen-ai-observability/agent-core

※ データが表示されるまで最大10分かかる場合があります。


補足: SDKアーキテクチャ

bedrock-agentcorestrands-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での管理ができない
  • プロトタイピング向け

参考リンク

公式ドキュメント

メモリ機能

カスタムドメイン

Discussion