[アップデート] Amazon Bedrock のモデル有効化が API 形式で操作できるようになりました

[アップデート] Amazon Bedrock のモデル有効化が API 形式で操作できるようになりました

Clock Icon2025.06.27

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

いつもの日課で AWS CLI の変更履歴を追っていると、Amazon Bedrock のモデル有効化が API 形式で操作できるようになっていました。

https://github.com/aws/aws-cli/commit/de13a48c6bb67ff0c3e3e43205d9ef1239ad1f45#diff-e1302a7d598699a562772233655b4a588842b46f115a2ec999adf711cf4510edR12-R16

アップデート内容

Amazon Bedrock のモデル有効化/無効化は、 Anthropic Claude など、 Amazon Bedrock で提供されるモデルを利用するために必要な操作の1つです。ユーザーはモデルを利用する前に End User License Agreement (EULA) に合意する必要があります。(モデルによっては、モデルのユースケースを入力する必要があったりします。)

https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html

従来、マネジメントコンソールのみで操作可能でしたが、今回のアップデートで API が提供され、AWS SDK や AWS CLI 経由で操作できるようになりました。

今回増えた API は以下のとおりです。

  • PutUseCaseForModelAccess
    • モデルのユースケースを送信
  • GetUseCaseForModelAccess
    • モデルのユースケースを取得
  • CreateFoundationModelAgreement
    • モデルの有効化
  • DeleteFoundationModelAgreement
    • モデルの無効化
  • ListFoundationModelAgreementOffers
    • モデルのオファータイプをリスト化
  • GetFoundationModelAvailability
    • モデルの利用可否を取得

https://awsapichanges.com/archive/changes/863c86-bedrock.html

やってみた

実際にモデルの有効化/無効化を試してみます。ユースケースは送信済みのアカウントを利用するため、PutUseCaseForModelAccess と GetUseCaseForModelAccess の操作は省きます。

モデル利用可否の取得

GetFoundationModelAvailability API では、モデル ID を引数に対象のモデルがアカウント/リージョン内で利用可能かどうかを取得できます。

試しに anthropic.claude-sonnet-4-20250514-v1:0 を引数に実行してみました。

import json
import boto3

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

# 基盤モデルの利用可否を取得
get_foundation_model_availability_response = client.get_foundation_model_availability(
    modelId='anthropic.claude-sonnet-4-20250514-v1:0'
)
print(json.dumps(get_foundation_model_availability_response, indent=2))

agreementAvailability, authorizationStatus, entitlementAvailability, regionAvailability の通り、契約周り含めて利用可否が取得できていますね。

{
  "ResponseMetadata": {
    "RequestId": "8068fe92-b98e-48f9-b376-f6b12a1e94c7",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Thu, 26 Jun 2025 13:47:43 GMT",
      "content-type": "application/json",
      "content-length": "224",
      "connection": "keep-alive",
      "x-amzn-requestid": "8068fe92-b98e-48f9-b376-f6b12a1e94c7"
    },
    "RetryAttempts": 0
  },
  "modelId": "anthropic.claude-sonnet-4-20250514-v1",
  "agreementAvailability": {
    "status": "AVAILABLE"
  },
  "authorizationStatus": "AUTHORIZED",
  "entitlementAvailability": "AVAILABLE",
  "regionAvailability": "AVAILABLE"
}

要約すると以下になります。

  • モデル: anthropic.claude-sonnet-4-20250514-v1
  • 認証状態: AUTHORIZED (利用許可済み)
  • 利用規約: AVAILABLE (同意済み)
  • 利用権限: AVAILABLE (有効)
  • リージョン: AVAILABLE (利用可能)
  • HTTPステータス: 200 (成功)

オファーの取得

続いてオファーの取得です。

モデルの有効化(CreateFoundationModelAgreement)を行うには、リクエストボディに offerToken を含める必要があります。

client.create_foundation_model_agreement(
    offerToken='string',
    modelId='string'
)

offerToken は、モデルをどの価格で利用するのかが定められたオファーに紐づいているため、ListFoundationModelAgreementOffers API で offerToken を取得する必要があります。

import json
import boto3

client = boto3.client('bedrock', region_name='us-east-1')
# 基盤モデルの利用可能なオファーをリスト
list_foundation_model_agreement_offers_response = client.list_foundation_model_agreement_offers(
    modelId='anthropic.claude-sonnet-4-20250514-v1:0',
    offerType='ALL'
)

