[Amazon Bedrock AgentCore]Observability機能のGenAI Observabilityダッシュボードを確認してみた
はじめに
こんにちは、スーパーマーケットのラ・ムーを推ししているコンサルティング部の神野です。
今日はAmazon Bedrock AgentCore Observabilityを紹介したいと思います!メトリクス関連の収集機能です。
名前を聞いて、可観測性・・・?難しそう・・・?と直感的に思ったので、この記事では紐解いていければと思っています!
AgentCore Observability
AgentCore Observabilityはエージェントのパフォーマンスのトレース、デバッグ、監視に役立つ機能になります。
エージェントを開発・運用していく中で挙動を見たい時に役立つ機能ですね!
公式のドキュメントの絵を見ると下記のような機能でした。
AgentCore Runtime、Memory、Gatewayの情報を収集して、OTEL(Open Telemetry) logsとして変換して見えるようにしたものです。
主要なテレメトリとしてはメトリクス、構造化ログ、スパンとトレースの3つに分かれています。それぞれに特徴があるので、順番に見ていきたいと思います!
まずメトリクスですが、これは呼び出し数、レイテンシ、期間、トークン使用量、セッション数、スロットル、ユーザーエラー、システムエラーの集計といった基本的な指標を表します。
CloudWatchのメトリクスとして提供されるので、比較的わかりやすい項目かと思います。エージェントのパフォーマンスや利用状況を把握するのに便利ですね。
次に構造化ログは、これはイベントの取り込み、長期メモリの抽出、統合手順、各種操作などをキャプチャするJSON形式のログになります。OpenTelemetry規格に準拠したJSON形式でエージェントの詳細な動作ログを記録してくれます。エージェントがどのような判断をしたか、どのツールを使用したか、どのようなプロンプトを処理したかなどの詳細情報が含まれているので、デバッグ時にとても役立つと思います。
最後にスパンとトレースですが、トレースはエージェントの呼び出しから応答までの完全な実行パスを記録し、スパンはその中の個別の操作単位を表しています。階層構造になっているので、どの処理にどれくらい時間がかかったかなどを視覚的に確認できるのが特徴ですね。
AgentCore Observabilityではトレースを束ねる単位としてセッションが存在し、会話全体をイメージしています。下記のようなイメージです。
ダッシュボード統合
ビルトインで備わったダッシュボードになります。CloudWatchから見れる便利な機能です。
GenAI Observability
といった機能で提供されています。
トランザクション検索の有効化
スパンの取り込みを許可するには、アカウントごとにトランザクション検索を1回有効にします。
下記のEnable Transaction Search
ボタンを押して、有効化します。
必要な依存関係
AgentCore RuntimeでOTEL logsを収集する場合は、aws-opentelemetry-distro
を依存関係に含める必要があります。ただ、AgentCoreのstarter toolkitを使ってデプロイすると自動的にopentelemetry-instrument
が有効化されて可視化できるようになっています。
下記図のようなイメージです。
ロググループ
Runtimeを使う場合は、2種類のログストリームが出力されます。
- runtime-logs
- OpenTelemetry規格のログ
- YYYY/MM/DD/[rruntime-logs]xxxx
- アプリケーションログ
色々と機能が多いですね・・・!!
今回はGenAI Observabilityダッシュボードを中心に見ていきたいと思います!
事前準備
今回使用するエージェント
今回は今までに作ったエージェントでどういったことが見れるのか確認してみます。
Memory機能を使ったエージェントで検証してみます。
試してみる
chat.py
のruntime-session-id
を同じ値にしておきます。
runtime_session_id = "sample-id-xxxx"
早速エージェントで質問します。
python chat.py "S3バケットのセキュリティについて教えて" --user "test_user" --session "session_test" [11:05:31]
"実践的なアドバイス:\n- AWS公式ドキュメントを定期的に確認\n- セキュリティグループとバケットポリシーを慎重に設定\n- 最小権限の原則を常に意識\n\n質問や具体的な実装について、さらに詳しく知りたいことはありますか?"
python chat.py "セキュリティの権限周りが苦手でして・・・具体的にはどういった設定をしたらいいですか?" --user "test_user" --session "session_test"
"S3バケットのセキュリティ設定のポイントを具体的に説明します:\n\n1. バケットアクセス設定\n- パブリックアクセスをブロック\n - \"パブリックアクセスをすべてブロック\"オプションを有効化\n - デフォルトで全てのパブリックアクセスを禁止\n\n2. バケットポリシーの設定\n- 最小権限の原則を適用\n ```json\n {\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"RestrictBucketAccess\",\n \"Effect\": \"Deny\",\n \"Principal\": \"*\",\n \"Action\": \"s3:*\",\n \"Resource\": [\n \"arn:aws:s3:::your-bucket-name\",\n \"arn:aws:s3:::your-bucket-name/*\"\n ],\n \"Condition\": {\n \"NotIpAddress\": {\n \"aws:SourceIp\": \"許可するIPアドレス/範囲\"\n }\n }\n }\n ]\n }\n ```\n\n3. IAMユーザー/ロールの権限管理\n- 具体的に必要な操作のみ許可\n- 読み取り/書き込み権限を分離\n- 定期的な権限見直し\n\n4. 暗号化の有効化\n- サーバー側の暗号化を有効化\n - SSE-S3 (AWS管理キー)\n - SSE-KMS (カスタマー管理キー)\n\n5. バージョニングと追跡\n- バージョニングを有効化\n- CloudTrailでアクセスログ記録\n\n実践的なアドバイスとして、以下をお勧めします:\n- AWS公式ドキュメントを参照\n- セキュリティグループを段階的に設定\n- 最小権限の原則を意識\n\n具体的な実装や設定で不安な点はありますか?一緒に丁寧に確認しましょう。
ツールを使うような質問もします。苦手分析ツールです。
python chat.py "私の苦手を分析して" --session "session_test" --user "test_user" [11:21:58]
"分析結果から、あなたは特にクラウドコンピューティングのセキュリティ権限設定に苦手意識があることがわかりました。S3バケットのセキュリティに焦点を当てて、具体的にアドバイスします:\n\n1. IAM (Identity and Access Management) の基本\n- バケットへのアクセス権は「最小権限の原則」で設定\n- ユーザーやロールに必要最小限の権限のみ付与\n\n2. バケットポリシーの設定のポイント\n- 読み取り、書き込み、削除などの権限を細かく制御\n- 特定のIPアドレスからのアクセス制限\n- 暗号化の有効化\n\n3. 具体的な設定例\n```json\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Principal\": {\"AWS\": \"arn:aws:iam::xxxxxxxxxxxx:user/username\"},\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\"\n ],\n \"Resource\": \"arn:aws:s3:::your-bucket-name/*\"\n }\n ]\n}\n```\n\n段階的に学んでいくことをおすすめします。まずは1つの設定から始めて、徐々に理解を深めていきましょう。\n\n追加で詳しく知りたい点や、具体的な疑問があれば教えてください。一緒にステップバイステップで学んでいきます。"
これで一旦CloudWatchのダッシュボードを見てみます。
左側のタブでGenAI observabilityをクリックします。クリックしてタブをBedrock AgentCore
をクリックします。
何やらかっこいいダッシュボードが出てきましたね。
3つのView(Agents view, Sessions view、Traces view)が存在して、それぞれの観点でメトリクスや挙動を確認できます。
Agents view
デプロイしたAgentの挙動が確認できます。
Session数やTrace数、エラーやスロットルなどがないかをパッと見でわかるような作りですね。
エージェント一覧からデプロイされているエンドポイントもクリックできるので、エージェント単位で詳細が見たい際はリンクをクリックします。
こちらはエージェント単位でより詳細に見れる感じですね。
またSessionsタブ、Tracesタブを押下するとこのエージェント内のSession一覧とTraces一覧を確認できます。
エージェント単位で詳細に見ていく際はこんな動線になるのかなと思いました。
SessionやTracesはこの後に説明します。
Sessions view
エージェントのSession一覧が確認できます。
私が先ほど作った適当な名前のSession IDも存在しますね。クリックしてみます。
クリックすると今度はこのSessionのサマリーが確認できます。紐づくTraceも見れますね。
クリックするとより詳細に見れます。
Traces View
ここは全てのトレースが一覧で見れます。最新のトレースを押下します。
押下するとグラフィカルなダッシュボードが出てきます。Traces内のSpansを可視化してくれていますね。
それぞれのスパンで経過時間が確認できて、ボトルネック特定しやすそうで良いですね!
Trajectory
フローで見れるのわかりやすいですね。これだとエージェントが起動して、ツールを起動して・・・みたいなフローがわかりやすいですね。
今回実行された苦手分析のツールidentity_weak_areas
もしっかり残っていますね。
また下のSpansを見ると、どういったAIが行動したのか分かり易いです。
時系列順に並んでいます。Eventの1つを開くとログが見れます。
Event 1を見てみましょう。
{
"resource": {
"attributes": {
"deployment.environment.name": "bedrock-agentcore:default",
"aws.local.service": "my-agent.DEFAULT",
"service.name": "my-agent.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/my-agent-xxxx/runtime-endpoint/DEFAULT:DEFAULT",
"aws.log.group.names": "/aws/bedrock-agentcore/runtimes/my-agent-xxxx-DEFAULT",
"telemetry.sdk.version": "1.33.1",
"cloud.platform": "aws_bedrock_agentcore",
"telemetry.auto.version": "0.11.0-aws"
}
},
"scope": {
"name": "opentelemetry.instrumentation.botocore.bedrock-runtime",
"schemaUrl": "https://opentelemetry.io/schemas/1.30.0"
},
"timeUnixNano": 1756785750184271639,
"observedTimeUnixNano": 1756785750184290707,
"severityNumber": 9,
"severityText": "",
"body": {
"content": [
{
"text": "あなたは優秀な技術学習アシスタントです。\n エンジニアの技術学習をサポートし、理解度を記録し、効果的な学習方法を提案します。\n \n 以下のツールが利用可能です:\n - analyze_learning_progress: 学習進捗を分析(特定の技術分野も指定可能)\n - identify_weak_areas: 苦手分野を特定\n - suggest_review_topics: 復習すべきトピックを提案\n - get_session_summary: 学習セッションのサマリーを取得\n \n 以下の点に注意してください:\n - 技術的な質問には具体的な例を交えて説明する\n - 理解度を確認しながら進める\n - 苦手分野を特定したら、それに応じた学習方法を提案する\n - 励ましと建設的なフィードバックを提供する\n - 必要に応じてツールを活用して学習状況を把握する\n "
}
]
},
"attributes": {
"event.name": "gen_ai.system.message",
"gen_ai.system": "aws.bedrock"
},
"flags": 1,
"traceId": "68b66c556c14723d4f7168399c6e91af",
"spanId": "ad1a0ebc825b849e"
}
Event1はシステムプロンプトをAIに伝えているログでした。
Event2も見てみましょう。
{
"resource": {
"attributes": {
"deployment.environment.name": "bedrock-agentcore:default",
"aws.local.service": "my-agent.DEFAULT",
"service.name": "my-agent.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/my-agent-xxxx/runtime-endpoint/DEFAULT:DEFAULT",
"aws.log.group.names": "/aws/bedrock-agentcore/runtimes/my-agent-xxxx-DEFAULT",
"telemetry.sdk.version": "1.33.1",
"cloud.platform": "aws_bedrock_agentcore",
"telemetry.auto.version": "0.11.0-aws"
}
},
"scope": {
"name": "opentelemetry.instrumentation.botocore.bedrock-runtime",
"schemaUrl": "https://opentelemetry.io/schemas/1.30.0"
},
"timeUnixNano": 1756779796818481971,
"observedTimeUnixNano": 1756779796818488400,
"severityNumber": 9,
"severityText": "",
"body": {
"content": [
{
"text": "S3バケットのセキュリティについて教えて"
}
]
},
"attributes": {
"event.name": "gen_ai.user.message",
"gen_ai.system": "aws.bedrock"
},
"flags": 1,
"traceId": "68b6551285d1b1a532aa55b39fa596eb",
"spanId": "a02614dcd6a51732"
}
具体的な質問に続いていますね。分かり易いです。過去の質問履歴も取り込んだ履歴になっていますね。
Event6で苦手分析の質問した内容が含まれていました。
{
"resource": {
"attributes": {
"deployment.environment.name": "bedrock-agentcore:default",
"aws.local.service": "my-agent.DEFAULT",
"service.name": "my-agent.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/my-agent-xxxx/runtime-endpoint/DEFAULT:DEFAULT",
"aws.log.group.names": "/aws/bedrock-agentcore/runtimes/my-agent-xxxx-DEFAULT",
"telemetry.sdk.version": "1.33.1",
"cloud.platform": "aws_bedrock_agentcore",
"telemetry.auto.version": "0.11.0-aws"
}
},
"scope": {
"name": "opentelemetry.instrumentation.botocore.bedrock-runtime",
"schemaUrl": "https://opentelemetry.io/schemas/1.30.0"
},
"timeUnixNano": 1756779796818529300,
"observedTimeUnixNano": 1756779796818534000,
"severityNumber": 9,
"severityText": "",
"body": {
"content": [
{
"text": "私の苦手を分析して"
}
]
},
"attributes": {
"event.name": "gen_ai.user.message",
"gen_ai.system": "aws.bedrock"
},
"flags": 1,
"traceId": "68b6551285d1b1a532aa55b39fa596eb",
"spanId": "a02614dcd6a51732"
}
これを追っかけることでどういった挙動をフローで行ったのか、視覚的に調査しやすいですね。
おわりに
Amazon Bedrock AgentCore Observabilityの機能であるダッシュボードを中心に見ました!
ボタンで有効化してビルドインの機能でデプロイすればAIエージェントがOpenTlemetry規格でトレース可能で、視覚的にAIエージェントの挙動が確認できるのは便利ですね。
見れる観点が多くて、実際の運用でどう使うのかなど今後紹介したいなと思いました!
本記事が少しでも参考になりましたら幸いです。最後までご覧いただきありがとうございましたー!!