アプリケーション推論プロファイルをClineに設定して、Amazon Bedrockの利用者ごとの料金をモニタリングする

:::note info
この記事は2025/5/22に記載しています。最新の情報とは異なる可能性があるため、各種公式ページを参照ください。
:::

Clineでユーザーごとに料金をモニタリングするための、アプリケーション推論プロファイルがサポートされていたので使ってみました。

https://github.com/cline/cline/pull/2078

### 推論プロファイルとは？

生成AIモデルの呼び出しに関する設定をまとめたリソースです。<br>リクエストは推論プロファイルを介して、特定モデルの特定リージョン（クロスリージョン推論モデルの場合は複数リージョン先）にルーティングします。

クロスリージョン推論モデル（Claude 3.5 Sonnet v2やClaude 3.7 Sonnetなど）には、**システム定義の推論プロファイル（System-defined Inference profile）** と呼ばれるAWS側で事前定義されたものが使用されており、これによってクロスリージョン推論を実現しているようです。これは **クロスリージョン推論プロファイル** と呼ばれています。

### アプリケーション推論プロファイルとは？

ユーザーが独自に作成する推論プロファイルのことで、特定のアプリケーションやユースケースに合わせた設定が可能になります。システム定義の推論プロファイルをコピーしてカスタマイズすることができます。

今回はこれを利用することでチームやメンバー単位でBedrock利用状況を管理します。<br>アプリケーション推論プロファイルにコスト配分タグを設定します。

[Amazon Bedrock を使用した生成 AI のコストと使用状況の追跡、配分、管理](https://aws.amazon.com/jp/blogs/news/track-allocate-and-manage-your-generative-ai-cost-and-usage-with-amazon-bedrock/)

## 事前準備
1. ClineからAmazon Bedrockを呼び出せていること
    1. [Amazon Bedrock基盤モデルへのアクセスリクエスト](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/getting-started.html#getting-started-model-access) 
    2. APIを呼び出すのに必要なアクセス許可（`bedrock:InvokeModel`, `bedrock:InvokeModelWithResponseStream`があること）
    3. [Cline](https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev) のインストールがされていること


2. 推論プロファイル作成に必要なIAM権限が存在すること
   以下のポリシーをアタッチする
   参考：[Amazon Bedrockによって定義されたアクション](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonbedrock.html)


```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "bedrock:CreateInferenceProfile",
                "bedrock:GetInferenceProfile",
                "bedrock:ListInferenceProfiles",
                "bedrock:TagResource",
                "bedrock:ListTagsForResource"
            ],
            "Resource": [
                "arn:aws:bedrock:*:*:application-inference-profile/*"
            ]
        }
    ]
}
```




## 設定手順

### 1. アプリケーション推論プロファイルの作成

#### 作成例
AWS CLIまたはCloudShellを使って、アプリケーション推論プロファイルを作成します。
`--tags` にチームと個人のコスト配分タグをつけることによって、個人集計とチーム集計ができるようにしました。他にも環境などに応じて分類したい場合はtagsに追加します。

※ `aws bedrock`コマンドが利用できるAWS CLIバージョン2.13.0以降である必要があります。

```bash
aws bedrock create-inference-profile --region 'ap-northeast-1' \
--inference-profile-name 'teamA-bedrock-bellshun2' \
--model-source '{"copyFrom": "arn:aws:bedrock:ap-northeast-1:<アカウントID>:inference-profile/apac.anthropic.claude-3-5-sonnet-20241022-v2:0"}' \
--tags '[{"key": "Team","value": "teamA"},{"key": "MemberName","value": "bellshun"}]'
```

#### 補足
- 上記はClaude3.5 Sonnet v2を東京リージョンで設定した例です
- クロスリージョン専用モデルは推論プロファイルを介してモデルにアクセスするため、Claude 3.5 Sonnet v2やClaude 3.7 Sonnetは `--model-source` に以下のInference profile ARNを指定します（または、 `aws bedrock list-inference-profiles --type-equals SYSTEM_DEFINED --region ap-northeast-1` にて利用モデルのシステム定義の推論プロファイルを探します）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123871/655be4dc-12b9-4048-9951-e4f99583d35f.png)


## 2. Clineの設定
以下コマンドを実行し、作成した推論プロファイルの `inferenceProfileArn` を取得します。

```
aws bedrock list-inference-profiles --region 'ap-northeast-1' --type-equals 'APPLICATION'
```

出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123871/cb410ac5-f6a5-4e24-8616-0e4a4be053b4.png)

#### Cline設定画面

ModelをCustomにして、Model IDとBase Inference Modelを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123871/b8704d7a-f3af-49db-a3a2-006de9983dae.png)


設定後にClineが通常通り動作していれば完了です。

## 3. コスト配分タグの有効化

作成してから最大24時間後にタグが現れるようになります。
AWS Billing and Cost Managementの「コスト配分タグ」を選択し、作成したタグ（上記の通りだと「Team」と「MemberName」）を有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123871/0190a235-1959-4698-b2b4-8be30d9dffb6.png)


## 4. AWS Cost ExplorerやCloudWatchメトリクスでモニタリング
3,4の手順は反映までに時間がかかるので気長に待ちます。
タグからコスト配分タグを選択できるようになるので、設定したタグごとのコスト確認が可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123871/fc658da9-a96d-4876-a4d9-602bd4ebbd65.png)

また、Amazon CloudWatchメトリクスでプロファイルごとの呼び出し回数、処理時間、トークン数などを監視できるようになります。Model IDの指定にアプリケーション推論プロファイルのIDを入れることで絞り込むことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123871/0a294501-e074-4a5c-b19d-cc9c5b1d9231.png)


## (必要に応じて) 推論プロファイルの利用強制

アプリケーション推論プロファイルを指定しないBedrockの直接呼び出しを拒否し、特定の推論プロファイル経由のみ許可するIAMポリシーを設定することが必要な場合もあると思います。
今回は利用人数も限られていたため、アプリケーション推論プロファイル経由でClineを利用するルールをチーム内で定めるのみとしました。

## 注意

[Amazon Bedrock でサポートされている基盤モデル](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/models-supported.html) に記載の通り、Claude 3.5 Sonnet v2やClaude 3.7 Sonnetはクロスリージョン推論プロファイルを介してアクセスされるため、リージョンに関するプロジェクト制約がある場合は利用できない可能性があります。

[推論プロファイルでサポートされているリージョンとモデル](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/inference-profiles-support.html) から、どのリージョンにルーティングされるかを確認できます。

例えば、Claude 3.5 Sonnet v2東京リージョンが送信元の場合は、大阪やシドニーリージョンにもルーティングされるので、東京リージョン限定プロジェクトなどでは利用できません。

## リアルタイムモニタリングとRate Limitについて

今回の方法では、以下は実現できません。
費用対効果を鑑みて、今回はモニタリングのみ行いました。

1. リアルタイムモニタリング
2. メンバー毎に、トークン数やコストに対するRate Limit処理

上記のようなより柔軟な制御を必要とする場合は、LangFuseによるリアルタイムな詳細モニタリングとLiteLLMによるProxy導入が有効です。

ちょうど先日以下の記事が公開されており、参考になります。
[開発生産性向上とガバナンスの両立を目指した、Cline with Amazon Bedrock と LiteLLM 活用のコツ](https://aws.amazon.com/jp/blogs/news/cline-with-bedrock-3-governance/)