8月14日、AWSが「Track generative AI costs with Amazon Bedrock inference profiles」と題した記事を公開した。Amazon Bedrockの推論プロファイル(inference profile)を使って複数部門の生成AIコストを部門別に可視化・管理する方法について詳しく紹介されている。「同じモデルを複数部門が使っているのに請求書には1行しか現れない」という構造的な問題を、アプリ側の変更を最小限に抑えながら解決する手法だ。
課題:同一モデルを複数部門で共用するとコストが「ひとまとめ」になる
HR部門がポリシー確認に使い、経理部門が財務書類の分析に使い、IT部門がインフラのトラブルシューティングに使う。同じ基盤モデルを3部門が共用しているのに、AWS請求書には1行しか現れない。これでは部門ごとのチャージバック(コスト配賦)も予算管理もできない。
この問題を解決するのが Amazon Bedrock アプリケーション推論プロファイル だ。推論プロファイルは、基盤モデルにタグを付けたラッパーとして機能する。これを部門ごとに作成し、AWSコスト配分タグと組み合わせることで、AWS Cost Explorerに部門別のコストを独立した行として表示できる。なお、推論プロファイル経由での呼び出しでも、直接モデルを呼び出す場合とトークン単価は同一であり、コスト配賦のための追加料金は発生しない。
アーキテクチャの肝:IAMロールは1つ、コスト帰属はタグで分離
一般的な代替手法として、IAMプリンシパル(呼び出し元のIAM IDごと)にコストを帰属させる方法もある。ただしこれは、部門ごとに異なるIAM IDでBedrockを呼び出す構成が前提だ。1つのアプリケーションが全部門からのリクエストを処理する構成では、ユーザーセッション管理を部門単位で行わない限り分離できない。
推論プロファイルを使えば、単一IAMロールで運用しながら、部門ごとにタグ付きプロファイルへルーティングするだけでコスト分離が実現できる。
アプリ → ユーザーの部門を特定 → 該当部門の推論プロファイルARNにルーティング → Bedrock
ユーザー個人のIDはAWSには渡されない。コスト帰属はあくまでプロファイルのTeamタグから来る。
実装手順
必要な環境は、AWS アカウント、Bedrockのモデルアクセス許可、および Python 3.12 + boto3 1.35.7以降だ。コストデータがCost Explorerに反映されるまで24〜48時間かかる点は注意が必要。
1. 部門ごとに推論プロファイルを作成・タグ付け
Bedrockコンソールの「Inference profiles」→「Application」タブから作成する。HR・経理・ITの3部門それぞれに対して、同じ基盤モデルを指定しつつ Team=HR、Team=Accounting、Team=IT のタグを付与する。
大量のチームへ展開する場合は、AWS::Bedrock::ApplicationInferenceProfile CloudFormationリソースを使えばスケールしやすい。
2. コスト配分タグを有効化
AWS Billing and Cost Managementコンソールで Team タグをアクティブ化する。タグは大文字小文字を区別する(Team と team は別物)。マルチアカウント構成(AWS Organizations)の場合は管理(支払い)アカウントで有効化する。
3. アプリ側の変更:modelIdを推論プロファイルARNに差し替えるだけ
APIの呼び出し方は変わらない。modelIdパラメータに基盤モデルIDの代わりに推論プロファイルのARNを渡すだけだ。
import boto3
from botocore.exceptions import ClientError
client = boto3.client('bedrock-runtime', region_name='us-east-1')
DEPARTMENT_PROFILES = {
'HR': 'arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/abc123',
'Accounting': 'arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/def456',
'IT': 'arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/ghi789',
}
# 認証レイヤー(OIDC/SAMLクレーム、DBルックアップ、セッション等)から部門を取得
department = get_department_from_user_session()
if department not in DEPARTMENT_PROFILES:
raise ValueError(f"Unknown department: {department}")
try:
response = client.converse(
modelId=DEPARTMENT_PROFILES[department],
messages=[{'role': 'user', 'content': [{'text': 'Your prompt here'}]}],
inferenceConfig={'maxTokens': 300}
)
except ClientError as e:
print(f"Error invoking model: {e}")
raise
4. IAMポリシー:プロファイルと基盤モデルの両方に権限が必要
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "InvokeDepartmentInferenceProfiles",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/*",
"arn:aws:bedrock:us-east-1::foundation-model/<your-in-region-model-id>"
]
}
]
}
推論プロファイル経由で呼び出す場合、プロファイルARNと基盤モデルARNの両方に権限が必要な点が見落としやすいポイントだ。プロファイルARNにワイルドカード(*)を使えば、新しい部門を追加してもIAMポリシーの変更は不要になる。
Cost Explorerでの確認
Cost Explorerで「Group by: Tag → Team」を選択すると、HR・経理・ITそれぞれのBedrockコストが色分けされた棒グラフと金額表で確認できる。
コストが48時間後も表示されない場合は、コスト配分タグがアクティブになっているか、および呼び出しが推論プロファイルのARNを通じて行われているかを確認する。
さらなる活用
記事では以下の組み合わせも紹介されている。
- AWS Budgets による部門別の支出アラートと上限管理
- AWS Cost Anomaly Detection による異常支出の検知
- Amazon CloudWatch によるトークン使用量のモニタリング
新しい部門を追加する際は、タグ付きプロファイルをもう1つ作成してアプリのARNマッピングに追加するだけでよい。ワイルドカードポリシーを採用していればIAM変更も不要だ。
詳細はTrack generative AI costs with Amazon Bedrock inference profilesを参照していただきたい。