[Amazon Bedrock AgentCore] RuntimeにLangGraphで実装したAIエージェントをデプロイしてみる

[Amazon Bedrock AgentCore] RuntimeにLangGraphで実装したAIエージェントをデプロイしてみる

LangGraphによるAIエージェントもAgentCoreランタイムでホストできるか試してみました。
2025.09.26

データ事業本部の鈴木です。

現在パブリックプレビューで提供されているAmazon Bedrock AgentCoreにLangGraphによるAIエージェントをデプロイできるのか気になっていたので試してみました。
さらっとにはなりますがご共有します。

概要

Strands Agentsをデプロイする例は、スーパーマーケットのラ・ムーが大好きなコンサル部の神野さんが書いてくれているため、デプロイ対象となるPythonプログラムの中身をLangGraphによる実装に変更してデプロイしてみました。

https://dev.classmethod.jp/articles/amazon-bedrock-agentcore-runtime-ai-hosting/

▼自動生成されるファイル

自動生成されるファイル

▼デプロイの全体像

launchコマンドの流れ

(上記ブログより引用)

やってみた

1. ローカルの環境構築

以下のように、ローカル環境にBedrockAgentCore Starter ToolkitのCLI実行環境を用意しました。

まずは必用なライブラリをインストールするためのrequirements.txtを用意しました。

requirements.txt
			
			langgraph
langchain[aws]
bedrock-agentcore
bedrock-agentcore-starter-toolkit

		

続いて環境を作成しました。

			
			python3 -m venv agentcore-env
source agentcore-env/bin/activate

# 必要なパッケージをインストール
pip install -r requirements.txt

		

2. エージェントの実装

このブログの一番大事なところですが、LangGraphによる実装は以下のようにしました。
ReActエージェントの簡単な実装になります。
ツールはとりあえず固定の天気情報を返す関数を作りました。

agent.py
			
			from bedrock_agentcore.runtime import BedrockAgentCoreApp
from langchain_aws import ChatBedrock
from langgraph.prebuilt import create_react_agent

app = BedrockAgentCoreApp()

def weather() -> str:
    """現在の天気を回答する"""
    return "ひどい雨です"

@app.entrypoint
async def entrypoint(payload):
    message = payload.get("prompt", "")
    model = payload.get("model", {})
    model_id = model.get("modelId","anthropic.claude-3-5-haiku-20241022-v1:0")

    llm = ChatBedrock(
         region_name="us-west-2",
         model_id=model_id,
         model_kwargs={
             "max_tokens": 1000,
             "temperature": 0.1
         },
    )

    agent = create_react_agent(
       llm,
       tools = [weather]
    )

    stream_messages = agent.stream(
        {"messages": [{"role": "user", "content": message}]},
        stream_mode="updates"
    )

    for message in stream_messages:
        yield message

if __name__ == "__main__":
    app.run()

		

3. デプロイ

CLIからエージェントをAgentCoreにデプロイしました。

			
			# 設定、とりあえず全てEnterキー連打で進める
agentcore configure -e agent.py

# デプロイ実行
agentcore launch

		

agentcore configureは作成されるyamlファイルとDockerfileにデフォルトリージョンを記載するようでしたので、デフォルトリージョンがAgentCoreのサポートリージョンと異なる場合は書き換える必要がありました。

以下のようにランタイムエージェントがデプロイできました。

デプロイしたランタイムエージェント

4. 動作確認

以下のようにリクエストを送り、ツールを使って回答してくれるか確認しました。

			
			agentcore invoke '{"prompt":"天気はどうですか?"}'

		

レスポンスは例えば以下のようになり、エージェント側でツールを使って回答してくれていることを確認できました。

			
			{"agent": {"messages": [{"content": "現在の天気を確認するために、weatherツールを使用します。", "additional_kwargs": {"usage": {"prompt_tokens":
317, "completion_tokens": 55, "cache_read_input_tokens": 0, "cache_write_input_tokens": 0, "total_tokens": 372}, "stop_reason": "tool_use", 
"thinking": {}, "model_id": "anthropic.claude-3-5-haiku-20241022-v1:0", "model_name": "anthropic.claude-3-5-haiku-20241022-v1:0"}, 
"response_metadata": {"usage": {"prompt_tokens": 317, "completion_tokens": 55, "cache_read_input_tokens": 0, "cache_write_input_tokens": 0, 
"total_tokens": 372}, "stop_reason": "tool_use", "thinking": {}, "model_id": "anthropic.claude-3-5-haiku-20241022-v1:0", "model_name": 
"anthropic.claude-3-5-haiku-20241022-v1:0"}, "type": "ai", "name": null, "id": "run--1b7a726c-6d42-4940-b837-c9e16d0340e5-0", "example": false,
"tool_calls": [{"name": "weather", "args": {}, "id": "toolu_bdrk_01AKm1viLKYSQVRceW1wtzia", "type": "tool_call"}], "invalid_tool_calls": [], 
"usage_metadata": {"input_tokens": 317, "output_tokens": 55, "total_tokens": 372, "input_token_details": {"cache_creation": 0, "cache_read": 
0}}}]}}

{"tools": {"messages": [{"content": "ひどい雨です", "additional_kwargs": {}, "response_metadata": {}, "type": "tool", "name": "weather", "id": 
"604fb148-bb2b-47fd-b446-54b382257189", "tool_call_id": "toolu_bdrk_01AKm1viLKYSQVRceW1wtzia", "artifact": null, "status": "success"}]}}

{"agent": {"messages": [{"content": 
"現在、ひどい雨が降っているようです。外出する際は、傘や雨具を忘れずに持ち歩いてください。雨天時は交通機関の遅延や道路の状況にも注意が必要です。
できれば、屋内で過ごすことをおすすめします。", "additional_kwargs": {"usage": {"prompt_tokens": 390, "completion_tokens": 95, 
"cache_read_input_tokens": 0, "cache_write_input_tokens": 0, "total_tokens": 485}, "stop_reason": "end_turn", "thinking": {}, "model_id": 
"anthropic.claude-3-5-haiku-20241022-v1:0", "model_name": "anthropic.claude-3-5-haiku-20241022-v1:0"}, "response_metadata": {"usage": 
{"prompt_tokens": 390, "completion_tokens": 95, "cache_read_input_tokens": 0, "cache_write_input_tokens": 0, "total_tokens": 485}, 
"stop_reason": "end_turn", "thinking": {}, "model_id": "anthropic.claude-3-5-haiku-20241022-v1:0", "model_name": 
"anthropic.claude-3-5-haiku-20241022-v1:0"}, "type": "ai", "name": null, "id": "run--7676fcdc-2084-465d-ae2a-0b8ffaded816-0", "example": false,
"tool_calls": [], "invalid_tool_calls": [], "usage_metadata": {"input_tokens": 390, "output_tokens": 95, "total_tokens": 485, 
"input_token_details": {"cache_creation": 0, "cache_read": 0}}}]}}

		

同様にエージェントサンドボックスからも実行可能でした。

サンドボックスからの実行

GenAI Observabilityダッシュボードでもトレースが確認可能でした。

GenAI Observabilityダッシュボード1

GenAI Observabilityダッシュボード2

最後に

LangGraphによるAIエージェントもAgentCoreランタイムでホスト可能そうでした。
GenAI Observabilityダッシュボードでも監視やロギングができていたのも良い点でした。
GatewayやMemoryなどの機能も利用できるかは別途試してみたいと思います。

この記事をシェアする

FacebookHatena blogX

関連記事

[Amazon Bedrock AgentCore] RuntimeにLangGraphで実装したAIエージェントをデプロイしてみる | DevelopersIO