IAMプリンシパルベースのコスト配分(Amazon Bedrock)を CUR 2.0 から確認してみた
以下のAWSブログに記載されている CUR(Cost and Usage Report) 2.0 における Bedrock コスト分析を 実際に試してみました。
ざっくりいうと、 誰が Amazon Bedrock を呼び出したかが、 CUR 2.0 にIAMプリンシパルとして記録される 機能です。 記録先は CUR の line_item_iam_principal 列になります。 (※ AWSブログには加えて 「IAMプリンシパルタグによるコスト配分」についての言及もあります)
本記事では、呼び出し元を4通り用意して Bedrock を呼び出し、 CUR 2.0 の line_item_iam_principal 列に実際どのような値が記録されるかを確認します。
CUR 2.0 のデータエクスポートと Athena テーブルの準備手順もあわせて紹介します。
前提: IAMプリンシパルベースのコスト配分とは
IAMプリンシパルベースのコスト配分は、 リクエストを実行した IAMプリンシパルをコストに紐づける仕組み です。 IAMプリンシパルとは IAMユーザーや IAMロール、IAM Identity Center ユーザー (実態はIAMロール)、 EC2インスタンスプロファイル (これも実態はIAMロール) あたりのことです。
現状は Bedrock の推論リクエストにのみ対応しています。 CUR 2.0 に line_item_iam_principal 列が追加され、そこに呼び出し元の ARN が記録されます。
組織全体のデータをまとめて確認する場合は、管理アカウントで有効化します。 具体的には、CUR 2.0 のデータエクスポート作成時に 「 Include caller identity (IAM principal) allocation data 」を有効にします。
やってみた(準備)
CUR 2.0 のデータエクスポートを作成する
管理アカウントの Billing and Cost Management コンソールの データエクスポートから CUR 2.0 を作成しました。

CUR 2.0 データエクスポートの設定画面。Include caller identity (IAM principal) allocation data を有効化している
主要な設定値は以下のとおりです。
| 項目 | 値 |
|---|---|
| エクスポートのタイプ | 詳細データエクスポート |
| データテーブル | CUR 2.0 |
| リソースIDを含める | ON |
| Include caller identity (IAM principal) allocation data | ON |
| 時間粒度 | 日次 |
| 列選択 | すべて |
| 圧縮タイプとファイル形式 | Parquet |
Athena テーブルを作成する
S3 に出力された Parquet を Athena から読むため、 Glue テーブルを CloudFormation で作成しました。 CFnテンプレートは Gist に置いています。
以下のように データベース cur_daily_parquet およびテーブル cur_daily_parquet を作成しました。

Athenaで作成したデータベースとテーブル
Bedrock 課金を発生させる
呼び出し元を4通り用意し、 それぞれから同じコマンド ( aws bedrock-runtime converse ) を実行しました。
| 呼び出し元 | 備考 |
|---|---|
| IAM ユーザー | 検証用ユーザーを作成し、アクセスキーで実行 |
| IAM ロール | sts assume-role で一時的な認証情報を取得して実行 |
| IAM Identity Center ユーザー | 特定の許可セットでログインしてそのまま実行 |
| EC2 インスタンスロール | インスタンスプロファイルを付けた EC2 上で実行 |
実行したコマンドは以下のようなものです。
aws bedrock-runtime converse \
--region ap-northeast-1 \
--model-id global.anthropic.claude-sonnet-5 \
--messages '[{"role":"user","content":[{"text":"CURコスト配分の検証中です。「ok」とだけ返答してください。"}]}]' \
--inference-config '{"maxTokens":16}'
やってみた(CURチェック)
CURをAthenaで分析した結果、 以下のように実行元ごとに line_item_iam_principal が記録されていました。
| 実行元 | 記録された line_item_iam_principal |
|---|---|
| IAM ユーザー | arn:aws:iam::123456789012:user/{ユーザー名} |
| IAM ロール (AssumeRole) | arn:aws:sts::123456789012:assumed-role/{ロール名}/{セッション名} |
| IAM Identity Center ユーザー | arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_{許可セット名}_{ID}/{ユーザー名} |
| EC2 インスタンスロール | arn:aws:sts::123456789012:assumed-role/{ロール名}/{インスタンスID} |

