AWS Bedrockのインファレンスプロファイルの検証

Posted on 2025/08/09

ToC

AWS Bedrockのインファレンスプロファイルとは

AWS Bedrockのインファレンスプロファイル(Inference Profile)は、使用状況メトリクスの追跡やタグを使用してコストのモニタリングを行うために利用します。また、複数の基盤LLMモデルに対してリクエストを効率的にルーティングするための機能です。

今回は、インファレンスプロファイルをCloudFormationにて作成し、このインファレンスプロファイルを利用して、Bedrockのチャットとテキストのプレイグラウンドに必要となる一連の設定を確認します。

Applicationインファレンスプロファイルの作成

ユーザーが作成可能なApplication InferenceProfileのリソースは、CloudFormationにてサポートされています。はじめのうちは、インファレンスプロファイルがどういったものかよく分からなかったのですが、実際に設定をしてみると基盤モデルを呼び出す際の抽象化の概念であるようです。
Application InferenceProfileは、モデルを直接参照(プロパティ名を見る感じだと実際はコピーかもしれません)することもできますし、AWSが作成したシステム定義のプロファイルを指定することもできます。

また、タグを指定することで、基盤モデル呼び出しの利用料(Cost Usage Reportの明細)に対してユーザー指定のコストタグが付与されるため、利用料のモニタリングが可能になるというメリットがあります。これは、Marketplaceで利用するモデルにも有効です。

/posts/2025/08/img/bedrock-infer_hu_1d2ec0167f5fe2b5.png
Resources:
  Claude4SonnetInferenceProfile:
    Type: AWS::Bedrock::ApplicationInferenceProfile
    Properties:
      InferenceProfileName: !Sub
        - 'claude-4-sonnet-profile-${ModelShortName}'
        - ShortName: !FindInMap [ NameMap, !Ref "AWS::Region", "ModelShortName" ]
      Description: Claude 4 Sonnet Inference Profile
      ModelSource:
        CopyFrom: !Sub
        - "arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/${ModelShortName}.anthropic.claude-sonnet-4-20250514-v1:0"
        - ModelShortName: !FindInMap [ NameMap, !Ref "AWS::Region", "ModelShortName" ]
      Tags:
        - Key: Owner
          Value: !Ref Owner
        - Key: Phase
          Value: !Ref Phase
Mappings:
  NameMap:
    ap-northeast-1: { ModelShortName: apac }
    us-west-2:      { ModelShortName: us }

一方、基盤モデルの直接呼び出しやAWSによるシステム定義のプロファイルを指定した場合には、コストタグが付与されません。
個人利用の場合にはあまり問題にはなりませんが、大規模な組織にて利用したユーザーやサービス毎に基盤モデルの利用状況を把握したい場合などには、Application InferenceProfileを活用することが良いプラクティスであると考えられます。

アプリケーションインファレンスプロファイルの一覧表示

ユーザー定義のApplication InferenceProfileを出力するためには、--type-equalsのパラメータにて、 APPLICATION を指定する必要があります。今回は、アプリケーションインファレンスプロファイルの作成時にAWSによるシステム定義のプロファイルを指定したためマルチリージョン(us-east-1、us-east-2 と us-west-2)のモデルへのルーティングがなされていることがわかります。

aws bedrock list-inference-profiles --type-equals APPLICATION --region us-west-2

{
    "inferenceProfileSummaries": [
        {
            "inferenceProfileName": "claude-4-sonnet-profile-us",
            "description": "Claude 4 Sonnet Inference Profile",
            "createdAt": "2025-08-08T04:04:13.759394+00:00",
            "updatedAt": "2025-08-08T04:04:13.759394+00:00",
            "inferenceProfileArn": "arn:aws:bedrock:us-west-2:123456789012:application-inference-profile/qwertyuiop12",
            "models": [
                {
                    "modelArn": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0"
                },
                {
                    "modelArn": "arn:aws:bedrock:us-east-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0"
                },
                {
                    "modelArn": "arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0"
                }
            ],
            "inferenceProfileId": "qwertyuiop12",
            "status": "ACTIVE",
            "type": "APPLICATION"
        }
    ]
}

プレイグラウンドでモデル実行だけができる権限

Bedrockの利用検証を行う際、リソースはできるだけCloudFormationで作成する方が運用や構成管理が容易になるため、基本的にはコンソールやCLIで直接リソースを作成しない方針が望ましいと考えています。
一方で、作成済みリソースの動作を軽く検証したい場合には、マネジメントコンソールのプレイグラウンドで試すケースもあるでしょう。しかし、Bedrock全体に広いアクセス権を付与してしまうと、意図しないリソースを誤って作成してしまうリスクがあるため、必要最低限の権限だけを付与することが重要です。

