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のお困り事はクラスメソッドへ

関連記事