【Amazon Bedrock AgentCore】Streamlit使って簡単なチャットを作成してみた
Amazon Bedrock AgentCore とは
あらゆるフレームワークとモデルを使用して、非常に効果的なエージェントを安全かつ大規模にデプロイおよび運用できます。
Amazon Bedrock AgentCore を使用すると、開発者は実際のデプロイに不可欠なスケール、信頼性、セキュリティを備えた AI エージェントを迅速に本番環境に導入できます。
AgentCore は、エージェントをより効果的かつ有能にするためのツールと機能、エージェントを安全に拡張するための専用インフラストラクチャ、信頼できるエージェントを運用するためのコントロールを提供します。
Amazon Bedrock AgentCore サービスは構成可能で、一般的なオープンソースフレームワークやあらゆるモデルで動作するため、オープンソースの柔軟性とエンタープライズグレードのセキュリティと信頼性のどちらかを選ぶ必要はありません。
主なコンポーネント
AgentCore Runtime
セッション分離機能を備えた低レイテンシサーバレス環境を提供し、CrewAI、LangGraph、LlamaIndex、Strands Agentsなどの人気オープンソースフレームワークをサポートし、マルチモーダルワークロードと長時間実行エージェント(最大8時間)に対応します。
AgentCore Memory
セッションと長期メモリを管理し、モデルに関連コンテキストを提供しながら、エージェントが過去のやり取りから学習できるようにします。
AgentCore Observability
メタデータタグ付け、カスタム評価、軌跡検査、トラブルシューティング・デバッグフィルターを備えたエージェント実行のステップバイステップ可視化を提供します。
AgentCore Identity
AIエージェントがGitHub、Salesforce、Slackなどのサードパーティツールやサービスに、ユーザーに代わって、または事前承認されたユーザーの同意により安全にアクセスできるようにします。
AgentCore Gateway
AIエージェントが幅広いツールにアクセスする必要があり、AgentCore Gatewayは、エージェントがツールを発見・使用する安全な方法を提供し、API、Lambdaファンション、既存サービスをエージェント互換ツールに簡単に変換します。
AgentCore Code Interpreter
AIエージェントが複雑な計算、推論の検証、データ処理、または視覚化の生成を実行するために、サンドボックス環境でコードを安全に書いて実行する機能を提供します。
AgentCore Browser Tool
エージェントがWebベースのサービスとやり取りし、複雑なWebタスクを実行できるよう、安全でクラウドベースのブラウザランタイムを提供します。
ライブラリーの導入
uv とは、Python の超高速なパッケージマネージャ & 仮想環境ツールです。
Rust 製で、以下の複数のツールの機能をひとつに統合したオールインワンツールです:
Strands Agents SDK は AWS(Amazon)がオープンソースとして公開した、モデル駆動型の AI エージェント SDK です。少量のコード(数行)で、モデルとツールをつなげてエージェントを構築・実行できるプラットフォームとなっています
uv init
uv add bedrock-agentcore strands-agents
##アプリケーションコードを作成
app.pyとしてバックエンド側のコードを作成します。
from bedrock_agentcore import RequestContext
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from strands import Agent
from strands.models import BedrockModel
model = BedrockModel(model_id="us.amazon.nova-lite-v1:0", region_name="us-east-1")
agent = Agent(model=model, callback_handler=None)
app = BedrockAgentCoreApp()
@app.entrypoint
def invoke(payload: dict, context: RequestContext):
"""Process user input and return a response"""
user_message = payload.get("prompt")
result = agent(user_message)
return {"result": result.message}
if __name__ == "__main__":
app.run()
動作確認
以下のコマンドでテストしてみます。
uv run app.py
INFO: Started server process [29644]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
cURLでリクエストを送信します。
curl -X POST http://localhost:8080/invocations -H "Content-Type: application/json" -d "{\"prompt\": \"こんにちは!東京スカイツリーははどこにありますか?\"}"
{"result":{"role":"assistant","content":[{"text":"こんにちは!東京スカイツリーは、東京都墨田区押上にある超高層タワーです。東京スカイツリーは、2012年に完成し、その高さは634メートルで、世界で最も高い独立塔となっています。\n\n東京スカイツリーは、東京のランドマークとして有名で、展望デッキやレ ストラン、ショップなど、様々な施設が設けられています。また、東京スカイツリーの周辺には、お台場や浅草など、多くの観光スポットがあります。\n\n東京 スカイツリーは、電車やバスなど、様々な交通手段でアクセスできます。最寄り駅は、東京メトロ半蔵門線・東武スカイツリーラインの押上駅です。また、東武 スカイツリーラインのとうきょうスカイツリー駅も近接しています。"}]}}
このように回答が返ってくれOKです。
このようなエラーが出る場合は、クレデンシャルを登録しているか確認してください。
{"error":"Unable to locate credentials"}
//環境変数
cmd
AWS_PROFILE=xxxx
powershell
$Env:AWS_PROFILE = "xxxx"
AgentCore Runtimeへデプロイ
AgentCore Runtimeへデプロイしていきます。
AgentCore Runtimeは、ECRに登録したコンテナイメージを使用して起動するようなので、まずコンテナイメージをプッシュしていきます。
コンテナイメージを作成
以下のコードでECRにイメージをプッシュします。
$ACCOUNT_ID = aws sts get-caller-identity --query Account --output text
$AWS_REGION = "us-east-1"
$AGENT_NAME = "agentcore-basic"
docker buildx create --use
aws ecr create-repository --repository-name $AGENT_NAME --region $AWS_REGION
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin "$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com"
$TAG = "${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AGENT_NAME}:latest"
docker buildx build --platform linux/arm64 -t $TAG --push .
AgentCore Runtimeの設定


先ほど作成したECRを指定します。

これでデプロイが完了しました。
後ほど「agentRuntimeArn」を後で使うのでメモっておきます。

Streamlitでフロントエンドを作成
これでバックエンドは完了しました。
ここからはフロントエンドでagentRuntimeArnを使用して、Agentを呼び出してアプリを作成していきます。
Streamlit は、Python で手軽にインタラクティブな Web アプリケーションを作成できるオープンソースフレームワークです。特に以下のような用途に最適です。
uv add streamlit boto3
以下がStreamlitのコードです。
import json
import time
import uuid
import boto3
import streamlit as st
# bedrock-agentcoreのクライアント
agent_core_client = boto3.client("bedrock-agentcore", region_name="us-east-1")
# セッションID。33文字以上ないとエラーになる
session_id = str(int(time.time())) + "_" + str(uuid.uuid4()).replace("-", "")
st.title("Basic Chat")
st.write("Streamlit + Bedrock AgentCore + Strands Agents")
runtime_arn = st.text_input(label="AgentRuntime ARN")
if prompt := st.chat_input():
with st.chat_message("user"):
st.write(prompt)
with st.spinner():
response = agent_core_client.invoke_agent_runtime(
agentRuntimeArn=runtime_arn,
runtimeSessionId=session_id,
payload=json.dumps({"prompt": prompt}),
qualifier="DEFAULT",
)
response_body = response["response"].read()
response_data = json.loads(response_body)
with st.chat_message("assistant"):
for content in response_data["result"]["content"]:
st.write(content["text"])
ローカルで動作確認
以下のコマンドを実行します。
uv run streamlit run front.py
うまく実行できていますね!

ログの確認
以下の用にトレースができています。

エラーになっている場合、X-RayのTransaction Searchの有効化を確認してみてください
。

Discussion