Generative AI Use Cases JP (略称:GenU) でサポートされたAmazon Bedrock AgentCore連携を試してみた

Generative AI Use Cases JP (略称:GenU) でサポートされたAmazon Bedrock AgentCore連携を試してみた

2025.09.07

はじめに

こんにちは、スーパーマーケットのラ・ムーが大好きなコンサルティング部の神野です!

直近、GenU v5.0.0でAmazon Bedrock AgentCore(以下AgentCore)の連携がサポートされました!!

https://github.com/aws-samples/generative-ai-use-cases/releases/tag/v5.0.0

AIエージェントは作ってみたけどフロントエンドをどうしよう・・・となった際に試せる場所があると便利ですね。また既にGenUを導入済みで、作成したAIエージェントもGenUの環境で確認したい・・・!!となった際に便利かと思います。

早速試していきたいと思います!

GenUについて

改めてGenUについて簡単に紹介です。
GenUは生成 AI を安全に業務活用するための、ビジネスユースケース集を備えたアプリケーション実装となります。
サクッと生成AIを使って、ビジネスにどう活用するのか検討する際に便利なものですね。

https://github.com/aws-samples/generative-ai-use-cases/tree/main

デプロイもシンプルで上記レポジトリをcloneしてデプロイコマンドを実行すればすぐ使えます。より詳細な話を確認したい場合は下記ブログなどをご参照いただくといいかと思います。

https://dev.classmethod.jp/articles/generative-ai-use-cases-jp-genu-installation-guide/

今回はローカルに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に記載し、インストールします。

requirements.txt
strands-agents
strands-agents-tools
bedrock-agentcore
bedrock-agentcore-starter-toolkit
pip install -r requirements.txt

Strands Agentを使ってシンプルなエージェントを作成します。
天気を聞いたら「晴れていますよ」と返すだけのシンプルなアプリケーションです。
ファイル名はagent.pyとします。

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.yamlDockerfileが自動で生成されるので、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を下記のように書き換えます。

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などには空の配列を渡します。

重要なパラメータはcreateGenericAgentCoreRuntimeagentCoreRegionagentCoreExternalRuntimesになります。

  • 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ベースのコンテナイメージをビルドできるようにするためですね。

https://github.com/aws-samples/generative-ai-use-cases/blob/main/docs/ja/DEPLOY_OPTION.md#agentcore-ユースケースの有効化

docker run --privileged --rm tonistiigi/binfmt --install arm64
npm run cdk:deploy

しばらく時間がかかりますが、少し待つと完了してURLが表示されます。

GenerativeAiUseCasesStack.WebUrl = https://xxx.cloudfront.net

アクセスするとCognitoのログイン画面が表示されますが、ユーザー登録を行なってログインします。

CleanShot 2025-09-06 at 18.53.54@2x

ログインが完了するとAgentCoreと表示されているメニューが存在します!!!
ロボットのアイコンが可愛いですね!

CleanShot 2025-09-06 at 12.35.19@2x

早速クリックして試してみます。
デフォルトで提供されているGenericAgentCoreRuntimeが表示されています。
このAIエージェントは下記で定義されているMCP Serverを使用できるので、今回はDocumentation MCP Serverを使用するような質問をしてみます。

mcp.json
{
  "_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"
      }
    }
  }
}

CleanShot 2025-09-06 at 12.41.06@2x

回答が返ってきました!!
MCPサーバーから得た結果を取得して、その結果をLLMが解釈して適切な言葉として返却していますね!

CleanShot 2025-09-06 at 12.42.43@2x

トレース結果を見ると、search_documentationread_documentationは起動しているので、MCP Serverは使用されていそうですね。

CleanShot 2025-09-06 at 12.43.14@2x

デフォルトで提供されているAIエージェントでも各種MCPサーバーを活用して色々とできるみたいで良いですね。mcp.jsonにMCPサーバーを追加してこのAIエージェントで使用することも可能です。また試してみたいですね。

