mcpField
B
bedrock

bedrock

github.com/itsmostafa開発1.2k174 回インストール2 日前に更新
リポジトリ

bedrock について

Amazon Bedrock で生成 AI アプリケーションを構築する開発者向けのガイドです。基盤モデルの推論、埋め込み、画像生成に加え、モデルアクセス、ナレッジベース、推論タイプ、CLI、トラブルシューティングを扱います。

主な機能

  1. 01複数プロバイダーの基盤モデル呼び出し
  2. 02テキスト生成、埋め込み、画像生成
  3. 03ストリーミング応答と複数ターン会話
  4. 04ナレッジベース検索と RAG
  5. 05モデルアクセスとライフサイクルの説明
  6. 06CLI 操作とトラブルシューティング

活用シーン

  1. 01アプリでテキストや画像を生成
  2. 02テキストから埋め込みを作成
  3. 03複数ターンのモデル会話を構築
  4. 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.awsOpenAI 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-accessAnthropic の初回利用ケースフォームを送信する
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-generateRAG クエリ

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]'

参考資料

コメント