はじめに
こんにちは! アジアクエスト株式会社の足立です!
9/21(日)開催の「ServerlessDays Tokyo 2025 - Day.2 ワークショップDAY」に参加してきました。
この記事はイベント参加の体験記となっています。
ServerlessDays Tokyoとは
ServerlessDays Tokyoは開発者による開発者のためのServerlessに関するテクノロジーカンファレンスです。
開発者が実際のプロジェクトから得た経験や教訓を共有する実践的なセッションを重要視しています。
ServerlessDays Tokyoは世界中で行われているServerlessDays(以前はJeffConfと呼ばれていた)のひとつであり、世界中で発展しているServerlessに関連するコミュニティをより発展させるためのイベントです。
今年2025年は2日間にわたって開催され、非常に多くの知見や実践ノウハウが活発に交換されました。
- DAY1 9/20(土) テクノロジーカンファレンス @ ベルサール新宿南口
- DAY2 9/21(日) ハンズオンワークショップ @ docomo R&D OPEN LAB ODAIBA
2日目のワークショップでは、いくつかセッションがある中で、私はBedrock AgentCore と Apache Icebergのハンズオンを体験しました。この記事では、当日の雰囲気・学びどころ・つまずきポイントを共有します。
少しでもServerlessDaysのイベントや、Amazon Bedrock AgentCore の技術に興味を持つきっかけになれば嬉しいです!
ワークショップ1:Amazon Bedrock AgentCore Workshop: From Basic to Advanced Agent Development
概要(AgentCoreとは、Strands Agentとは、このワークショップで学べること)
このワークショップでは、Amazon Bedrock AgentCore と Strands Agentsを使ってAIエージェントを「作る→動かす→安全に公開→記憶を持たせる」 まで、小さなステップで学べます。(全部“動くコード”付き)
実際に「AWSコスト見積もりエージェント」を開発・デプロイする過程を追体験することで、Amazon Bedrock AgentCore の機能を一通り学ぶことができる点が魅力です。
Amazon Bedrock AgentCoreとは?
AWS上でAIエージェントを「動かす・安全に公開する・記憶やツールをもたせる・監視する」などをまとめて面倒見てくれる基盤です。
- Runtime(サーバーレスの実行基盤)
- Identity(認証・認可)
- Gateway(MCPや外部ツール連携)
- Observability(監視)
- Memory(記憶)
などなどのAIエージェントを本番環境で動かす上で欠かせない便利ツールが一つにまとまっています。
本番環境ではAIエージェントが 「ただ動けばいい」 という訳にはいきません。セキュリティやスケーラビリティを考慮した上で監視・運用し続ける必要があります。これらの課題を引き受けてくれるプラットフォームが Amazon Bedrock AgentCore なのです!
Strands Agentsとは?
AWSの提供するAIエージェントを「作る」ためのOSSフレームワークです。
なんと最小3行のPythonコードを書くだけでAIエージェントを作れてしまいます!
LangGraphやMastraと比較しても非常にシンプルに開発できる点が魅力的です。
また、Bedrock AgentCoreと連携することで本番環境へのデプロイまでシームレスに繋げることが可能となります。
私は参加前からBedrock AgentCore や Strands Agentsを使ったことがありましたが、より体系的に全体像をつかみたくて本ワークショップに参加しました。
事前準備、環境
本ワークショップではAWS社の協力のもと、専用のAWSアカウントが配布されました。
VS Code Serverを使うため環境にも依存せずすぐに使い始めることができました。
また、このワークショップで使ったコードはすべて以下のGithubに公開されているため、個人アカウントでもいつでも実施することができます。
Bedrockのモデル実行など一部課金が発生しますが、Bedrock AgentCoreはプレビュー段階のため「2025年10月6日まで無料」で利用することができます! (参考:Amazon Bedrock AgentCore (Preview) Pricing)
日本語のBedrock AgentCoreの料金ページでは本日(9/21)時点で「2025年9月16日まで無料」と記載されています。直接AWSの方に質問したところ、英語のページの情報が最新との見解でした。
ワークショップの各セクション紹介
01_code_interpreter
このセクションでは、AgentCore Code Interpreterを使ってAWSの見積もり計算を行いました。
AgentCore Code Interpreter とは?
AIエージェントがコードを書き、それをサンドボックス環境で実行し、デバッグし、結果を取得してくれる機能です。
プロセスの概要は以下の通りです。
実際にcost_estimator_agent.py
でツール定義している箇所を見てみましょう。code_interpreter.invoke
でCode Interpreterが呼び出されているのが分かります。
@tool
def execute_cost_calculation(self, calculation_code: str, description: str = "") -> str:
"""AgentCore Code Interpreterを使用してコスト計算を実行する。"""
if not self.code_interpreter:
return "❌ Code Interpreterが初期化されていません"
try:
# セキュアなAgentCoreのサンドボックスでコードを実行
response = self.code_interpreter.invoke("executeCode", {
"language": "python",
"code": calculation_code
})
# レスポンスストリームから結果テキストを抽出
results = []
for event in response.get("stream", []):
if "result" in event:
result = event["result"]
if "content" in result:
for content_item in result["content"]:
if content_item.get("type") == "text":
results.append(content_item["text"])
return "\n".join(results)
except Exception as e:
logger.exception(f"❌ 計算に失敗しました: {e}")
また、実際に料金を算出するのは「AWS Pricing MCP Server」を使っています。
aws_pricing_client = MCPClient(
lambda: stdio_client(
StdioServerParameters(
command="uvx",
args=["awslabs.aws-pricing-mcp-server@latest"],
env=env_vars
)
)
)
実際に実行した結果はこのようになります。アーキテクチャを提案し、コスト内訳を算出してくれています。
cd 01_code_interpreter
uv run python test_cost_estimator_agent.py --architecture "RDS MySQLを使用した2つのEC2 m5.largeインスタンス"
02_runtime
次のセクションでは、AgentCore Runtime を使ってAIエージェントをAWSにデプロイしました。
AgentCore Runtime とは?
AWS上でAIエージェントを安全に、スケーラブルに動かすためのサーバレスな実行環境です。
- microVM(仮想マシン)上でセッションを隔離
- 最長で8時間の長時間実行が可能
- フレームワークに依存せずにエージェントを稼働
などのメリットがあります
プロセスの全体像は下記の通りです。
ここで「AgentCore CLI」と書いているところは、公式の bedrock-agentcore-starter-toolkit を意味しています。agentcore
コマンドを入力していくだけでAWS上にAIエージェントをデプロイすることができます。実際に手順を見てみましょう。
まず下記のコマンドを実行してデプロイするAIエージェントを準備します。先ほど01_code_interpreter
で作成した「AWSコスト見積エージェント」をデプロイ用ディレクトリに移し、必要なIAMロールを作成します。
cd 02_runtime
uv run prepare_agent.py --source-dir ../01_code_interpreter/cost_estimator_agent
prepare_agent.py
の中でcreate_agentcore_role
関数が定義されているため、このコマンドでAgentCoreを実行するために必要なすべての権限が付与されます。
def create_agentcore_role(self) -> dict:
"""AgentCore権限を持つIAMロールを作成"""
role_name = f"AgentCoreRole-{self.agent_name}"
# bedrock-agentcoreサービスの信頼ポリシー
trust_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "bedrock-agentcore.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": account_id
},
"ArnLike": {
"aws:SourceArn": f"arn:aws:bedrock-agentcore:{self.region}:{account_id}:*"
}
}
}
]
}
# 包括的なAgentCore権限を持つ実行ポリシー
execution_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BedrockPermissions",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"bedrock-agentcore:CreateCodeInterpreter",
"bedrock-agentcore:StartCodeInterpreterSession",
"bedrock-agentcore:InvokeCodeInterpreter",
"bedrock-agentcore:StopCodeInterpreterSession",
"bedrock-agentcore:DeleteCodeInterpreter"
],
"Resource": "arn:aws:bedrock-agentcore:*:*:*"
}
]
}
次にprepare_agent.py
の実行結果をもとに agentcore configure
コマンドを使ってエージェントのランタイムを設定します。
uv run agentcore configure \
--entrypoint ./deployment/invoke.py \
--name cost_estimator_agent \
--execution-role arn:aws:iam::<your-accound-id>:role/AgentCoreRole-cost_estimator_agent \
--requirements-file ./deployment/requirements.txt \
--disable-otel \
--region us-west-2
コラム:agentcore configure
はどんな処理をしているのか?
コマンド実行時、まずエントリーポイントの必須チェックとプロトコル検証が行われます。そして不足している設定値を対話的に収集します。
- 実行ロール
- ECRリポジトリ
- OAuth設定
その後、収集された設定値をもとに以下の処理が実行されます。
- AWSアカウント情報の取得
- 実行ロールのARN形式への変換
- コンテナランタイムの初期化
最後に、.bedrock_agentcore.yaml
設定ファイルが作成・更新され、エージェント設定がマージされます。
実際の.bedrock_agentcore.yaml
は以下のようになっています。設定値が定義されているのが分かります。
default_agent: cost_estimator_agent
agents:
cost_estimator_agent:
name: cost_estimator_agent
entrypoint: deployment/invoke.py
platform: linux/arm64
container_runtime: docker
aws:
execution_role: arn:aws:iam::552255258524:role/AgentCoreRole-cost_estimator_agent
execution_role_auto_create: true
account: '552255258524'
region: us-west-2
ecr_repository: 552255258524.dkr.ecr.us-west-2.amazonaws.com/bedrock-agentcore-cost_estimator_agent
ecr_auto_create: false
network_configuration:
network_mode: PUBLIC
protocol_configuration:
server_protocol: HTTP
observability:
enabled: true
bedrock_agentcore:
agent_id: cost_estimator_agent-MFXixR7HO1
agent_arn: arn:aws:bedrock-agentcore:us-west-2:552255258524:runtime/cost_estimator_agent-MFXixR7HO1
agent_session_id: 4398d012-2dfd-46b1-9adb-a5ed9fa65748
codebuild:
project_name: null
execution_role: null
source_bucket: null
authorizer_configuration: null
oauth_configuration: null
最後に、エージェントをデプロイし、実際にテストしてみます。
# エージェントを起動
uv run agentcore launch
# エージェントをテスト
uv run agentcore invoke '{"prompt": "SSH用の小さなEC2を準備したいです。コストはいくらですか?"}'
実行結果はこちらです。タイムアウトエラーが発生しているようです。
Invoking BedrockAgentCore agent 'cost_estimator_agent' via cloud endpoint
❌ Invocation failed: Read timeout on endpoint URL:
"https://bedrock-agentcore.us-west-2.amazonaws.com/runtimes/arn%3Aaws%3Abed
rock-agentcore%3Aus-west-2%3A552255258524%3Aruntime%2Fcost_estimator_agent-
tP56dt31W5/invocations?qualifier=DEFAULT"
AgentCoreのコンソールを見てみるとデプロイ自体は成功しているのが分かります。(agentcore status
でも確認できます。)
このような場合、AgentCoreではCloudWatchに詳細なログを取っているため、原因調査に活用することができます。
今回の場合は、スクショの赤枠にある chat us.anthropic.claude-3-7-sonnet-20250219-v1:0
が HTTP 429なので、Bedrock 側でスロットリング(許容量超過)が発生した ということが判明しました。
このようにオブザーバビリティ(可観測性)が高い点もAWSで運用するメリットだと感じました!
デプロイ自体は成功しているため、次に進みたいと思います。
06_memory
このワークショップでは時間が限られていたため、Identity・Gateway・Obervabilityに関するセクションは飛ばして、AgentCore Memoryのセクションに進みました。
AgentCore Memory とは?
直近の会話履歴などの「短期記憶」と、ユーザーの好みや知識・知見などの「長期記憶」を管理するための記憶インフラです。これにより文脈に応じて適切な応答が可能になります。
プロセスの概要は以下の通りです。今回は過去の見積もり結果を記憶しておき、比較する仕組みとなっていました。
実装部分を見てみます。短期記憶についてはcreate_event()
メソッドを使用して各セッションのユーザーの入力とアシスタントの応答を保存しています。
# 短期記憶(各セッションの会話履歴)の保存
self.memory_client.create_event(
memory_id=self.memory_id,
actor_id=self.actor_id,
session_id=self.session_id,
messages=[
(architecture_description, "USER"),
(result, "ASSISTANT")
]
)
list_events()
メソッドでsession_id
を指定して保存した短期記憶を呼び出すことができます。
# 短期記憶の取得
events = self.memory_client.list_events(
memory_id=self.memory_id,
actor_id=self.actor_id,
session_id=self.session_id,
max_results=4
)
長期記憶はUserPreferenceExtractor
戦略を使用して実装されています。この戦略は /preferences/{actor_id}
名前空間にユーザーの決定パターンと設定を自動的に抽出・保存する仕様です。
# 長期記憶の保存
self.memory = self.memory_client.create_memory_and_wait(
name=memory_name,
strategies=[{
"userPreferenceMemoryStrategy": {
"name": "UserPreferenceExtractor",
"description": "Extracts user preferences for AWS architecture decisions",
"namespaces": [f"/preferences/{self.actor_id}"]
}
}],
event_expiry_days=7, # メモリの有効期限を7日に設定
)
長期記憶の取得は retrieve_memories()
メソッドで行われ、特定の要件に基づいてユーザーの履歴パターンを検索します。
memories = self.memory_client.retrieve_memories(
memory_id=self.memory_id,
namespace=f"/preferences/{self.actor_id}",
query=f"User preferences and decision patterns for: {requirements}",
top_k=3
)
メモリを使ったテスト実行をしてみましょう。
cd 06_memory
uv run python test_memory.py
実行結果を見ると、前回の結果を記憶した上で比較しているのが分かります。
まとめ・学んだこと
本ワークショップでは、ServerlessDays Tokyo 2025の2日目のプログラムとして、Amazon Bedrock AgentCore を使ってAIエージェントをAWS上で動かしてみました。
これまでBedrock AgentCoreを使った際には、サンプルコード+αくらいしか試しておらず、内部でどのような処理が行われているか、AgentCoreがどのような課題を解決するのか、といったことをよく理解できていませんでした。
しかし、本ワークショップを通じてAIエージェントを本番運用する際の
- サーバーレスな実行環境
- メモリ管理
- 認証・認可などのセキュリティ
など、多くの課題をAWS側で解決してくれていることを実感しました。
Bedrock AgentCoreを使いこなすことで、開発者が 「AIエージェントにどんな課題を解決してほしいか」「どのようなコンテキストやツールを与えるか」 といった問題に集中できるようになったと感じました!
ワークショップでは時間の都合でIdentity・Gateway・Obervabilityに関するセクションは飛ばしたので、自宅でこれらも触ってみようと思います!
また、このワークショップのあとに開催された Apache Icebergに関するセッションも非常に学びが多かったため、また今度まとめたいと考えています。
ServerlessDays Tokyo 2025は2日間を通じて、非常に多くの刺激と学びがありました。運営やスポンサー、登壇者や参加者の皆様、ありがとうございました!!
おまけ:Amazon Bedrock AgentCoreについてさらに学びたい方へ
Bedrock AgentCoreを学ぶためのリソースをいくつか紹介します。
"Diving Deep into Bedrock AgentCore":
応用編のより包括的なワークショップを日本語で学べます。
"Strands & AgentCoreハンズオン! MCPマルチエージェントをAWSに簡単デプロイ":
JAWS-UG東京支部開催されたAWS Heroみのるんさんのハンズオン。1時間で最初の一歩を踏み出せます。
"AWS生成AIアプリ構築実践ガイド":
LLMの基礎からRAG、AIエージェントまでAWSでの実装方法を学べます。生成AIアプリをAWSで作ってみたい初学者に最適です。
この本はワークショップ当日に、4冊限定のものをいただきました! 「ブログを書いてくれる方」という条件だったため、無事に書き上げられて良かったです。