Amazon Bedrock AgentCoreを試した所感
AWS Summit NYCで発表されたAmazon Bedrock AgentCoreというAI Agentをマネージドにデプロイできるサービスをサンプルのアプリを用意して試してみました。
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でマルチプラットフォームでビルドする環境を整えておく必要があります
下記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
Discussion