Amazon Bedrock Mantle endpoint経由の利用料を利用者別に管理できるか確認してみた
はじめに
Amazon Bedrock Runtime APIでは、Application Inference Profileを使うと、利用者ごとの料金を管理できます。
Mantle endpointでも同じように利用者ごとに料金を管理できるのか気になったのでやってみました。
先に結論
Mantle Projectを使うと、Projectごとに利用料金を分けて確認できます。
今回の検証では、Mantle Projectの料金がコスト配分タグごとに別々に表示されました。
プログラムからの呼び出しでも、Mantle Projectごとに料金が分かれました。
Runtime APIとMantle endpointでは料金の分け方が異なる
Amazon Bedrockでは、呼び出すendpointによって料金を紐づけるリソースが異なります。
| 呼び出し先 | 料金を分けるリソース | リクエストでの指定方法 |
|---|---|---|
| bedrock-runtime | Application Inference Profile | モデルIDへプロファイルIDを指定 |
| bedrock-mantle | Mantle Project | OpenAI-Projectヘッダーを設定 |
Application Inference Profileは、InvokeModelやConverseのようなRuntime APIで使います。
Mantle endpointのResponses APIとChat Completions APIでは、Mantle Projectを使います。
プロジェクトとタグの作成
まずは、検証用のMantle Projectを2つ作成します。それぞれのProjectへProjectタグを設定します。
料金を分けて確認するにはProjectタグをコスト配分タグとして有効化しておく必要があります。
(今回は自社システムのコスト配分タグを利用するため、コスト配分タグの設定は割愛します)
Project Aを作成
Amazon Bedrockコンソールを開きます。
[❶ プロジェクト] を選択し、[❷ プロジェクトを作成] をクリックします。

[❶ プロジェクト名] へ mantle-demo-user-a を入力します。
[❷ キー] へ Project を入力して、[❸ 値] へ mantle-demo-user-a を入力します。
最後に [❹ プロジェクトを作成] を選択します。
これでプロジェクトの作成は完了です。

同じ手順でProject Bも作成します。

(この後の検証のために mantle-python-user-c と mantle-python-user-d も作成しています)
mantle-demo-user-a と mantle-demo-user-b がActiveと表示されることを確認します。
タグ列に、それぞれのProjectタグの値が表示されることを確認します。
これでProjectの作成は完了です。
Mantle endpointの呼び出し
次に作成したProjectを指定して、Mantle endpointを呼び出してみます。
Project Aの [❶ プロジェクトID] をコピーします。

検証時に使用したAWS CLIには、Mantle endpointのResponses APIを呼び出すコマンドがありませんでした。そのため、AWS公式の Inference using Responses API にあるcurlの呼び出し例に従います。
Mantle endpointの呼び出しにはcurlを使い、OpenAI-ProjectヘッダーへProject IDを設定します。
コマンドを実行する前に、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKENへ有効なAWS一時認証情報を設定しておきます。
次のコマンドを、Project AとProject BでそれぞれのProject IDへ置き換えて実行します。
PROJECT_ID="proj_xxxxxxxxxxxxxx"
curl \
--aws-sigv4 "aws:amz:ap-northeast-1:bedrock-mantle" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
-H "x-amz-security-token: ${AWS_SESSION_TOKEN}" \
--fail-with-body --silent --show-error \
-X POST "https://bedrock-mantle.ap-northeast-1.api.aws/v1/responses" \
-H "Content-Type: application/json" \
-H "OpenAI-Project: ${PROJECT_ID}" \
--data '{
"model": "openai.gpt-oss-20b",
"input": "Reply with exactly: Mantle billing attribution verification.",
"max_output_tokens": 64,
"store": false
}'
リクエストが成功すると、次のレスポンスが返ってきました。レスポンスIDと推論内容はマスクして省略しています。
{
"error": null,
"id": "resp_xxxx",
"model": "openai.gpt-oss-20b",
"output": [
{
"content": [
{
"text": "Mantle billing attribution verification.",
"type": "output_text"
}
],
"role": "assistant",
"status": "completed",
"type": "message"
}
],
"status": "completed"
}
料金が利用者ごとに分かれることを確認するため、Project Aでは20回、Project Bでは50回上記のコマンドを実行しました。
利用料金の確認
タグごとの利用料金一覧を見ると、mantle-demo-user-a と mantle-demo-user-b が別々の行に表示されました。

