IAMプリンシパルベースのコスト配分(Amazon Bedrock)を CUR 2.0 から確認してみた

IAMプリンシパルベースのコスト配分(Amazon Bedrock)を CUR 2.0 から確認してみた

CUR 2.0のIAMプリンシパルベースのコスト配分機能を実際に試してみました。IAMユーザー、ロール、Identity Centerユーザー、EC2インスタンスロールなど、複数の呼び出し元からBedrockを実行し、CURにどのように記録されるかを確認します。
2026.08.04

以下のAWSブログに記載されている CUR(Cost and Usage Report) 2.0 における Bedrock コスト分析を 実際に試してみました。

https://aws.amazon.com/jp/blogs/news/track-amazon-bedrock-costs-by-caller-identity-with-iam-based-cost-allocation/

ざっくりいうと、 誰が 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 を作成しました。

sc-2026-08-03_16-12168
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 を作成しました。

sc-2026-08-03_16-21272
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}

sc-2026-08-03_16-17424
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 のコストを集計できます。

sc-2026-07-31_09-18936
管理アカウントにてIAMプリンシパルを選択して有効化

sc-2026-07-31_09-6230
有効化後

有効化後は 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

sc-2026-08-04_08-30621
Athenaのクエリ結果。tags列にiamPrincipal/Owner等のタグが記録されている

▼ Cost Explorer でのタグ活用例

sc-2026-08-04_08-19222
Cost Explorerのグループ化条件。ディメンションのTagにIAMプリンシパルのタグキーが表示される

おわりに

IAMプリンシパルベースのコスト配分を試してみました。

この機能が登場するまでは、 ユーザー(グループ)やプロジェクト単位で推論プロファイルを作成し、 それぞれのコストを個別に確認する運用を考えていました。 今は CUR 2.0 の line_item_iam_principal 列を見るだけで、 誰がどのモデルをどれくらい呼び出したかを把握できます。

現時点で対応しているのは Amazon Bedrock のみですが、 生成 AI の組織利用が増えるほど重要性が増していく機能だと思います。

以上、参考になれば幸いです。

参考

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事