AWS Bedrock Integrationを使用してBedrockの使用状況を可視化する

# はじめに
生成AIを利用しているとどのぐらいトークンを使ったのか、といったメトリックや、生成AIへのプロンプトとレスポンスの生データを見たい、というLoggingの要望がかなりあるのではないかと思います。
Elastic v8.16.0からAWS BedrockのInvocation LogとMetricを取得して可視化するIntegrationがリリースされました。ドキュメントはこちらです。
https://www.elastic.co/docs/current/integrations/aws_bedrock
この機能についてのブログもリリースされています。
https://www.elastic.co/observability-labs/blog/llm-observability-aws-bedrock

:::note info
本記事はv8.16.0をベースに記載しています
:::

# 手順
以下の3ステップです。
1. Bedrock Invocation Logの設定を行う
2. Bedrock Integrationを設定する
3. Elastic Agent (or Serverless ForwarderやFirehoseなど)でElasticsearchへの送信設定をする

データの流れとしては
Bedrock Invocation Log => CloudWatch Log => Elastic Agent => Elasticsearch
となります。

# Bedrock
Bedrock Invocation Loggingで検索すると結構ヒットします。
例えばこことか。
https://dev.classmethod.jp/articles/amazon-bedrock-model-invocation-logging/

こんな感じで設定します。
![スクリーンショット 2024-11-28 14.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/52def084-d219-ed82-40ff-8d9a939f1bba.png)


あらかじめCloudwatch LogのLog Groupを作成しておいてください。
Service roleはこの画面で`Create and use a new role`を選べばよしなに作成してくれます。
設定に問題がなければ、以下のようなログがCloudwatchに表示されます。
![スクリーンショット 2024-11-27 13.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/c810ae59-ab5f-5f60-3202-fa9a03742481.png)

## ログデータ確認
BedrockのPlaygroundでChatをやってみるのが一番手っ取り早いです。
![スクリーンショット 2024-11-27 13.20.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/4635051b-2373-3d26-187e-f1ecee656056.png)
その後、Cloudwatchには以下のようなログが出てきます。
![スクリーンショット 2024-11-27 13.26.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/e3cbc076-2777-679a-75d0-71ceefb0b442.png)

# AWS Bedrock Integration
Integrationはログを自動的に整形して可視化のダッシュボードを作成するものです。
Ingest PipelineとKibana Lensが主な構成要素です。

まず3本線メニューからManagementの下にある`Integrations`をクリックします。
![スクリーンショット 2024-11-27 17.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/305ca722-64b8-7de4-ab54-f9bd32e37d6d.png)

検索バーがあるので`bedrock`と入力すると以下のようにフィルタされるので、表示されているAmazon Bedrockをクリックします。
![スクリーンショット 2024-11-27 17.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/ec3a5dff-b450-111e-7d56-02a29d4fd9f1.png)

右上の`Add Amazon Bedrock`をクリックします。
![スクリーンショット 2024-11-27 17.26.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/f5507cf3-af7d-14b7-b919-aef5c7a0eafe.png)

:::note
次の画面はクラスタ作成後に初めてIntegrationsを追加する人だけ表示されます
:::
この画面が表示されたら、一番下の`Add integration only (skip agent installation)`をクリックします。
![スクリーンショット 2024-11-27 17.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/1dd0a763-e2f0-1c98-9248-d8fdad88c7d5.png)

次の部分に入力して、最後に一番下にある`Save and continue`をクリックして保存します。
- Access Key ID
- Secret Key
- Collect Logs from Cloudwatchを有効にしてから`Change default`をクリックして詳細設定を展開して`Log Group ARN`を入力
![スクリーンショット 2024-11-27 17.41.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/4c58e0d8-aad3-bb28-9d0d-70b1d4c6a237.png)

次に`Add Elastic Agent to your hosts`をクリックしてElastic Agentをインストールします。
![スクリーンショット 2024-11-27 17.44.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/47bc9df3-04ba-8d59-86cc-5d6bc9448563.png)

少しスクロールダウンすると各環境におけるインストールコマンドが表示されていますので、これをコピー＆ペーストしてインストールします。
![スクリーンショット 2024-11-27 17.47.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/50078d9e-0e3a-3f81-f1b9-062cc62c62b6.png)

問題なくインストールができて設定に問題がなければ以下のようになります。
![スクリーンショット 2024-11-27 18.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/39f504ea-b6de-cfe7-4faf-0128bfff1d74.png)

# ダッシュボード
データが来たところで、ダッシュボードで確認してみましょう。
3本線メニューから`Dashboard`をクリックします。
![スクリーンショット 2024-11-27 18.07.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/ac9e6aae-ef3f-372b-cf25-1a2a5fdf8676.png)

`[Amazon Bedrock] Overview`をクリックします。他にもダッシュボードがいっぱいあって見つからない場合は検索窓にbedrockと入れてください。
![スクリーンショット 2024-11-27 18.09.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/2726006e-8f92-6dd7-e21f-da39e98bff07.png)

デフォルトでは直近15分のデータしか表示しません。PlaygroundのChatを触ったのはだいぶ前だと思いますので、右上の`Last 15 minutes`の横のカレンダーアイコンをクリックして、Playgroundを操作した時間が範囲に入るように時間範囲を選びます。
![スクリーンショット 2024-11-27 18.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/a0069c5d-408c-63ae-e252-6e3f333e78c2.png)

## 全体画面
上の方はメトリック、真ん中あたりにInvocation Logがあります。
メトリックで気になるのはToken Usageあたりではないかと思います。
![-Amazon-Bedrock-Overview-Elastic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/285ccc6a-629c-ecf4-ee6d-f68a5242eb8f.png)

## Discoverで確認
Discoverに移って`logs-*`を表示し、フィールドを`bedrock`でフィルタします。Bedrock関係のフィールドが表示されるので、興味のあるフィールドをクリックしてみましょう。
![スクリーンショット 2024-11-28 13.21.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/68bb6405-01a7-e8e7-bf96-d2aec9700f77.png)

`aws_bedrock.invocation.model_id`というフィールドは全てのログに入っているので、これが存在することを条件とするフィルタを掛けると、Invocation関係のログのみ表示できます。
![スクリーンショット 2024-11-28 13.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/21c4b00c-24bd-a832-ee49-488bebfcbff7.png)

当然全文検索エンジンなので、Chatで使った単語を打ち込めばそれでも検索できます。
例えばここでは"ERR-1000"というエラー番号で検索をかけています。
エラー番号などに曖昧な検索は必要ないので、ここはキーワード検索が必須になると思います。
![スクリーンショット 2024-11-28 13.28.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/5bffca9b-f348-7120-e42f-2073d4644e01.png)

誰が使っているかを知りたい場合は`gen_ai.user.id`に入っています。

# まとめ
Elasticでは生成AIと連携するツールを数多く出してきました。
本記事の機能を利用することにより、生成AIにかかるコストの把握や、プロンプトエンジニアリングがやりやすくなります。
また誰が使用しているかも一目瞭然ですので、セキュリティチェックにも有用です。

検索/O11y/Security全てできるElasticは生成AIを利用するのに最適なプラットフォームです。
是非お試し下さい。