Athenaのクエリ結果。line_item_iam_principal列に実行元ごとのARNが記録されている
なお実行したクエリは以下のとおりです。
-- IAMプリンシパルと使用モデルごとのコストと使用量を出力する
SELECT line_item_iam_principal,
line_item_resource_id,
SUM(line_item_unblended_cost) AS cost,
SUM(line_item_usage_amount) AS usage_amount
FROM cur_daily_parquet.cur_daily_parquet
WHERE billing_period = '2026-07'
AND product_product_family = 'Amazon Bedrock'
AND line_item_line_item_type = 'Usage'
GROUP BY 1, 2
ORDER BY cost DESC
補足1: 1エントリのサンプル
ちなみに InvokeModelInference の1エントリのサンプルは以下のとおりです。
| 項目 | カラム名 | 値 |
|---|---|---|
| IAMプリンシパル | line_item_iam_principal |
arn:aws:iam::123456789012:user/{ユーザー名} |
| プロダクトファミリー | product_product_family |
Amazon Bedrock |
| リージョン | product_region_code |
ap-northeast-1 |
| 明細内容 | line_item_line_item_description |
AWS Marketplace software usage|ap-northeast-1|Output Tokens - Standard, Global |
| 利用開始 | line_item_usage_start_date |
2026-07-28 05:00:00 |
| 利用終了 | line_item_usage_end_date |
2026-07-28 06:00:00 |
| 使用量 | line_item_usage_amount |
1.1e-05 |
| 課金単位 | pricing_unit |
1M tokens |
| 使用タイプ | line_item_usage_type |
APN1-MP:APN1_output_tokens_global_standard-Units |
| 非集約コスト | line_item_unblended_cost |
0.00011 |
| 課金対象アカウント | line_item_usage_account_id |
123456789012 |
| 課金対象アカウント名 | line_item_usage_account_name |
{アカウント名} |
| 操作 | line_item_operation |
InvokeModelInference |
| リソースID | line_item_resource_id |
arn:aws:bedrock:ap-northeast-1:123456789012:inference-profile/global.anthropic.claude-sonnet-5 |
補足2: IAMプリンシパルタグによるコスト配分
ちなみにコスト配分タグのページから、 [IAMプリンシパルのタグキーを有効化] することで、 IAM ユーザーやロールに付与したタグ単位で Bedrock のコストを集計できます。

管理アカウントにてIAMプリンシパルを選択して有効化

有効化後
有効化後は CUR 2.0 の tags 列や Cost Explorer にて、フィルターやグループ化に使える項目が増えます。
▼ CUR 2.0 からのクエリ例
-- IAMプリンシパル・タグ・モデルごとのコストと使用量を出力する
SELECT
split_part(line_item_iam_principal, ':', 6) AS iam_principal,
tags,
split_part(line_item_resource_id, '/', 2) AS model_id,
SUM(line_item_usage_amount) AS usage_amount,
SUM(line_item_unblended_cost) AS cost
FROM cur_daily_parquet.cur_daily_parquet
WHERE billing_period = '2026-07'
AND product_product_family = 'Amazon Bedrock'
AND line_item_line_item_type = 'Usage'
GROUP BY 1, 2, 3
ORDER BY cost DESC

Athenaのクエリ結果。tags列にiamPrincipal/Owner等のタグが記録されている
▼ Cost Explorer でのタグ活用例

Cost Explorerのグループ化条件。ディメンションのTagにIAMプリンシパルのタグキーが表示される
おわりに
IAMプリンシパルベースのコスト配分を試してみました。
この機能が登場するまでは、 ユーザー(グループ)やプロジェクト単位で推論プロファイルを作成し、 それぞれのコストを個別に確認する運用を考えていました。 今は CUR 2.0 の line_item_iam_principal 列を見るだけで、 誰がどのモデルをどれくらい呼び出したかを把握できます。
現時点で対応しているのは Amazon Bedrock のみですが、 生成 AI の組織利用が増えるほど重要性が増していく機能だと思います。
以上、参考になれば幸いです。




