LiteLLMでAmazon Bedrockのアプリケーション推論プロファイルを使う

LiteLLMでAmazon Bedrockのアプリケーション推論プロファイルを使う

Clock Icon2025.06.27

大阪オフィスの小倉です。

LiteLLMにAmazon Bedrockのアプリケーション推論プロファイルを設定してみました。

アプリケーション推論プロファイルにコスト配分タグを設定することで、LLMの利用料をAWSで追跡することができます。

https://dev.classmethod.jp/articles/amazon-bedrock-support-cost-allocation-tags-via-application-inference-profiles/

MacOS上のDockerで環境を作って検証しています。検証に使用した環境は以下になります。

ソフトウェア バージョン
LiteLLM 1.72.6
PostgreSQL 17
docker-composeファイル
services:
  litellm:
    image: ghcr.io/berriai/litellm-database:main-v1.72.6-stable
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      DATABASE_URL: postgresql://litellm-user:litellm-password@postgres:5432/litellm-d6
      LITELLM_MASTER_KEY: litellm-master-key # 必要に応じて変更
      PROXY_DEFAULT_TEAM_DISABLED: true
      STORE_MODEL_IN_DB: true
    ports:
      - "4000:4000"
    volumes:
      - ./config.yaml:/app/config.yaml
    command: ["--config", "/app/config.yaml", "--detailed_debug"]

  postgres:
    # https://www.docker.com/ja-jp/blog/how-to-use-the-postgres-docker-official-image/
    image: postgres:17
    restart: always
    environment: # 必要に応じて変更
      POSTGRES_DB: litellm-db
      POSTGRES_USER: litellm-user
      POSTGRES_PASSWORD: litellm-password
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U litellm-user -d litellm-db"]
      interval: 1s
      timeout: 5s
      retries: 10

LiteLLM + アプリケーション推論プロファイル

アプリケーション推論プロファイルの作成時に指定するモデル(システム定義の推論プロファイル、又はベースモデルARN)は1つです。
個人のLLM利用料をアプリケーション推論プロファイルのみで追跡しようとすると、
人数×利用するモデル数分のプロファイル作成が必要となります。

LiteLLMを利用する場合、Virtual Key単位、個人単位、Team(チームやプロジェクト等)単位の料金はLiteLLMの機能で追跡可能なので、
これらの単位でアプリケーション推論プロファイルを用意する必要はないと考えられます。

今回は、上記より大きな組織単位である事業部門が実際にコストを負担すると想定して、部門毎にアプリケーション推論プロファイルを作成してみます。

(LiteLLMのEnterprise版であればOrganizationという機能があるので、部門のコスト追跡もLiteLLMに任せられるかもしれません。)

AWSアカウント
├── 部門A (部門Aアプリケーション推論プロファイル(Claude4, Claude3.7))
│   └── Team X(LiteLLM Team X)
│       ├── Team X Member 1
│       ├── Team X Member 2
│       └── Team X Member 3
└── 部門B (部門Bアプリケーション推論プロファイル(Claude4, Claude3.7))
    └── Team Y(LiteLLM Team Y)
        ├── Team Y Member 1
        └── Team Y Member 2

やってみる

アプリケーション推論プロファイルの作成

最初にアプリケーション推論プロファイルを作成します。
コストを追跡したい単位(今回は部門Aと部門B)×利用するモデル数(今回はClaude Sonnet4と3.7)分なので、4つ作成することにします。

今回はアクセスキーでLiteLLMとBedrockを接続したかったので、IAM Userも一緒に作成しています。

CloudFormationテンプレート
# Bedrock Application Inference Profiles and IAM Users for Divisions
AWSTemplateFormatVersion: '2010-09-09'

