📝

Amazon Bedrock AgentCoreを試した所感

に公開

AWS Summit NYCで発表されたAmazon Bedrock AgentCoreというAI Agentをマネージドにデプロイできるサービスをサンプルのアプリを用意して試してみました。

https://aws.amazon.com/bedrock/agentcore/

StrandsAgentのサンプルアプリを用意

Strands AgnentからKnowledge MCPを使うコードになります。

from strands import Agent
from mcp.client.streamable_http import streamablehttp_client
from strands.tools.mcp import MCPClient
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp


app = BedrockAgentCoreApp()
bedrock_model = BedrockModel(
   model_id="us.anthropic.claude-sonnet-4-20250514-v1:0"
)

@app.entrypoint
async def invoke(payload):

    streamable_http_mcp_client = MCPClient(lambda: streamablehttp_client(
       "https://knowledge-mcp.global.api.aws")
    )
    # Create an agent with MCP tools
    with streamable_http_mcp_client:
       # Get the tools from the MCP server
       tools = streamable_http_mcp_client.list_tools_sync()
       agent = Agent(model=bedrock_model,tools=tools)
       user_message = payload.get("prompt","hello")
       stream = agent.stream_async(user_message)
       async for event in stream:
         print(event)
         yield(event)
    #       
 
if __name__ == "__main__":
    app.run()

AgentCoreへのデプロイ

Bedrock AgentCore用のRole[1]を作成しておく。
後述のagentcore runで新しいリビジョンをデプロイすると、latestタグをoverwriteするため、ECRを作成しておきますが、Tag immutabilityをMutableにしておく必要があります。

uv run agentcore configure --entrypoint main.py -er $IAM_ROLE_ARN
uv run agentcore run

AgentCoreは現状ARMアーキテクチャのみ対応しており、intelアーキテクチャの環境からビルドする場合うまくいかないことがある。
QEMUでマルチプラットフォームでビルドする環境を整えておく必要があります
https://qiita.com/hayao_k/items/aed1b7062ba403d70a12

下記issueにも書かれていますが、0.1.0ではまだ対応していないとのこと。
agentcore run --codebuild

Frontend

invoke_agent_runtimeをStreamlintから呼び出せば、チャットUIをつくることが簡単にできます。[2]

ログ

AgentCoreのログは、Cloudwatch Logsのみに出力されます

プロンプトやTool useの途中数論の課程のログもすべて記録されています。

{
    "resource": {
        "attributes": {
            "deployment.environment.name": "bedrock-agentcore:default",
            "aws.local.service": "main.DEFAULT",
            "service.name": "main.DEFAULT",
            "cloud.region": "us-west-2",
            "aws.log.stream.names": "runtime-logs",
            "telemetry.sdk.name": "opentelemetry",
            "aws.service.type": "gen_ai_agent",
            "telemetry.sdk.language": "python",
            "cloud.provider": "aws",
            "cloud.resource_id": "arn:aws:bedrock-agentcore:us-west-2:xxxxxxxxxxxx:runtime/main-rVLdVz8WIg/runtime-endpoint/DEFAULT:DEFAULT",
            "aws.log.group.names": "/aws/bedrock-agentcore/runtimes/main-rVLdVz8WIg-DEFAULT",
            "telemetry.sdk.version": "1.33.1",
            "cloud.platform": "aws_bedrock_agentcore",
            "telemetry.auto.version": "0.1.6-aws"
        }
    },
    "scope": {
        "name": "opentelemetry.instrumentation.botocore.bedrock-runtime",
        "schemaUrl": "https://opentelemetry.io/schemas/1.30.0"
    },
    "timeUnixNano": 1752890294921734500,
    "observedTimeUnixNano": 1752890294921745001,
    "severityNumber": 9,
    "severityText": "",
    "body": {
        "content": [
            {
                "text": "describe best practice about vpc lattice"
            }
        ]
    },
    "attributes": {
        "event.name": "gen_ai.user.message",
        "gen_ai.system": "aws.bedrock"
    },
    "flags": 1,
    "traceId": "687afbb1fd5cc8569d31603b101fdc6c",
    "spanId": "a79e2e26dfb98b99"
}

また、OpenTelemetryのトレース情報もCloudwatch Custom Metricsに記録されています。
Cloudwatch Agentはhistogram metricsに対応していないので、レスポンスタイムは対応していないと思われます。
カスタムメトリクスに大量に書き込むのでコストも気になります。
Amazon managed for prometheousに対応を期待したい。

{
    "_aws": {
        "Timestamp": 1752883420402,
        "CloudWatchMetrics": [
            {
                "Namespace": "bedrock-agentcore",
                "Dimensions": [
                    [
                        "http.scheme",
                        "http.host",
                        "http.flavor",
                        "http.method",
                        "http.server_name"
                    ]
                ],
                "Metrics": [
                    {
                        "Name": "http.server.active_requests"
                    }
                ]
            }
        ]
    },
    "Version": "1",
    "otel.resource.telemetry.sdk.language": "python",
    "otel.resource.telemetry.sdk.name": "opentelemetry",
    "otel.resource.telemetry.sdk.version": "1.33.1",
    "otel.resource.service.name": "main.DEFAULT",
    "otel.resource.aws.log.group.names": "/aws/bedrock-agentcore/runtimes/main-rVLdVz8WIg-DEFAULT",
    "otel.resource.aws.log.stream.names": "runtime-logs",
    "otel.resource.deployment.environment.name": "bedrock-agentcore:default",
    "otel.resource.cloud.resource_id": "arn:aws:bedrock-agentcore:us-west-2:xxxxxxxxxxxx:runtime/main-rVLdVz8WIg/runtime-endpoint/DEFAULT:DEFAULT",
    "otel.resource.cloud.platform": "aws_bedrock_agentcore",
    "otel.resource.cloud.provider": "aws",
    "otel.resource.cloud.region": "us-west-2",
    "otel.resource.telemetry.auto.version": "0.1.6-aws",
    "otel.resource.aws.local.service": "main.DEFAULT",
    "otel.resource.aws.service.type": "gen_ai_agent",
    "http.server.active_requests": 0,
    "http.scheme": "http",
    "http.host": "127.0.0.1:8080",
    "http.flavor": "1.1",
    "http.method": "GET",
    "http.server_name": "localhost:8080"
}

1分毎にpingリクエストがされているので、上記トレース情報が埋もれてしまう。

INFO:     127.0.0.1:40694 - "GET /ping HTTP/1.1" 200 OK
脚注
  1. https://qiita.com/Syoitu/items/e85c9d9bd389c987d7bc ↩︎

  2. https://github.com/minorun365/bedrock-agentcore-sample/blob/main/frontend/client.py ↩︎

Discussion