bedrock について
Amazon Bedrock で生成 AI アプリケーションを構築する開発者向けのガイドです。基盤モデルの推論、埋め込み、画像生成に加え、モデルアクセス、ナレッジベース、推論タイプ、CLI、トラブルシューティングを扱います。
主な機能
- 01複数プロバイダーの基盤モデル呼び出し
- 02テキスト生成、埋め込み、画像生成
- 03ストリーミング応答と複数ターン会話
- 04ナレッジベース検索と RAG
- 05モデルアクセスとライフサイクルの説明
- 06CLI 操作とトラブルシューティング
活用シーン
- 01アプリでテキストや画像を生成
- 02テキストから埋め込みを作成
- 03複数ターンのモデル会話を構築
- 04ナレッジを検索して回答を生成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ itsmostafa/ aws-agent-skills --skill bedrockインストール後、Claude Code で/bedrockを入力して読み込まれたか確認します。
同梱ファイルmodel-invocation.md
詳細
AWS Bedrock
Amazon Bedrock は、統一された API を通じて AI 企業の基盤モデル(FM)を利用できるサービスです。テキスト生成、埋め込み、画像生成機能を使って生成 AI アプリケーションを構築できます。
目次
基本概念
基盤モデル
Bedrock で利用できる事前学習済みモデル:
- Claude(Anthropic):テキスト生成、分析、コーディング
- Nova / Titan(Amazon):テキスト、マルチモーダル、埋め込み
- GPT / gpt-oss(OpenAI):テキスト生成、推論
- Llama(Meta):オープンウェイトのテキスト生成
- Mistral:効率的なテキスト生成
- Stable Image(Stability AI):画像生成と編集
モデルへのアクセス
商用リージョンでは、すべてのサーバーレスモデルへのアクセスがデフォルトで有効になっています(コンソールでのオプトインは不要です)。GovCloud(US)では、モデルは引き続き Model access ページで手動で有効にします(サードパーティーモデルも、リンクされた商用アカウントで有効にします):
- サードパーティーモデルを初めて呼び出すと、AWS Marketplace を通じて自動的に登録されます(最大 15 分)。呼び出し元には
aws-marketplace:Subscribe、Unsubscribe、ViewSubscriptionsが必要です bedrock-runtime上の Anthropic モデルには、アカウント/組織ごとに一度だけユースケースフォームが必要です(put-use-case-for-model-access)- 呼び出しは EULA への同意を意味します。モデルをブロックするには、そのモデルに対する
bedrock:InvokeModelとbedrock:InvokeModelWithResponseStreamの両方を拒否します(SCP/IAM)。ConverseStreamなどのストリーミング API は後者を使用します。aws-marketplace:Subscribeの拒否だけでは、初回利用をブロックできません
エンドポイント
| エンドポイント | API | 用途 |
|---|---|---|
bedrock-runtime.{region}.amazonaws.com(推奨) | InvokeModel、Converse、Anthropic Messages(/anthropic)、OpenAI Responses/Chat Completions(/openai/v1) | Guardrails、クロスリージョン推論、プロンプトルーティング、アプリケーション推論プロファイル |
bedrock-mantle.{region}.api.aws | OpenAI Responses/Chat Completions(/openai/v1)、Anthropic Messages | サーバーサイドツール(Web Search)、background=true による非同期処理、Projects/Workspaces、CRIS 専用モデルへの単一リージョンアクセス |
- どちらもトークン単価は同じです。認証には SigV4 または Bedrock API キー(
AWS_BEARER_TOKEN_BEDROCK)を使用します - IAM:
bedrock:InvokeModel(runtime)とbedrock-mantle:CreateInference(mantle) bedrock-runtime上の Responses API は同期処理のみで、サーバーサイドツールはありません
推論プロファイルとモデルのライフサイクル
- 新しいモデル(例:Claude Sonnet 5)には、
bedrock-runtime上でリージョン内のオンデマンド ID がありません。modelIdとして、地理的推論プロファイル ID(us.、eu.、au.)またはglobal.を使用します - ライフサイクルは
Active->Legacy->EOLです(get-foundation-modelのmodelLifecycleを参照)。Legacy:新たな Provisioned Throughput、ファインチューニング、クォータの引き上げはできません。EOL:リクエストは失敗します - モデルカードには「EOL no sooner than」の日付が記載されています。モデル ID を固定する前に確認してください
ナレッジベースとエージェント
- マネージドナレッジベース(
type: MANAGED):Bedrock がストレージ、インデックス作成、検索を実行します。AgenticRetrieveStream(クエリ分解、反復検索、memoryConfigurationを使った AgentCore Memory の任意利用)をサポートするのはこのタイプのみです - ネイティブマルチモーダルのマネージド KB は、TwelveLabs Marengo Embed 3.0(
twelvelabs.marengo-embed-3-0-v1:0)で動画/音声/画像を直接埋め込みます。Retrieveのみを使ってテキストでクエリします(RetrieveAndGenerateは利用できません) - Bedrock Agents Classic はメンテナンスモードです。2026 年 7 月 30 日以降、新規アカウントでは利用できません(過去 12 か月の利用実績がない場合、
CreateAgent/InvokeInlineAgentは 403 を返します)。モデルカタログは凍結されています。新しいエージェントは Amazon Bedrock AgentCore 上に構築してください
推論タイプ
| タイプ | ユースケース | 料金 |
|---|---|---|
| オンデマンド | 変動するワークロード | トークン単位 |
| Provisioned Throughput | 安定した大量処理 | 時間単位のコミットメント |
| バッチ推論 | 非同期の大規模処理 | トークン単価の割引 |
一般的なパターン
Invoke Model(テキスト生成)
AWS CLI:
# Invoke Claude
aws bedrock-runtime invoke-model \
--model-id us.anthropic.claude-sonnet-5 \
--content-type application/json \
--accept application/json \
--cli-binary-format raw-in-base64-out \
--body '{
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 4096,
"messages": [
{"role": "user", "content": "Explain AWS Lambda in 3 sentences."}
]
}' \
response.json
# Claude Sonnet 5/Opus 5 think by default: content may start with a thinking block
cat response.json | jq -r '.content[] | select(.type=="text") | .text'
boto3:
import boto3
import json
bedrock = boto3.client('bedrock-runtime')
def invoke_claude(prompt, max_tokens=4096):
response = bedrock.invoke_model(
modelId='us.anthropic.claude-sonnet-5',
contentType='application/json',
accept='application/json',
body=json.dumps({
'anthropic_version': 'bedrock-2023-05-31',
'max_tokens': max_tokens,
'messages': [
{'role': 'user', 'content': prompt}
]
})
)
result = json.loads(response['body'].read())
# Skip thinking blocks (adaptive thinking is on by default for Sonnet 5).
# max_tokens caps thinking + text, so a truncated response may have no text block.
if result['stop_reason'] == 'max_tokens':
print('Truncated at max_tokens: raise it or lower output_config.effort')
return next((b['text'] for b in result['content'] if b['type'] == 'text'), '')
# Usage
response = invoke_claude('What is Amazon S3?')
print(response)
ストリーミングレスポンス
import boto3
import json
bedrock = boto3.client('bedrock-runtime')
def stream_claude(prompt):
response = bedrock.invoke_model_with_response_stream(
modelId='us.anthropic.claude-sonnet-5',
contentType='application/json',
accept='application/json',
body=json.dumps({
'anthropic_version': 'bedrock-2023-05-31',
'max_tokens': 4096,
'messages': [
{'role': 'user', 'content': prompt}
]
})
)
for event in response['body']:
chunk = json.loads(event['chunk']['bytes'])
if chunk['type'] == 'content_block_delta':
yield chunk['delta'].get('text', '')
# Usage
for text in stream_claude('Write a haiku about cloud computing.'):
print(text, end='', flush=True)
埋め込みを生成する
import boto3
import json
bedrock = boto3.client('bedrock-runtime')
def get_embedding(text):
response = bedrock.invoke_model(
modelId='amazon.titan-embed-text-v2:0',
contentType='application/json',
accept='application/json',
body=json.dumps({
'inputText': text,
'dimensions': 1024,
'normalize': True
})
)
result = json.loads(response['body'].read())
return result['embedding']
# Usage
embedding = get_embedding('AWS Lambda is a serverless compute service.')
print(f'Embedding dimension: {len(embedding)}')
履歴を含む会話
import boto3
import json
bedrock = boto3.client('bedrock-runtime')
class Conversation:
def __init__(self, system_prompt=None):
self.messages = []
self.system = system_prompt
def chat(self, user_message):
self.messages.append({
'role': 'user',
'content': user_message
})
body = {
'anthropic_version': 'bedrock-2023-05-31',
'max_tokens': 4096,
'messages': self.messages
}
if self.system:
body['system'] = self.system
response = bedrock.invoke_model(
modelId='us.anthropic.claude-sonnet-5',
contentType='application/json',
accept='application/json',
body=json.dumps(body)
)
result = json.loads(response['body'].read())
if result['stop_reason'] == 'max_tokens':
# max_tokens caps thinking + text; don't store a truncated/empty turn
self.messages.pop()
raise RuntimeError('Truncated at max_tokens: raise it or lower output_config.effort')
assistant_message = next(
(b['text'] for b in result['content'] if b['type'] == 'text'), ''
)
self.messages.append({
'role': 'assistant',
'content': assistant_message
})
return assistant_message
# Usage
conv = Conversation(system_prompt='You are an AWS solutions architect.')
print(conv.chat('What database should I use for a chat application?'))
print(conv.chat('What about for time-series data?'))
利用可能なモデルを一覧表示する
# List all foundation models
aws bedrock list-foundation-models \
--query 'modelSummaries[*].[modelId,modelName,providerName]' \
--output table
# Filter by provider
aws bedrock list-foundation-models \
--by-provider anthropic \
--query 'modelSummaries[*].modelId'
# Get model details (includes modelLifecycle.status)
aws bedrock get-foundation-model \
--model-identifier anthropic.claude-sonnet-5
モデルへのアクセスを確認する
# agreementAvailability.status AVAILABLE / NOT_AVAILABLE, authorizationStatus
aws bedrock get-foundation-model-availability \
--model-id anthropic.claude-sonnet-5
# Anthropic one-time use case form (base64-encoded JSON:
# companyName, companyWebsite, intendedUsers, industryOption, otherIndustryOption, useCases)
aws bedrock put-use-case-for-model-access --form-data <base64-json>
# Programmatic agreement for third-party models
aws bedrock list-foundation-model-agreement-offers --model-id <model-id>
aws bedrock create-foundation-model-agreement --model-id <model-id> --offer-token <token>
トークン数を数える
# Free; returns inputTokens. Not supported for every model (e.g. CRIS-only Claude models)
aws bedrock-runtime count-tokens \
--model-id anthropic.claude-3-5-haiku-20241022-v1:0 \
--input '{"converse": {"messages": [{"role": "user", "content": [{"text": "Hello"}]}]}}'
CLI リファレンス
Bedrock(コントロールプレーン)
| コマンド | 説明 |
|---|---|
aws bedrock list-foundation-models | 利用可能なモデルを一覧表示する |
aws bedrock get-foundation-model | モデルの詳細を取得する |
aws bedrock list-custom-models | ファインチューニング済みモデルを一覧表示する |
aws bedrock create-model-customization-job | ファインチューニングを開始する |
aws bedrock list-provisioned-model-throughputs | プロビジョニング済み容量を一覧表示する |
aws bedrock get-foundation-model-availability | モデルへのアクセス/同意状況を確認する |
aws bedrock put-use-case-for-model-access | Anthropic の初回利用ケースフォームを送信する |
aws bedrock list-inference-profiles | システム/アプリケーションの推論プロファイルを一覧表示する |
aws bedrock create-model-invocation-job | バッチジョブを開始する(--model-invocation-type InvokeModel|Converse) |
Bedrock Runtime(データプレーン)
| コマンド | 説明 |
|---|---|
aws bedrock-runtime invoke-model | モデルを同期的に呼び出す |
aws bedrock-runtime converse | 複数ターンの会話 API |
aws bedrock-runtime count-tokens | 入力トークン数を数える(invokeModel または converse を指定した --input) |
aws bedrock-runtime apply-guardrail | ガードレールに照らしてコンテンツを評価する |
InvokeModelWithResponseStream と ConverseStream は SDK 専用です(AWS CLI v2 では利用できません)。
Bedrock Agent Runtime
| コマンド | 説明 |
|---|---|
aws bedrock-agent-runtime retrieve | ナレッジベースを検索する |
aws bedrock-agent-runtime retrieve-and-generate | RAG クエリ |
InvokeAgent、RetrieveAndGenerateStream、AgenticRetrieveStream は SDK 専用です(イベントストリーム)。
ベストプラクティス
コストの最適化
- 適切なモデルを使用する:単純なタスクには小型のモデルを使用します
- max_tokens を設定する:可能な場合は出力の長さを制限します
- レスポンスをキャッシュする:同一のクエリを繰り返す場合に使用します
- 可能な場合はバッチ処理する:一括処理にはバッチ推論を使用します
- 使用状況を監視する:コストに関する CloudWatch アラームを設定します
- グローバル推論プロファイル:データレジデンシー要件が許す場合、地理的プロファイルより約 10% 安価です
- 思考トークンは出力として課金される:Claude Sonnet 5/Opus 5 はデフォルトで思考します。不要な場合は
"thinking": {"type": "disabled"}を渡すか、output_config.effortを下げてください。また、max_tokens(思考+テキストの上限)を見直してください - Converse のバッチ形式:
--model-invocation-type Converseを使用すると、モデル間で単一のリクエスト形式を維持できます - コストの帰属:IAM プリンシパルにコスト配分タグを付けます(両方のエンドポイントで機能します)
パフォーマンス
- ストリーミングを使用する:長い出力でもユーザーエクスペリエンスが向上します
- コネクションプーリング:boto3 クライアントを再利用します
- リージョンへのデプロイ:レイテンシを減らすため、最も近いリージョンを使用します
- プロビジョニング済みスループット:大量のワークロードを安定して処理する場合に使用します
- エンドポイントの選択:デフォルトでは
bedrock-runtimeを使用し、mantle 専用の機能にはbedrock-mantleを使用します
セキュリティ
- 最小権限の IAM:必要なモデルへのアクセスのみを許可します
- VPC エンドポイント:トラフィックをプライベートに保ちます
- ガードレール:コンテンツフィルタリングを実装します
- CloudTrail による監査:モデルの呼び出しを追跡します
- Web Search(mantle):Fetch を AWS の境界内にとどめるには、
external_web_access: falseを設定します。AmazonBedrockFullAccessにはbedrock-websearch:ExternalWebAccessが含まれていないため、デフォルトのtrueでは Fetch が暗黙的に失敗します - アクティブなモデルを固定する:
modelLifecycleを確認し、EOL 前にLegacyモデルから移行します
IAM 権限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:us-east-1:123456789012:inference-profile/us.anthropic.claude-sonnet-5",
"arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0"
]
},
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:*::foundation-model/anthropic.claude-sonnet-5",
"Condition": {
"StringEquals": {
"bedrock:InferenceProfileArn": "arn:aws:bedrock:us-east-1:123456789012:inference-profile/us.anthropic.claude-sonnet-5"
}
}
}
]
}
推論プロファイルを使用するには、プロファイル ARN と、各宛先リージョンの基盤モデルへのアクセスが必要です(aws bedrock get-inference-profile --inference-profile-identifier <id> の models フィールドで一覧を確認できます)。リージョンを拒否する SCP では、宛先リージョンを許可するか、bedrock:InferenceProfileArn による例外を設定する必要があります。
トラブルシューティング
AccessDeniedException
原因:
- サードパーティ製モデルを初めて使用する際に
aws-marketplace:Subscribeが不足している(自動サブスクリプションに失敗します。修正後、反映まで約2分かかる場合があります) - Anthropic のユースケースフォームが送信されていない
- IAM ポリシーに
bedrock:InvokeModelがない、または推論プロファイルの宛先リージョンの基盤モデル ARN が不足している - モデル ID またはリージョンが間違っている
- Bedrock Agents Classic:「Bedrock Agents is in Maintenance Mode」— 以前に使用したことのないアカウントで
CreateAgent/InvokeInlineAgentを実行すると 403 が発生します(AgentCore を使用してください)
デバッグ:
# Check model access status
aws bedrock get-foundation-model-availability \
--model-id anthropic.claude-sonnet-5
# Test IAM permissions
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:role/my-role \
--action-names bedrock:InvokeModel \
--resource-arns "arn:aws:bedrock:us-east-1:123456789012:inference-profile/us.anthropic.claude-sonnet-5"
# The profile ARN can pass while cross-Region routing is still denied: also simulate each
# destination-Region model ARN (models field of get-inference-profile) with the profile context
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:role/my-role \
--action-names bedrock:InvokeModel \
--resource-arns "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-5" \
"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-sonnet-5" \
--context-entries '[{"ContextKeyName":"bedrock:InferenceProfileArn","ContextKeyType":"string","ContextKeyValues":["arn:aws:bedrock:us-east-1:123456789012:inference-profile/us.anthropic.claude-sonnet-5"]}]'
ModelNotReadyException
**原因:**モデルのプロビジョニング中、または一時的に利用できません。
**解決策:**指数バックオフを使用した再試行を実装します。
import time
from botocore.exceptions import ClientError
def invoke_with_retry(bedrock, body, max_retries=3):
for attempt in range(max_retries):
try:
return bedrock.invoke_model(
modelId='us.anthropic.claude-sonnet-5',
body=json.dumps(body)
)
except ClientError as e:
if e.response['Error']['Code'] == 'ModelNotReadyException':
time.sleep(2 ** attempt)
else:
raise
raise Exception('Max retries exceeded')
ThrottlingException
原因:
bedrock-runtimeでモデルごとの1分あたりのトークン数(入力と出力の合計)、または1日あたりのトークン数のクォータを超過している- RPM クォータを超過している(モデルによって異なり、クォータがないモデルもあります)
- 同時リクエストが多すぎる
解決策:
- クォータの引き上げを申請します(TPM/TPD の両方を対象とするため、「Cross-Region InvokeModel tokens per minute for 」を申請してください。レガシーモデルは対象外です)
max_tokensを下げます。クォータの消費量に影響します- スループットを高めるため、クロスリージョン推論プロファイルを使用します
- 指数バックオフを実装します
- プロビジョンドスループットを検討します
ValidationException
よくある問題:
- モデル ID が無効、またはモデルが EOL になっている
- エラーに、モデル ID ではオンデマンドスループットがサポートされていないと記載されている:推論プロファイル ID(
us./global.プレフィックス)を使用してください - リクエスト本文の形式が不正
max_tokensがモデルの上限を超えているadaptive/disabledのみを受け付けるモデル(例:Claude Sonnet 5)で、budget_tokensとthinking.type: "enabled"を指定しているoutput_config.format(構造化出力)をbedrock-mantleに送信している(bedrock-runtimeの Converse/InvokeModel を使用してください)
デバッグ:
# Check model-specific requirements
aws bedrock get-foundation-model \
--model-identifier anthropic.claude-sonnet-5 \
--query 'modelDetails.[inferenceTypesSupported,modelLifecycle.status]'