Resources:
  # ========== DivisionA - Sonnet4 ==========
  Sonnet4InferenceProfileDivisionA:
    Type: AWS::Bedrock::ApplicationInferenceProfile
    Properties:
      InferenceProfileName: sonnet4-division-a
      ModelSource:
        CopyFrom: !Sub 
          - arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/us.anthropic.claude-sonnet-4-20250514-v1:0
          - {}
      Tags:
        - Key: Division
          Value: A
        - Key: Model
          Value: Sonnet4

  # ========== DivisionA - Sonnet37 ==========
  Sonnet37InferenceProfileDivisionA:
    Type: AWS::Bedrock::ApplicationInferenceProfile
    Properties:
      InferenceProfileName: sonnet37-division-a
      ModelSource:
        CopyFrom: !Sub 
          - arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/us.anthropic.claude-3-7-sonnet-20250219-v1:0
          - {}
      Tags:
        - Key: Division
          Value: A
        - Key: Model
          Value: Sonnet37

  # ========== DivisionB - Sonnet4 ==========
  Sonnet4InferenceProfileDivisionB:
    Type: AWS::Bedrock::ApplicationInferenceProfile
    Properties:
      InferenceProfileName: sonnet4-division-b
      ModelSource:
        CopyFrom: !Sub 
          - arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/us.anthropic.claude-sonnet-4-20250514-v1:0
          - {}
      Tags:
        - Key: Division
          Value: B
        - Key: Model
          Value: Sonnet4

  # ========== DivisionB - Sonnet37 ==========
  Sonnet37InferenceProfileDivisionB:
    Type: AWS::Bedrock::ApplicationInferenceProfile
    Properties:
      InferenceProfileName: sonnet37-division-b
      ModelSource:
        CopyFrom: !Sub 
          - arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/us.anthropic.claude-3-7-sonnet-20250219-v1:0
          - {}
      Tags:
        - Key: Division
          Value: B
        - Key: Model
          Value: Sonnet37

  # ========== User & Creds ==========
  LiteLLMUser:
    Type: AWS::IAM::User
    Properties:
      UserName: cm-ogura-litellm-bedrock

  LiteLLMUserPolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action:
              - bedrock:InvokeModel
              - bedrock:InvokeModelWithResponseStream
            Effect: Allow
            Resource:
              - !GetAtt Sonnet4InferenceProfileDivisionA.InferenceProfileArn
              - !GetAtt Sonnet37InferenceProfileDivisionA.InferenceProfileArn
              - !GetAtt Sonnet4InferenceProfileDivisionB.InferenceProfileArn
              - !GetAtt Sonnet37InferenceProfileDivisionB.InferenceProfileArn
          - Action:
              - bedrock:InvokeModel
              - bedrock:InvokeModelWithResponseStream
            Condition:
              StringLike:
                bedrock:InferenceProfileArn: 
                  - !GetAtt Sonnet4InferenceProfileDivisionA.InferenceProfileArn
                  - !GetAtt Sonnet37InferenceProfileDivisionA.InferenceProfileArn
                  - !GetAtt Sonnet4InferenceProfileDivisionB.InferenceProfileArn
                  - !GetAtt Sonnet37InferenceProfileDivisionB.InferenceProfileArn
            Effect: Allow
            Resource:
              - arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0
              - arn:aws:bedrock:us-east-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0
              - arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0
              - arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0
              - arn:aws:bedrock:us-east-2::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0
              - arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0
      PolicyName: LiteLLMUserPolicy
      Users:
        - !Ref LiteLLMUser

  LiteLLMUserKey:
    Type: AWS::IAM::AccessKey
    Properties:
      UserName: !Ref LiteLLMUser

  LiteLLMUserCreds:
    Type: AWS::SecretsManager::Secret
    Properties:
      Description: Bedrock API creds for litellm user
      SecretString: !Sub 
        - '{"AccessKeyId":"${AccessKeyId}","SecretAccessKey":"${SecretAccessKey}"}'
        - AccessKeyId: !Ref LiteLLMUserKey
          SecretAccessKey: !GetAtt LiteLLMUserKey.SecretAccessKey
    UpdateReplacePolicy: Delete
    DeletionPolicy: Delete

プロファイルに設定するタグには、部門名とモデル名にしました。

CDKで作成する場合は以下が参考になります。

https://dev.classmethod.jp/articles/shuntaka-cdk-application-inference-profile-creation-cline-utilization/

LiteLLMへ推論プロファイルを登録

https://docs.litellm.ai/docs/providers/bedrock#bedrock-application-inference-profile

config.yamlにモデルを記述する場合、model_idを追加し、アプリケーション推論プロファイルをセットします。

us-east-1のClaude Sonnet4の例

model_list:
  - litellm_params:
      aws_region_name: us-east-1
      aws_access_key_id: <access key>
      aws_secret_access_key: <secret access key>
      model: bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0
      model_id: arn:aws:bedrock:us-east-1:<aws account>:application-inference-profile/xxxxxxxxxx # アプリケーション推論プロファイル
    model_name: Claude Sonnet 4 Div A Team X

LiteLLMのUIから同じ内容を登録する場合、「Add Model」から登録します。
アプリケーション推論プロファイルを使用する場合は、Provider、LiteLLM Model Name(s)とクレデンシャル情報に加えて、
画面下のAdvanced Settings -> LiteLLM Params にJSON形式でmodel_idを追加でセットします。

