Amazon Bedrock AgentCore 完全ガイド:AIエージェントの構築・デプロイ・運用を40代エンジニアが全力で解説するヨ!!

約27分で読めます by ぽんたぬき
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)
            raise

CloudWatch で確認するとこんな感じでトレースが積み上がってくるんデスヨ!!🎉

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セクション書き忘れて半完成で世に出すとこだったんデスヨ!!危なかった!!キミ、ちゃんと最後まで読んでくれててアリガトウ、おかげで助かりましたヨ……!!

関連記事

TradingAgents完全解説|LLMマルチエージェントが機関投資家の意思決定を再現する金融トレーディングフレームワーク
AI・機械学習

TradingAgents完全解説|LLMマルチエージェントが機関投資家の意思決定を再現する金融トレーディングフレームワーク

TauricResearch開発のOSSフレームワーク「TradingAgents」を徹底解説。LLMマルチエージェントで機関投資家の5層組織構造を再現し、株式トレーディングの意思決定を自動化する仕組みをわかりやすく紹介。

Claude Codeが「武器」に変わる:oh-my-claudecodeで実現するマルチエージェント開発自動化の全貌
AI・機械学習

Claude Codeが「武器」に変わる:oh-my-claudecodeで実現するマルチエージェント開発自動化の全貌

oh-my-claudecodeで実現するマルチエージェント開発自動化を徹底解説。19種類の専門エージェント、5ステージパイプライン、スマートモデルルーティングでClaude Codeをまさに「武器」へと進化させる方法を紹介。

機械学習による仮想通貨価格予測 第3部:バックテストと自動売買システム統合【完全ガイド】
AI・機械学習

機械学習による仮想通貨価格予測 第3部:バックテストと自動売買システム統合【完全ガイド】

機械学習・仮想通貨・バックテストの落とし穴を徹底解説。自動売買・ウォークフォワード最適化・FreqAI・モデル劣化対策まで、プロダクション実装の全手順をPythonコード付きで解説するヨ!

コメント

0/2000