そこで、先ほど作成したApplication InferenceProfile経由でのみ基盤モデルを呼び出せるように権限ポリシーを設計しました。

Policies:
  - PolicyName: 'BedrockAction'
    PolicyDocument:
      Version: "2012-10-17"
      Statement:
        - Sid: 'Bedrock0010'
          Effect: Allow
          Action:
            - "bedrock:List*"
            - "bedrock:GetFoundationModelAvailability"
            - "bedrock:GetModelInvocationLoggingConfiguration"
            - "bedrock:GetUseCaseForModelAccess"
            - "sagemaker:ListHubContents"
          Resource:
            - '*'
        - Sid: 'Bedrock0020'
          Effect: Allow
          Action:
            - "bedrock:InvokeModel"
            - "bedrock:InvokeModelWithResponseStream"
          Resource:
            - '*'
          Condition:
            StringLike:
              bedrock:InferenceProfileArn:
                - !Sub "arn:${AWS::Partition}:bedrock:*:${AWS::AccountId}:application-inference-profile/*"
        - Sid: 'Bedrock0030'
          Effect: Allow
          Action:
            - "bedrock:InvokeModel"
            - "bedrock:InvokeModelWithResponseStream"
          Resource:
            - !Sub "arn:${AWS::Partition}:bedrock:*:${AWS::AccountId}:application-inference-profile/*"

このポリシーを適用することで、ユーザーはApplication InferenceProfileを利用してのみモデルを呼び出すことができるようになります。このポリシーのポイントは、直接モデルやシステム定義のプロファイルへの呼び出しをConditionで制限し、ユーザーにはApplication InferenceProfile経由でのみ呼び出しを許可するという設定になっています。
その他の権限については、一覧表示等に必要な読み取り系の権限となっています。(SageMakerのListHubContentsの権限は、どの箇所で使っているのかな?)

プレイグラウンドの画面で、Application InferenceProfileを指定して実行してみると無事に呼び出しができました。

/posts/2025/08/img/bedrock-infer-console_hu_282f3ecc6a066eed.png

AWS CLIによる呼び出し

プレイグラウンドと同じ内容をAWS CLIで実行してみます。
まずは、リクエストの内容をrequest.jsonに保存して、Application InferenceProfileを指定して呼び出しを実行しました。
プレイグラウンドとインプットのトークン数も同じで、少し回答の内容が異なりますが、どちらも正しい情報のように見えます。

$ cat request.json
{
  "anthropic_version": "bedrock-2023-05-31",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": "琵琶湖の所在地と大きさについて教えて下さい。"
    }
  ]
}

$ aws bedrock-runtime invoke-model \
  --model-id "arn:aws:bedrock:us-west-2:123456789012:application-inference-profile/qwertyuiop12" \
  --body "$(cat request.json | base64 | tr -d '\n')" \
  --content-type "application/json" --accept "application/json" \
  output.json --region us-west-2

$ cat output.json 
{
    "id":"msg_id",
    "type":"message",
    "role":"assistant",
    "model":"claude-sonnet-4-20250514",
    "content":[
        {"type":"text",
        "text":"琵琶湖について以下の情報をお伝えします。\n\n
        ## 所在地\n- **都道府県**: 滋賀県\n
        - **位置**: 滋賀県の中央部に位置し、県面積の約6分の1を占める\n\n
        ## 大きさ\n- **面積**: 約670.3km²\n- **周囲**: 約235km\n
        - **最大水深**: 約103.58m\n- **平均水深**: 約41.2m\n\n
        ## その他の特徴\n- 日本最大の淡水湖\n- 日本で最も古い湖の一つ(約400万年前に形成)\n
        - 関西地方の重要な水源として、約1,450万人の生活用水を供給\n
        - 湖岸には大津市、草津市、守山市、野洲市、近江八幡市、東近江市、彦根市、長浜市、高島市など
        の市町が位置\n\n
        琵琶湖は日本の湖沼の中でも特に重要な存在で、生態系の保全や水資源の確保において大きな
        役割を果たしています。"
    }
    ],
    "stop_reason":"end_turn",
    "stop_sequence":null,
    "usage":
        {
            "input_tokens":31,
            "cache_creation_input_tokens":0,
            "cache_read_input_tokens":0,
            "output_tokens":321
        }
}

参考リンク