1つのモデル、1つの請求書 — それで誰がいくら使ったのか

社内に生成AIが広がると、必ずぶつかる壁があります。人事部はポリシーQ&Aに、経理部は財務文書の分析に、IT部門はインフラのトラブルシューティングに、同じAmazon Bedrockの基盤モデルを使う。問題は請求書です。AWSの請求にはBedrock利用料がたった1行でしか出てきません。これでは経理部門が部署別にチャージバックすることも、チーム別予算を組むことも、どこでコストが膨らんでいるか特定することもできません。

この問題を解決するのが Application Inference Profile です。平たく言えば、モデルを包んだタグ付け可能なラッパーです。プロファイルごとに Team=HR、Team=Accounting といったタグを付けておけば、AWS Cost Explorer上で部署別コストが個別の明細行として表示されます。トークン単価は同じなので、コスト追跡のための追加課金は発生しません。

本記事では、3部署分のプロファイル作成 → タグの有効化 → アプリケーションのルーティング変更 → Cost Explorerでの部署別内訳確認という流れを順に解説します。所要時間は約30分、コストデータが反映されるまでに24〜48時間かかります。

元ネタはAWS Architecture Blogの Track generative AI costs with Amazon Bedrock inference profiles です。根拠資料としてあわせてご参照ください。

AWS Bedrock inference profile architecture diagram separating department costs with Team tags Programming Illustration

Step 1. 部署別のInference Profileを作成する

AWSコンソールで Amazon Bedrock → Inference profiles → Application タブ → Create inference profile に進みます。各部署に1つずつプロファイルを作成しますが、すべて同じ基盤モデルを指すようにしてください。

項目値
Profile nameHR / Accounting / IT
Model同一の基盤モデル(例: Anthropic Claude)
Tag KeyTeam
Tag ValueHR / Accounting / IT

チームが数十個ある場合は手動作成を避け、AWS CloudFormationの AWS::Bedrock::ApplicationInferenceProfile リソースで一括プロビジョニングしてください。

Step 2. コスト配分タグを有効化する

プロファイルを作っただけでは不十分です。AWS Billing and Cost Management → Cost allocation tags で Team タグを探し、Activate を押す必要があります。マルチアカウント(AWS Organizations)環境では、管理(payer)アカウントで有効化しないとメンバーアカウントの利用量が統合されてCost Explorerに表示されません。

タグは大文字小文字を区別します。Team と team は完全に別のタグです。有効化後、データ反映には24〜48時間かかります。

Step 3. アプリケーションのルーティングを変更する(核心コード)

既存コードで modelId に基盤モデルIDを渡していた部分を、Inference Profile ARN に差し替えるだけです。API呼び出し自体は変わりません。

# 部署別 Inference Profile ARN のマッピング
# 各プロファイルは同じ基盤モデルを指すが、Teamタグが異なる
DEPARTMENT_PROFILES = {
    "hr":         "arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/hr-profile-id",
    "accounting": "arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/accounting-profile-id",
    "it":         "arn:aws:bedrock:us-east-1:111122223333:application-inference-profile/it-profile-id",
}

import boto3

bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")

def invoke_for_department(department: str, prompt: str):
    # 部署名から対応するプロファイルARNを取得(存在しなければ KeyError)
    profile_arn = DEPARTMENT_PROFILES[department]

    # modelId にプロファイルARNを渡すだけ。他のパラメータは同じ。
    response = bedrock.invoke_model(
        modelId=profile_arn,
        body={
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 512,
            "messages": [{"role": "user", "content": prompt}],
        },
    )
    return response["body"].read()

# 使用例: HR部署のリクエストはHRプロファイルにルーティング → Team=HRタグでコスト記録
invoke_for_department("hr", "有給休暇のポリシーを教えて")

Step 4. IAMポリシー — プロファイルとモデルの両方を許可する必要がある

Inference Profile経由で呼び出す場合、プロファイルとその背後の基盤モデルの両方に対する権限が必要です。ここを見落とすと AccessDenied になります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": [
        "arn:aws:bedrock:*:111122223333:application-inference-profile/*",
        "arn:aws:bedrock:*::foundation-model/*"
      ]
    }
  ]
}

111122223333 はご自身のAWSアカウントIDに置き換えてください。ワイルドカード(*)は部署追加時にIAM修正が不要という利点がありますが、セキュリティを強化したい場合はプロファイルARNを明示列挙することを推奨します。