print(json.dumps(list_foundation_model_agreement_offers_response, indent=2))

実行結果から、offers の offerToken を取得できます。(一部割愛や改変をしています。)

この offerToken を利用して、モデルの有効化(CreateFoundationModelAgreement)を行っていきます。(利用する際は必要に応じて offers の legalTerm も読んでおきましょう。)

{
  "ResponseMetadata": {
    "RequestId": "d9635847-4e30-4b67-b7bd-07ad8588ae3b",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Thu, 26 Jun 2025 13:47:43 GMT",
      "content-type": "application/json",
      "content-length": "13503",
      "connection": "keep-alive",
      "x-amzn-requestid": "d9635847-4e30-4b67-b7bd-07ad8588ae3b"
    },
    "RetryAttempts": 0
  },
  "modelId": "anthropic.claude-sonnet-4-20250514-v1:0",
  "offers": [
    {
      "offerId": "offer-af7b7btarao36",
      "offerToken": "Offer Token が記載されている",
      "termDetails": {
        "usageBasedPricingTerm": {
          "rateCard": [
            {
              "dimension": "USE1_InputTokenCount",
              "price": "3",
              "description": "Million Input Tokens",
              "unit": "Units"
            },
            {
              "dimension": "USE1_OutputTokenCount",
              "price": "15",
              "description": "Million Response Tokens",
              "unit": "Units"
            }
          ]
        },
        "legalTerm": {
          "url": "Legal Term を取得可能な URL が記載されいてる"
        },
        "supportTerm": {
          "refundPolicyDescription": "No refunds"
        }
      }
    }
  ]
}

モデルの有効化

CreateFoundationModelAgreement でモデルの有効化を行います。ListFoundationModelAgreementOffers で取得した offertoken を利用します。

import json
import boto3

client = boto3.client('bedrock', region_name='us-east-1')
# 基盤モデルの利用可能なオファーをリスト
list_foundation_model_agreement_offers_response = client.list_foundation_model_agreement_offers(
    modelId='anthropic.claude-sonnet-4-20250514-v1:0',
    offerType='ALL'
)

offer_token = list_foundation_model_agreement_offers_response.get('offers', [])[0].get('offerToken', '')
model_id = list_foundation_model_agreement_offers_response.get('modelId', '')

create_foundation_model_agreement_response = client.create_foundation_model_agreement(
    offerToken=offer_token,
    modelId=model_id
)

print(json.dumps(create_foundation_model_agreement_response, indent=2, default=str))

実行結果

{
  "ResponseMetadata": {
    "RequestId": "422b729d-6a42-4ba8-9efb-9439d27748d6",
    "HTTPStatusCode": 202,
    "HTTPHeaders": {
      "date": "Thu, 26 Jun 2025 14:59:15 GMT",
      "content-type": "application/json",
      "content-length": "51",
      "connection": "keep-alive",
      "x-amzn-requestid": "422b729d-6a42-4ba8-9efb-9439d27748d6"
    },
    "RetryAttempts": 0
  },
  "modelId": "anthropic.claude-sonnet-4-20250514-v1"
}

モデルの無効化

必要に応じてモデルの無効化もできるように、DeleteFoundationModelAgreement が増えているものの、実行結果から、現時点では利用できなさそうでした。

import json
import boto3

client = boto3.client('bedrock', region_name='us-east-1')
delete_foundation_model_agreement_response = client.delete_foundation_model_agreement(
    modelId='anthropic.claude-sonnet-4-20250514-v1:0'
)

print(json.dumps(delete_foundation_model_agreement_response, indent=2, default=str))

実行結果

Traceback (most recent call last):
  File "delete_agreement.py", line 6, in <module>
    delete_foundation_model_agreement_response = client.delete_foundation_model_agreement(
                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/.venv/lib/python3.12/site-packages/botocore/client.py", line 595, in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/.venv/lib/python3.12/site-packages/botocore/context.py", line 123, in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/.venv/lib/python3.12/site-packages/botocore/client.py", line 1058, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.ConflictException: An error occurred (ConflictException) when calling the DeleteFoundationModelAgreement operation: Agreement can not be cancelled at this time.

まとめ

以上、「Amazon Bedrock のモデル有効化が API 形式で操作できるようになりました」でした。

アカウント発行する際にまとめて有効化したいケースなど、非常に便利なのではないかと思います。

このブログがどなたかの参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.