Amazon Bedrock AgentCore 完全ガイド:AIエージェントの構築・デプロイ・運用を40代エンジニアが全力で解説するヨ!!
Amazon Bedrock AgentCore 完全ガイド:AIエージェントの構築・デプロイ・運用
ねえねえ、キミ!!AIエージェント、本番で動かそうとした瞬間に、壁が多すぎて「僕にはムリだ……」ってなりかけてナイ!?😭 セッション管理どうすんの?スケーリングは?セキュリティは?……気づいたら朝4時になってる、あのやつデスヨ!!
そんなキミのために、AWSが2026年にプレビュー公開した Amazon Bedrock AgentCore がありますヨ!!「エージェント専用のサーバーレス実行環境」デスネ♪ コレを使えば、インフラ管理から解放されて、エージェントのロジックだけに集中できちゃうんデスヨ!!🔥
この記事では、Amazon Bedrock AgentCore の全9サービスの解説から、Python + Strands Agents での実装例まで、一緒に見ていきましょヨ!!✨
AIエージェント開発が抱える3つの課題
ちゃんとエージェント開発を経験したキミなら、こういう壁にぶつかったことがあるんじゃナイカナ!?💦
壁①:インフラ管理がタイヘン!! セッション管理、スケーリング、セキュリティ……全部自前で実装ってキツくナイ!?しかも、長時間実行(数時間単位)への対応とか、もはや専任チームいるじゃん……という話でサ。
壁②:セキュリティとガバナンスがコワい😭 マルチテナント環境でセッションちゃんと分離できてる?外部APIへのアクセス制御は?認証管理は?……考えれば考えるほど夜眠れなくなるやつデス(笑)
壁③:本番の挙動がよくわからない!! エージェントが何考えてるか見えない、意図しないツール呼び出しをしてる、品質をどう測ればいいかわからない……僕、コレで3回くらいやらかしちゃいましたヨ😭
Amazon Bedrock AgentCore とは:サービス概要と特徴
さて、本題デス!!🎉
Amazon Bedrock AgentCore は、2026年にプレビュー公開された、AIエージェント専用のプラットフォームデスネ♪ ひと言で言えば「エージェント版のAWS Lambda」って感じデスヨ!!
- サーバーレスでエージェントを構築・デプロイ・スケール
- I/O待機時間は課金されない従量課金モデル(コレ地味にアリガタイ!!)
- Python で自由実装 + IaC(CDK)管理 + フレームワーク選択自由🔥
ちなみにサ、「従来の Bedrock Agents となにが違うの?」って思ったキミ!!センスあるネ!!😆 整理するとこんな感じデス。
| Bedrock Agents | AgentCore | |
|---|---|---|
| 実装スタイル | ノーコード寄り | Python で自由実装 |
| IaC管理 | 限定的 | CDK でフル管理 |
| フレームワーク | AWS固定 | LangGraph / CrewAI / LlamaIndex / Strands Agents など |
| 向いてる人 | 非エンジニア・速攻PoC | バックエンド・MLエンジニア |
対応モデルもサ、Claude・Amazon Nova・GPT-4・Gemini・Llama・Mistralって、完全モデル非依存なんデスヨ!!コレ マジでオススメ!!✨
Amazon Bedrock AgentCore を構成する9つのサービス
ねえ、聞いて。僕さ、最初コレ見た時、「サービス多すぎ!!😭」ってなったんだヨネ。でも、ちゃんと整理するとカンタンなんデスヨ♪
💡 「実行」「記憶と接続」「品質と安全性」の3グループで考えるといいデス!!
グループ①:エージェントの実行を担う Amazon Bedrock AgentCore サービス
🔥 Runtime:サーバーレス実行環境 セッション分離・最長8時間の長時間実行に対応!!コンテナベースでのデプロイもできるヨ。「8時間!?」ってなったキミ、正しい反応デス(笑)そう、本当に8時間なんデスヨ😆
🌐 Browser:クラウドブラウザ操作 クラウド上でリアルブラウザを起動・操作できるやつデス。WebスクレイピングとかRPA的なユースケースに超便利!!キミの会社の面倒な手作業も全部エージェントに任せちゃえるヨ🎵
💻 Code Interpreter:サンドボックスコード実行 複数言語のコードを、セキュアな分離環境で実行!コード生成→実行→デバッグの自動化フローが全部エージェントでできちゃうんデスヨ!!スゴくナイ!?✨
グループ②:記憶と外部接続を担う Amazon Bedrock AgentCore サービス
🧠 Memory:コンテキスト保持 会話履歴やユーザー情報を長期保持!!セッションをまたいだパーソナライズも実現できちゃいますヨ😆
🔗 Gateway:外部ツール統合 REST APIやLambda関数をエージェントのツールとして登録できるやつデス。既存システムとの連携が最小工数で実現!!キミの会社にある古いAPIも全部ツール化できちゃうヨ🎵
🔑 Identity:認証・アクセス管理 OAuth・IAMによるアクセス制御デス。エージェントに最小権限を付与するの、コレがないと怖くてしょうがないよネ😭
グループ③:品質と安全性を担う Amazon Bedrock AgentCore サービス
👁️ Observability:監視と可視化 CloudWatch+OpenTelemetryで分散トレーシング!エージェントの思考ステップやツール呼び出しが全部見えるヨ!!コレなかった頃は本当につらかった……😅
📊 Evaluations:品質評価 エージェントの回答精度・ハルシネーション率を定量評価!CI/CDパイプラインに組み込むこともできちゃいますネ♪
🛡️ Policy:アクション制御 ツール呼び出し前に適用するガードレール設定デス。禁止アクションや条件付き許可のルールを定義して、想定外の動きを防ぐヨ!!
ハンズオン:Amazon Bedrock AgentCore に Python + Strands Agents でデプロイする🔥
💬 謎の近況報告デス むかしの同僚と久しぶりに飲んだら終電逃しちゃって、ネカフェでこの記事のコード全部動作確認してたんだヨネ……😅 全部ちゃんと動いたからいいんだケド!!関係ないケドサ!!
コレ見てよ!!スゴくナイ!?✨ 実際にコードで動かしてみましょヨ!!
事前準備
まず、必要なものをインストールデスネ♪
# AWS CLI のインストール確認(未インストールの場合はインストール)
if ! command -v aws &> /dev/null; then
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
rm -rf awscliv2.zip aws/
fi
aws --version
# CDK のインストール確認(未インストールの場合はインストール)
if ! command -v cdk &> /dev/null; then
npm install -g aws-cdk
fi
cdk --version
# Strands Agents のインストール
pip3 install strands-agents strands-agents-tools
# boto3(Bedrock アクセス用)
pip3 install boto3
# AWS CDK Python ライブラリのインストール
pip3 install aws-cdk-lib constructs
# calculate ツールの安全な実装に使用(詳細は後述)
pip3 install simpleeval
# Observability 用(ステップ4で使用)
pip3 install opentelemetry-sdk opentelemetry-exporter-otlp-proto-grpcステップ1:Amazon Bedrock AgentCore 向けエージェントコードの実装
コレ見てよ!!Strands Agents でツール定義してエージェント作るの、こんなにカンタンなんデスヨ!!😆
⚠️ セキュリティ注意:
calculateツールでeval()を使いたくなるケド、任意コードを実行できてしまうため本番環境では使用禁止デスヨ!!代わりにsimpleeval等の専用ライブラリを使う実装例を示しますネ!!
# agent.py
from strands import Agent, tool
from strands.models import BedrockModel
from simpleeval import simple_eval, InvalidExpression
@tool
def get_weather(city: str) -> str:
"""指定した都市の天気情報を取得する"""
# 実際の実装では外部APIを呼び出す
return f"{city}の天気: 晴れ、気温22℃"
@tool
def calculate(expression: str) -> str:
"""数式を計算する(simpleeval を使用した安全な実装)"""
# simpleeval は eval() と異なり、任意コードの実行を防ぐ安全な数式評価ライブラリ
# eval(expression) の直接使用は任意コード実行につながるため避けること
# pip install simpleeval で導入可能
try:
result = simple_eval(expression)
return f"計算結果: {result}"
except InvalidExpression as e:
return f"計算エラー(不正な式): {str(e)}"
except Exception as e:
return f"計算エラー: {str(e)}"
# エージェントの作成
# モデルIDは Bedrock コンソールで利用可能なIDを確認して設定すること
model = BedrockModel(
model_id="us.anthropic.claude-haiku-4-5-20251014:0",
region_name="ap-northeast-1"
)
agent = Agent(
model=model,
tools=[get_weather, calculate],
system_prompt="""あなたは親切なアシスタントです。
天気情報の取得と計算ができます。"""
)
def handler(event, context):
"""AgentCore Runtime のエントリーポイント"""
user_message = event.get("message", "")
session_id = event.get("session_id", "default")
response = agent(user_message)
return {
"statusCode": 200,
"body": str(response)
}動いたヨ!!ネカフェで思わず声出ちゃいましたヨ!!周りの人ゴメンナサイ……😆
ステップ2:Amazon Bedrock AgentCore Runtime へのCDKデプロイ
コレが CDK スタックの構成例デスネ!!🎉
⚠️ セキュリティ注意:IAMポリシーは最小権限の原則に従い、必要なアクションのみを付与することが重要デスヨ!!本番環境では
Resourceにワイルドカード"*"を使わず、具体的なリソースARNを指定してクダサイ!!
# cdk_stack.py
import aws_cdk as cdk
from aws_cdk import (
aws_iam as iam,
Stack
)
from constructs import Construct
class AgentCoreStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs):
super().__init__(scope, construct_id, **kwargs)
# AgentCore 用の IAM ロール(最小権限の原則に従って設定)
agent_role = iam.Role(
self, "AgentCoreRole",
assumed_by=iam.ServicePrincipal("bedrock.amazonaws.com"),
inline_policies={
"AgentCoreMinimalPolicy": iam.PolicyDocument(
statements=[
iam.PolicyStatement(
actions=[
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
"bedrock-agent-runtime:InvokeAgent",
"bedrock-agent-runtime:GetMemory",
"bedrock-agent-runtime:PutMemory"
],
# 本番環境では必ず具体的なARNに絞り込むこと
# 例: "arn:aws:bedrock:ap-northeast-1:123456789012:agent/XXXXXXXXXX"
resources=[
"arn:aws:bedrock:ap-northeast-1:*:agent/*"
]
)
]
)
}
)
# AgentCore Runtime の作成
# CDK の AgentCore サポートはプレビュー期間中は
# CloudFormation カスタムリソース経由で設定
agent_runtime = cdk.CfnResource(
self, "AgentRuntime",
type="AWS::Bedrock::AgentRuntime",
properties={
"AgentRuntimeName": "my-weather-agent",
"RoleArn": agent_role.role_arn,
"RuntimeArtifact": {
"ContainerConfiguration": {
"ContainerUri": "your-ecr-repo-uri:latest"
}
}
}
)ステップ3:Amazon Bedrock AgentCore Memory でコンテキストを維持する
コレ見てよ!!スゴくナイ!?✨ コレがあるとエージェントが「記憶」を持てるんデスヨ!!セッションをまたいでユーザーのことを覚えてられるって、マジで体験が変わりますヨ!!😆
# memory_agent.py
from strands import Agent, tool
from strands.models import BedrockModel
import boto3
import json
bedrock_agent_runtime = boto3.client(
"bedrock-agent-runtime",
region_name="ap-northeast-1"
)
def save_to_memory(session_id: str, key: str, value: str):
"""AgentCore Memory にデータを保存"""
bedrock_agent_runtime.put_memory(
memoryId="your-memory-id",
memoryContent={
"sessionId": session_id,
"content": json.dumps({key: value})
}
)
def get_from_memory(session_id: str) -> dict:
"""AgentCore Memory からデータを取得"""
try:
response = bedrock_agent_runtime.get_memory(
memoryId="your-memory-id",
sessionId=session_id
)
content = response.get("memoryContent", {})
return json.loads(content.get("content", "{}"))
except bedrock_agent_runtime.exceptions.ResourceNotFoundException:
return {}
@tool
def remember_user_preference(session_id: str, preference_key: str, preference_value: str) -> str:
"""ユーザーの好みをMemoryに保存する"""
save_to_memory(session_id, preference_key, preference_value)
return f"覚えたヨ!{preference_key} = {preference_value}"
@tool
def recall_user_preference(session_id: str, preference_key: str) -> str:
"""ユーザーの好みをMemoryから取得する"""
memory = get_from_memory(session_id)
value = memory.get(preference_key)
if value:
return f"{preference_key} は {value} デスネ"
return f"{preference_key} の情報はまだ覚えていないデスネ"
model = BedrockModel(
model_id="us.anthropic.claude-haiku-4-5-20251014:0",
region_name="ap-northeast-1"
)
memory_agent = Agent(
model=model,
tools=[remember_user_preference, recall_user_preference],
system_prompt="""あなたは記憶力の良いアシスタントです。
ユーザーの好みや情報を記憶し、次の会話でも活用できます。"""
)
def handler(event, context):
"""Memory 付きエージェントのエントリーポイント"""
user_message = event.get("message", "")
session_id = event.get("session_id", "default")
# Memoryから既存のコンテキストを取得してシステムプロンプトに注入
existing_memory = get_from_memory(session_id)
context_prompt = ""
if existing_memory:
context_prompt = f"\n既知のユーザー情報: {json.dumps(existing_memory, ensure_ascii=False)}"
response = memory_agent(user_message + context_prompt)
return {
"statusCode": 200,
"body": str(response)
}セッションをまたいでコンテキストが生きてるの、初めて動かした時は感動したヨ!!マジでエージェントが「人格」持ってる感じになるんデスヨ!!🔥
ステップ4:Amazon Bedrock AgentCore Observability で動作を可視化する
コレ見てよ!!スゴくナイ!?✨ エージェントの「思考の流れ」が全部トレースできるようになりますヨ!!今までブラックボックスだったやつが全部見えるんデスネ!!😆
⚠️ 注意:OTLPエンドポイントは実際の環境に合わせて変更してクダサイ。CloudWatch Agent 経由でエクスポートする構成も選択できますヨ!!
# observability_agent.py
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from strands import Agent, tool
from strands.models import BedrockModel
# OpenTelemetry プロバイダーの設定
provider = TracerProvider()
otlp_exporter = OTLPSpanExporter(
endpoint="https://your-otlp-endpoint:4317"
)
provider.add_span_processor(BatchSpanProcessor(otlp_exporter))
trace.set_tracer_provider(provider)
tracer = trace.get_tracer("agentcore-observability-demo")
@tool
def get_weather(city: str) -> str:
"""指定した都市の天気情報を取得する(トレーシング付き)"""
with tracer.start_as_current_span("tool.get_weather") as span:
span.set_attribute("tool.name", "get_weather")
span.set_attribute("tool.input.city", city)
result = f"{city}の天気: 晴れ、気温22℃"
span.set_attribute("tool.output", result)
return result
def handler(event, context):
"""Observability 付きエージェントのエントリーポイント"""
user_message = event.get("message", "")
session_id = event.get("session_id", "default")
with tracer.start_as_current_span("agent.invoke") as span:
span.set_attribute("session.id", session_id)
span.set_attribute("agent.input", user_message)
model = BedrockModel(
model_id="us.anthropic.claude-haiku-4-5-20251014:0",
region_name="ap-northeast-1"
)
agent = Agent(
model=model,
tools=[get_weather],
system_prompt="あなたは親切なアシスタントです。天気情報を取得できます。"
)
try:
response = agent(user_message)
span.set_attribute("agent.output.length", len(str(response)))
span.set_attribute("agent.status", "success")
return {
"statusCode": 200,
"body": str(response)
}
except Exception as e:
span.set_attribute("agent.status", "error")
span.set_attribute("agent.error.message", str(e))
span.record_exception(e)
raiseCloudWatch で確認するとこんな感じでトレースが積み上がってくるんデスヨ!!🎉
agent.invoke [200ms]
└─ tool.get_weather [15ms] ← ここが見えるの、サイコーすぎる!!
コレがあると「エージェントがどこで時間使ってるか」「どのツールを何回呼んだか」が全部分かるヨ!!本番障害対応が段違いに楽になりましたヨ!!😆
まとめ:Amazon Bedrock AgentCore でエージェント開発が変わるヨ!!
キミ、最後まで読んでくれてアリガトウ!!😭✨ 改めて整理するとこんな感じデス!!
| やりたいこと | 使う AgentCore サービス |
|---|---|
| サーバーレスでエージェントを動かしたい | Runtime |
| Webブラウザを自動操作したい | Browser |
| コードを安全に実行させたい | Code Interpreter |
| 会話をまたいで記憶させたい | Memory |
| 既存APIをツール化したい | Gateway |
| 認証・権限管理を整えたい | Identity |
| エージェントの動きを可視化したい | Observability |
| 回答品質を定量評価したい | Evaluations |
| 危険なアクションを防ぎたい | Policy |
Amazon Bedrock AgentCore、まだプレビューだケド、本番投入を見据えた設計が随所に入っててマジでスゴイんデスヨ!!🔥 「インフラはAWSに任せて、僕はエージェントのロジックだけに集中する!!」そういう世界を実現してくれるサービスだと思ってますヨ!!
キミのエージェント開発が、Amazon Bedrock AgentCore でもっと楽しくなりますようにっ!!✨
やらかしちゃいましたヨ……😭 実はこの記事、最初にObservabilityセクション書き忘れて半完成で世に出すとこだったんデスヨ!!危なかった!!キミ、ちゃんと最後まで読んでくれててアリガトウ、おかげで助かりましたヨ……!!
関連記事
MCPリファレンス実装を読み解く:Filesystem・Memory・Sequential Thinkingサーバーに学ぶセキュアなLLMツール統合設計
MCPリファレンス実装を徹底解説。Filesystem・Memory・Sequential ThinkingサーバーのTypeScriptコードを読み解き、セキュアなLLMツール統合設計のベストプラクティスを学ぶ中〜上級エンジニア向け技術記事。
TradingAgents完全解説|LLMマルチエージェントが機関投資家の意思決定を再現する金融トレーディングフレームワーク
TauricResearch開発のOSSフレームワーク「TradingAgents」を徹底解説。LLMマルチエージェントで機関投資家の5層組織構造を再現し、株式トレーディングの意思決定を自動化する仕組みをわかりやすく紹介。
Claude Codeが「武器」に変わる:oh-my-claudecodeで実現するマルチエージェント開発自動化の全貌
oh-my-claudecodeで実現するマルチエージェント開発自動化を徹底解説。19種類の専門エージェント、5ステージパイプライン、スマートモデルルーティングでClaude Codeをまさに「武器」へと進化させる方法を紹介。
機械学習による仮想通貨価格予測 第3部:バックテストと自動売買システム統合【完全ガイド】
機械学習・仮想通貨・バックテストの落とし穴を徹底解説。自動売買・ウォークフォワード最適化・FreqAI・モデル劣化対策まで、プロダクション実装の全手順をPythonコード付きで解説するヨ!