(本記事では弊社のコスト配分タグで表示していますが、Cost and Usage Report(CUR)からも確認できます)
この結果から、Mantle Projectを指定した推論はProjectタグ別に料金を分けられると確認できました。
アプリケーションからの呼び出し
次はアプリケーションからProjectを指定できるか確認します。
今回の検証では、PythonからMantle Projectを選択して呼び出してみます。
| 利用者 | Mantle Project | Projectタグの値 |
|---|---|---|
| C | Project C | mantle-python-user-c |
| D | Project D | mantle-python-user-d |
Pythonの検証プログラムは、利用者ごとに解決したProject IDをOpenAI-Projectヘッダーへ設定します。
利用者ごとのProject IDを取得します。
Amazon Bedrockコンソールの [プロジェクト] を開きます。利用者に対応するProjectの [❶ プロジェクトID] をコピーします。

利用者に対応するProject IDを指定して、Mantle endpointへリクエストを送信してみます。
import json
import boto3
import requests
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
PROJECT_ID = "<PROJECT_ID_C>"
REGION = "ap-northeast-1"
SERVICE_NAME = "bedrock-mantle"
payload = json.dumps(
{
"model": "openai.gpt-oss-20b",
"input": "Reply with exactly: Mantle billing attribution verification.",
"max_output_tokens": 64,
"store": False,
},
separators=(",", ":"),
)
session = boto3.Session(profile_name="default", region_name=REGION)
credentials = session.get_credentials()
if credentials is None:
raise RuntimeError("AWS認証情報を取得できませんでした。")
request = AWSRequest(
method="POST",
url=f"https://bedrock-mantle.{REGION}.api.aws/v1/responses",
data=payload,
headers={
"Content-Type": "application/json",
"OpenAI-Project": PROJECT_ID,
},
)
SigV4Auth(credentials.get_frozen_credentials(), SERVICE_NAME, REGION).add_auth(request)
prepared_request = request.prepare()
response = requests.post(
prepared_request.url,
headers=dict(prepared_request.headers.items()),
data=payload,
timeout=60,
)
try:
response.raise_for_status()
print(response.json())
finally:
response.close()
<PROJECT_ID> には、コンソールで確認した利用者に対応する proj_ から始まるIDを設定します。Project名やProjectタグの値を指定するわけではありません。
OpenAI-Projectヘッダーを省略したリクエストは、アカウントのdefault Projectへ関連付けられるようです。
利用者別に集計したいリクエストでは、Project IDを指定しましょう。
利用料金の確認
タグごとの利用料金一覧を見ると、mantle-python-user-c と mantle-python-user-d が別々の行に表示されました。

これでアプリケーションから指定したMantle Projectでも、料金を管理できることが確認できました。
利用者単位で使う場合の注意点
Mantle Projectは、アプリケーションやワークロードの論理的な境界を目的とした機能という説明があります。
Amazon Bedrock Projects
コスト分離についても、チーム・プロジェクト・環境単位に割り当てという記載があります(引用は日本語訳)。
コストを正確に追跡する:AI関連の支出を監視し、特定のチーム、プロジェクト、または環境に割り当てる。
少数の利用者をProjectへ対応付ける構成なら実現できます。
一方でProjectは1アカウントあたり最大1,000個です。大量の利用者を1人ずつProjectへ割り当てる構成には向きません。
最後に
Mantle endpointを利用する場合でも、Mantle Projectを利用することで、利用者ごとに料金を管理することができました。
ただし、ドキュメントで解説されているProjectの利用方法とは少し異なるため、その点には注意しましょう。
今後他の方法でMantle endpointの利用者ごとの料金管理ができる機能が増えることに期待したいですね。