Step 5. Cost Explorerで部署別コストを確認する

Billing and Cost Management → Cost Explorer に移動し、以下を設定します。

  1. 日付範囲を呼び出し実行以降に設定
  2. Granularity: Daily または Monthly
  3. Group by: Tag → Team

棒グラフでHR・Accounting・ITがそれぞれ別色で分離して表示され、下の表で正確な金額を確認できます。48時間経っても表示されない場合は、(1) タグが有効か、(2) 呼び出しがプロファイルARNで行われたかを確認してください。

Developer configuring Amazon Bedrock application inference profiles in AWS console for HR department Technical Structure Concept

この技術の限界と注意点

  • リアルタイムではありません。 Cost Explorerへの反映には24〜48時間かかります。リアルタイムの予算統制が必要な場合は、AWS Budgets や CloudWatch でトークン使用量を別途モニタリングする必要があります。
  • タグは遡及適用されません。 プロファイル作成前に発生した呼び出しは絶対に分離できません。導入前のコストはまとまったままになります。
  • プロファイル削除は即時影響します。 ARNを参照するアプリケーションがあれば即座に障害となります。再作成すると新しいARNが発行されるため、アプリケーション側の参照を必ず更新してください。
  • IAMプリンシパルベースの帰属とは異なります。 チームごとに異なるIAMロールでBedrockを呼び出す構成であれば、プロファイルなしでもIAMプリンシパル単位のコスト帰属が可能です。本アーキテクチャは、単一アプリケーションが1つのロールで複数部署を代理呼び出しするケースに特化した解です。

日本の開発現場における適用コンテキスト

日本企業のSI・エンタープライズ環境では、**部署別の原価配賦(チャージバック)**が予算稟議や内部監査と直結するケースが多く見られます。特に金融・公共系では内部統制の観点から「どの部署がAIコストをいくら使ったか」を証跡として示す必要があり、IAMベースの帰属はシングルゲートウェイ構成と衝突しがちです。Inference Profileはその衝突を回避できる実用的な選択肢です。ただし、**CloudFormationでプロファイルをコード管理(IaC)**しておかないと、部署が増えるたびにコンソール作業が発生するため、初期段階からIaCで管理することをお勧めします。

次のステップ学習の方向性

  • AWS Budgets で部署別の支出上限とアラートを設定
  • Cost Anomaly Detection で異常な支出パターンを自動検知
  • Amazon CloudWatch で部署別トークン使用量のカスタムメトリクスを収集
  • Knowledge Bases (RAG) 呼び出しにも同じプロファイルARNを渡し、直接モデル呼び出し以外のワークフローにも帰属範囲を拡張

特にRAGへの拡張は、近年の生成AI FinOpsで頻繁に議論されるテーマです。プロファイルARNをアプリケーション設定値として一元管理しておくと、その後の拡張が格段に楽になります。

AWS Cost Explorer dashboard showing per-department Bedrock costs grouped by Team cost allocation tag System Abstract Visual

まとめ — タグ1つで部署別の請求書を分ける

流れを整理すると以下のとおりです。

  1. 部署別に Application Inference Profile を作成(同じモデル、異なるタグ)
  2. Team コスト配分タグを有効化(マルチアカウントはpayerアカウントで)
  3. アプリケーションの modelId をプロファイルARNに差し替え
  4. IAMポリシーにプロファイル + 基盤モデル両方の権限を付与
  5. Cost Explorerで Group by → Tag → Team

新しい部署を追加したい場合は、タグ付きプロファイルをもう1つ作るだけです。ワイルドカードIAMポリシーを使っていればIAM修正も不要です。トークン単価は変わらないため、「コスト追跡のためにお金を余分に払う」という負担もありません。

日本国内でAI機能を複数チームに展開し、「請求書をどう分けるか」で悩んだ経験があるなら、このパターンが最も速く安価な答えです。導入前に、プロファイル作成時点以降の呼び出しのみ集計される点と、タグ有効化に24〜48時間かかる点をチーム内で共有しておくと、無駄な試行錯誤を減らせます。

あわせて読みたい記事

本コンテンツは、信頼性の高い情報源をもとにAIツールを活用して作成され、編集者によるレビューを経て公開されています。専門家によるアドバイスの代替となるものではありません。