
Generative AI Use Cases JP (略称:GenU) でサポートされたAmazon Bedrock AgentCore連携を試してみた
はじめに
こんにちは、スーパーマーケットのラ・ムーが大好きなコンサルティング部の神野です!
直近、GenU v5.0.0でAmazon Bedrock AgentCore(以下AgentCore)の連携がサポートされました!!
AIエージェントは作ってみたけどフロントエンドをどうしよう・・・となった際に試せる場所があると便利ですね。また既にGenUを導入済みで、作成したAIエージェントもGenUの環境で確認したい・・・!!となった際に便利かと思います。
早速試していきたいと思います!
GenUについて
改めてGenUについて簡単に紹介です。
GenUは生成 AI を安全に業務活用するための、ビジネスユースケース集を備えたアプリケーション実装となります。
サクッと生成AIを使って、ビジネスにどう活用するのか検討する際に便利なものですね。
デプロイもシンプルで上記レポジトリをclone
してデプロイコマンドを実行すればすぐ使えます。より詳細な話を確認したい場合は下記ブログなどをご参照いただくといいかと思います。
今回はローカルにPullしてデプロイを実施します。
前提・準備
- AWS CLI 2.28.8
- Python 3.12.6
- AWSアカウント
- 使用するリージョン:us-west-2
- 使用するモデルはあらかじめ有効化する必要があります。
- GenUの使用したバージョン:v5.1.1
- Docker version 27.5.1-rd, build 0c97515
今回作成するエージェント
必要な依存関係をrequirements.txt
に記載し、インストールします。
strands-agents
strands-agents-tools
bedrock-agentcore
bedrock-agentcore-starter-toolkit
pip install -r requirements.txt
Strands Agentを使ってシンプルなエージェントを作成します。
天気を聞いたら「晴れていますよ」と返すだけのシンプルなアプリケーションです。
ファイル名はagent.py
とします。
import os
from strands import Agent, tool
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp
model_id = os.getenv("BEDROCK_MODEL_ID", "anthropic.claude-3-5-haiku-20241022-v1:0")
model = BedrockModel(model_id=model_id, params={"max_tokens": 4096, "temperature": 0.7}, region="us-west-2")
app = BedrockAgentCoreApp()
@tool
def get_weather(city: str) -> str:
"""Get the weather for a given city"""
return f"The weather in {city} is sunny"
@app.entrypoint
async def entrypoint(payload):
agent = Agent(model=model, tools=[get_weather])
message = payload.get("prompt", "")
stream_messages = agent.stream_async(message)
async for message in stream_messages:
if "event" in message:
yield message
if __name__ == "__main__":
app.run()
GenUのフロントエンドが期待するレスポンス形式に合わせるため、
Strands Agentが返すストリームメッセージを下記のように返却します。
(私も最初は気づかず、画面上にレスポンスが表示されなくて原因を探るのに少し時間がかかりました・・・)
async for message in stream_messages:
if "event" in message:
yield message
実装が終わったらデプロイします。まずはconfigure
コマンドでIAMやECR周りの設定を行います。いろいろと聞かれますが、今回は特にデフォルトの設定から変更に自動作成で進めます。
agentcore configure --entrypoint agent.py
.bedrock_agentcore.yaml
やDockerfile
が自動で生成されるので、launch
コマンドでデプロイします。
agentcore launch
完了するとAgent ARN
が表示されるので、後で使用するためメモしておきます。
Agent ARN:arn:aws:bedrock-agentcore:us-west-2:xxx:runtime/agent-yyy
GenUデプロイ
次にGenUのデプロイを進めていきます。
まずはレポジトリからソースコードをclone
します。
git clone https://github.com/aws-samples/generative-ai-use-cases.git
clone
した後は、パッケージをインストールするためci
コマンドを実行します。
npm ci
依存関係のインストールが完了したら、
パラメータを編集するために、parameter.tsを下記のように書き換えます。
const envs: Record<string, Partial<StackInput>> = {
// If you want to define an anonymous environment, uncomment the following and the content of cdk.json will be ignored.
// If you want to define an anonymous environment in parameter.ts, uncomment the following and the content of cdk.json will be ignored.
'': {
// Parameters for anonymous environment
// If you want to override the default settings, add the following
modelRegion: 'us-west-2',
imageGenerationModelIds: [],
videoGenerationModelIds: [],
speechToSpeechModelIds: [],
createGenericAgentCoreRuntime: true,
agentCoreRegion: 'us-west-2',
agentCoreExternalRuntimes: [
{
name: 'SimpleAgentCore',
arn: 'arn:aws:bedrock-agentcore:us-west-2:xxx:runtime/agent-yyy',
},
]
},
dev: {
// Parameters for development environment
},
staging: {
// Parameters for staging environment
},
prod: {
// Parameters for production environment
},
// If you need other environments, customize them as needed
};
今回使用するリージョンはus-west-2
として、使用しないパラメータimageGenerationModelIds
などには空の配列を渡します。
重要なパラメータはcreateGenericAgentCoreRuntime
、agentCoreRegion
、agentCoreExternalRuntimes
になります。
createGenericAgentCoreRuntime
はGenUがデフォルトで提供する、AgentCoreのAIエージェントになります。どういった動きをするのか確認したいのでtrue
にしました。agentCoreRegion
はデプロイするリージョンです。agentCoreExternalRuntimes
は自作したAgentCoreを指定してGenUで使用できるようにします。
今回は先ほどデプロイしたAIエージェントのARNを指定します。
これで準備完了です!デプロイしましょう!
もし一度もCDKを使用したことがない場合はbootstrapが必要なので、事前にbootstrap
コマンドを実行します。
npx -w packages/cdk cdk bootstrap
bootstrap
コマンドが正常に実行できたらdeploy
コマンドを実行します。
AgentCore ユースケースを有効化するためには、docker
コマンドが実行可能である必要があります。
ドキュメントにも記載がありましたが、使用しているOSアーキテクチャがIntel/AMDなどの場合は下記コマンドを実行してからデプロイを行うよう注意があるので、気をつけましょう。
ARMベースのコンテナイメージをビルドできるようにするためですね。
docker run --privileged --rm tonistiigi/binfmt --install arm64
npm run cdk:deploy
しばらく時間がかかりますが、少し待つと完了してURLが表示されます。
GenerativeAiUseCasesStack.WebUrl = https://xxx.cloudfront.net
アクセスするとCognitoのログイン画面が表示されますが、ユーザー登録を行なってログインします。
ログインが完了するとAgentCoreと表示されているメニューが存在します!!!
ロボットのアイコンが可愛いですね!
早速クリックして試してみます。
デフォルトで提供されているGenericAgentCoreRuntime
が表示されています。
このAIエージェントは下記で定義されているMCP Serverを使用できるので、今回はDocumentation MCP Serverを使用するような質問をしてみます。
{
"_comment": "Generic AgentCore Runtime Configuration",
"_agentcore_requirements": {
"platform": "linux/arm64",
"port": 8080,
"endpoints": {
"/ping": "GET - Health check endpoint",
"/invocations": "POST - Main inference endpoint"
},
"aws_credentials": "Required for Bedrock model access and S3 operations"
},
"mcpServers": {
"time": {
"command": "uvx",
"args": ["mcp-server-time"]
},
"awslabs.aws-documentation-mcp-server": {
"command": "uvx",
"args": ["awslabs.aws-documentation-mcp-server@latest"]
},
"awslabs.cdk-mcp-server": {
"command": "uvx",
"args": ["awslabs.cdk-mcp-server@latest"]
},
"awslabs.aws-diagram-mcp-server": {
"command": "uvx",
"args": ["awslabs.aws-diagram-mcp-server@latest"]
},
"awslabs.nova-canvas-mcp-server": {
"command": "uvx",
"args": ["awslabs.nova-canvas-mcp-server@latest"],
"env": {
"AWS_REGION": "us-east-1"
}
}
}
}
回答が返ってきました!!
MCPサーバーから得た結果を取得して、その結果をLLMが解釈して適切な言葉として返却していますね!
トレース結果を見ると、search_documentation
やread_documentation
は起動しているので、MCP Serverは使用されていそうですね。
デフォルトで提供されているAIエージェントでも各種MCPサーバーを活用して色々とできるみたいで良いですね。mcp.json
にMCPサーバーを追加してこのAIエージェントで使用することも可能です。また試してみたいですね。
今度は自作したエージェントを試してみます。
ランタイムのセレクトボックスを切り替えます。
切り替えて、東京の天気を教えて
と聞いてみます。
おお!問題なく動きました!!天気取得ツールが使われているのもトレースから確認できました。
ちなみにセレクトボックスでモデルが選択可能ですが、現在は固定のモデルIDをコード上に書いているのでリクエストから送信したモデルIDを使用するよう修正します。
開発者ツールでどんなリクエストを送っているのか確認してみました。
model
オブジェクトの中にmodelId
が入った状態で送信されてくるんですね。
今回は対応しませんが、他にもmessages
には過去のやり取りが格納されるのはGenUでAgentCoreを扱う際に覚えておきたいですね。
これを踏まえてコードを修正して、再度デプロイします。
import os
from strands import Agent, tool
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp
app = BedrockAgentCoreApp()
@tool
def get_weather(city: str) -> str:
"""Get the weather for a given city"""
return f"The weather in {city} is sunny"
@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")
model = BedrockModel(model_id=model_id, params={"max_tokens": 4096, "temperature": 0.7}, region="us-west-2")
agent = Agent(model=model, tools=[get_weather])
stream_messages = agent.stream_async(message)
async for message in stream_messages:
if "event" in message:
yield message
if __name__ == "__main__":
app.run()
修正できたら再度デプロイします。
agentcore launch
デプロイが終わったら、モデルを切り替えて試してみます!
Cluade 3.7 Sonnet
に切り替えてみます。
問題なく動いていました!念の為リクエストで送信したモデルが適切に使われたかログも確認してみます。
無事切り替わって使われていますね!
モデルの切り替えを行いつつエージェントの挙動を試したい時に便利になりました!
感想
便利だなーと思ったのですが、私が感じたメリット・デメリットをまとめます。
メリット
- GenUの環境上で作成したAIエージェントを使える
- 既にチーム・会社などでGenUを展開している場合は、サクッと作ったAIエージェントが共有できるのは嬉しいポイントだなと思いました。
- Cognitoによる認証が提供されている環境なのも良いですよね。SAML連携でEntraIDによるSSOも可能です。
- フロントエンドを自作しなくてもいいのは嬉しいですよね。
- 既にチーム・会社などでGenUを展開している場合は、サクッと作ったAIエージェントが共有できるのは嬉しいポイントだなと思いました。
- AgentCoreを経由で起動しているのでLLMがBedrock以外も使用できる。
- GenU自体はBedrockを中心としたアーキテクチャです。その他LLMを使用する方法は、自分でカスタム実装するかMCPサーバー経由で呼び出すなど手はあるかと思いますが、少し手間かもしれません。一方、AgentCoreはBedrock以外のLLMも使用できるので、Azure OpenAIなども使用できます。
- もしGenU上で他のLLMを使いたい!ってなった際に薄くAIエージェントフレームワークなどでラップしてAgentCoreにデプロイして使うのもありかもしれませんね。GenU側はパラメーターを追加するだけなのも良い点かと思います。
AgentCoreで他のLLMを使用する記事は過去に記載したので、気になった方は下記記事をご参照ください。
デメリット
- 現時点ではAIエージェントに任意のリクエストパラメータを送れない
- モデルIDやプロンプト、過去メッセージは送信されていますがユーザーIDや任意のリクエストパラメータは送信できないので、Memory機能やリクエストパラメーターを使った処理を扱うのは難しいように感じました。(私が見逃していたらすみません・・・)
- 会話履歴はGenU側でデプロイされているDynamoDBに保存されているので、Short-term Memoryを使った連携機能は実装されないかもしれませんね。
あくまで現時点でExperimentalな機能なので今後より便利にAgentCoreと連携していけると嬉しいですね!!!楽しみです!!
下記PRを確認していると、将来的にはAgentCoreの様々な機能が連携されそうです!
おわりに
GenUでサクッとAgentCoreと連携して、作成したAIエージェントを呼び出してみました。
GenUを展開している環境で作成したAIエージェントを共有したいとなったケースで便利だなと感じました。
一方で未だExperimentalな機能なので今後より便利になっていくと嬉しいですね!
今後もアップデートがあれば検証していきたいと思います!
本記事が少しでも参考になりましたら幸いです!最後までご覧いただきありがとうございましたー!!