vscode-drop-1751001581094-oauz3pgkpg.png
モデルの追加

{"model_id": "<アプリケーション推論プロファイルのID>"}

LiteLLM Paramsの内容は、現状のUIだとモデル編集画面で変更できないようですので、
入力したら、「Add Model」する前に「Test Connect」ボタンで疎通確認をしておきましょう。
以下の表示が返ってくれば疎通できていると思います。

vscode-drop-1751001616030-806g77rhlyh.png
Test Connect

Teamへモデルを登録

Teamを作って運用する場合、モデルとチームを紐づけて、利用可能モデルをコントロールすることがあると思います。

この場合は各Teamに対して利用可能モデルを設定します。

vscode-drop-1751001635828-3pqk8b5fwyi.png
Teamの作成

┌─────────┐    ┌─────────────────────────────────────────────────────────┐
│ Team X  │────│ Division A Claude 4 Application Inference Profile       │
│         │    └─────────────────────────────────────────────────────────┘
│         │    ┌─────────────────────────────────────────────────────────┐
│         │────│ Division A Claude 3.7 Application Inference Profile     │
└─────────┘    └─────────────────────────────────────────────────────────┘

┌─────────┐    ┌─────────────────────────────────────────────────────────┐
│ Team Y  │────│ Division B Claude 4 Application Inference Profile       │
│         │    └─────────────────────────────────────────────────────────┘
│         │    ┌─────────────────────────────────────────────────────────┐
│         │────│ Division B Claude 3.7 Application Inference Profile     │
└─────────┘    └─────────────────────────────────────────────────────────┘

これでTeam MemberがVirtual Keyを発行する時に、追加したプロファイルのモデルが選択可能になります。

新しいモデルをLiteLLMに追加したい場合、LiteLLMにモデル(アプリケーション推論プロファイル)を追加した後、
このように各Teamにもモデルを紐づけていく必要があります。
Teamへの紐づけをモデルではなくModel Access Group経由で行っておくと、
今後モデルを追加した時に、モデルをTeamへ紐づける手順を省略できるので少し楽にできます。

モデル追加時に、Model Access Groupの名前を指定しておきます。

vscode-drop-1751001676047-i80xqoz1aqh.png
モデルの追加

config.yamlの場合

 - litellm_params:
     (省略)
   model_name: Claude Sonnet 4 Div A Team Y
   model_info:
    access_groups: ["team-y-group"]

Teamに利用可能モデルを設定する際、モデルの代わりにModel Access Groupの名前を指定して紐づけます。

vscode-drop-1751001705055-qsk453fjb3.png
Teamの作成

┌─────────┐    ┌──────────────────┐    ┌─────────────────────────────────────────────────────────┐
│ Team X  │────│ Model Access     │────│ Division A Claude 4 Application Inference Profile       │
│         │    │ Group X          │    └─────────────────────────────────────────────────────────┘
│         │    │                  │    ┌─────────────────────────────────────────────────────────┐
│         │    │                  │────│ Division A Claude 3.7 Application Inference Profile     │
└─────────┘    └──────────────────┘    └─────────────────────────────────────────────────────────┘

┌─────────┐    ┌──────────────────┐    ┌─────────────────────────────────────────────────────────┐
│ Team Y  │────│ Model Access     │────│ Division B Claude 4 Application Inference Profile       │
│         │    │ Group Y          │    └─────────────────────────────────────────────────────────┘
│         │    │                  │    ┌─────────────────────────────────────────────────────────┐
│         │    │                  │────│ Division B Claude 3.7 Application Inference Profile     │
└─────────┘    └──────────────────┘    └─────────────────────────────────────────────────────────┘

今後は、モデルを追加する際に適切なModel Access Groupを指定しておくことで、Teamへの紐づけまで完了する、という形になります。

まとめ

LiteLLMでアプリケーション推論プロファイルを利用する方法を確認しました。
LiteLLMで管理するより大きなグループで料金を確認したい場合や、厳密にBedrockの利用料金を確認したい場合に活用できると思います。

LiteLLMに新たなモデルを追加する場合、モデルのアプリケーション推論プロファイルを作らなければならない点は手間がかかります。
LiteLLMを併用する場合は、アプリケーション推論プロファイルの作成は組織等の大きな単位で作成することで管理の手間を減らし、
個人単位やチーム単位のコスト管理はLiteLLMにまかせてしまいましょう。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.