今度は自作したエージェントを試してみます。
ランタイムのセレクトボックスを切り替えます。

CleanShot 2025-09-06 at 19.58.08@2x
切り替えて、東京の天気を教えてと聞いてみます。

CleanShot 2025-09-06 at 18.11.10@2x

おお!問題なく動きました!!天気取得ツールが使われているのもトレースから確認できました。
ちなみにセレクトボックスでモデルが選択可能ですが、現在は固定のモデルIDをコード上に書いているのでリクエストから送信したモデルIDを使用するよう修正します。
開発者ツールでどんなリクエストを送っているのか確認してみました。

CleanShot 2025-09-06 at 18.08.51@2x

modelオブジェクトの中にmodelIdが入った状態で送信されてくるんですね。
今回は対応しませんが、他にもmessagesには過去のやり取りが格納されるのはGenUでAgentCoreを扱う際に覚えておきたいですね。

これを踏まえてコードを修正して、再度デプロイします。

agent.py
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に切り替えてみます。

CleanShot 2025-09-06 at 18.31.38@2x

問題なく動いていました!念の為リクエストで送信したモデルが適切に使われたかログも確認してみます。

CleanShot 2025-09-06 at 20.09.15@2x
無事切り替わって使われていますね!
モデルの切り替えを行いつつエージェントの挙動を試したい時に便利になりました!

感想

便利だなーと思ったのですが、私が感じたメリット・デメリットをまとめます。

メリット

  • GenUの環境上で作成したAIエージェントを使える
    • 既にチーム・会社などでGenUを展開している場合は、サクッと作ったAIエージェントが共有できるのは嬉しいポイントだなと思いました。
      • Cognitoによる認証が提供されている環境なのも良いですよね。SAML連携でEntraIDによるSSOも可能です。
    • フロントエンドを自作しなくてもいいのは嬉しいですよね。
  • AgentCoreを経由で起動しているのでLLMがBedrock以外も使用できる。
    • GenU自体はBedrockを中心としたアーキテクチャです。その他LLMを使用する方法は、自分でカスタム実装するかMCPサーバー経由で呼び出すなど手はあるかと思いますが、少し手間かもしれません。一方、AgentCoreはBedrock以外のLLMも使用できるので、Azure OpenAIなども使用できます。
    • もしGenU上で他のLLMを使いたい!ってなった際に薄くAIエージェントフレームワークなどでラップしてAgentCoreにデプロイして使うのもありかもしれませんね。GenU側はパラメーターを追加するだけなのも良い点かと思います。

AgentCoreで他のLLMを使用する記事は過去に記載したので、気になった方は下記記事をご参照ください。

https://dev.classmethod.jp/articles/amazon-bedrock-agentcore-identity-cognito-azure-openai/

デメリット

  • 現時点ではAIエージェントに任意のリクエストパラメータを送れない
    • モデルIDやプロンプト、過去メッセージは送信されていますがユーザーIDや任意のリクエストパラメータは送信できないので、Memory機能やリクエストパラメーターを使った処理を扱うのは難しいように感じました。(私が見逃していたらすみません・・・)
    • 会話履歴はGenU側でデプロイされているDynamoDBに保存されているので、Short-term Memoryを使った連携機能は実装されないかもしれませんね。

あくまで現時点でExperimentalな機能なので今後より便利にAgentCoreと連携していけると嬉しいですね!!!楽しみです!!
下記PRを確認していると、将来的にはAgentCoreの様々な機能が連携されそうです!

https://github.com/aws-samples/generative-ai-use-cases/pull/1191

おわりに

GenUでサクッとAgentCoreと連携して、作成したAIエージェントを呼び出してみました。
GenUを展開している環境で作成したAIエージェントを共有したいとなったケースで便利だなと感じました。

一方で未だExperimentalな機能なので今後より便利になっていくと嬉しいですね!
今後もアップデートがあれば検証していきたいと思います!

本記事が少しでも参考になりましたら幸いです!最後までご覧いただきありがとうございましたー!!

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.