Amazon Bedrock API:GPT と Claude の連携
Runtime と Mantle の設定・権限を確認し、SDK・HTTP 要求、ストリーム、エラー、費用、データ保存を扱います。
このガイドが確認したこと
Amazon Bedrock 経由で OpenAI GPT と Anthropic Claude を利用する方法を扱います。公式文書の確認日は2026年10月17日です。サンプルはクラウド API に送信していません。特定アカウントのモデル接続、クォータ、承認済み環境を証明するものではありません。
実行例の認証情報、リージョン、モデル・プロファイル、アカウントの値は、プレースホルダーか環境変数から取得します。利用前にアカウント管理者が Bedrock コンソールと現在のモデルカードで確認してください。認証情報はサーバー側に置き、承認された秘密情報ストアかワークロードの識別を利用します。ブラウザーの配布物、画像、ログに含めません。
1. 接続構成を一式で選ぶ
エンドポイント、API、モデル識別子、リージョンは一組の設定です。ベース URL だけを変えると、不正な要求になったり、データの処理地域が変わったりします。AWS は、新規アプリケーションで必要なモデルと機能に対応している場合、Runtime を推奨しています。
| 経路 | SDK のベース URL | 現在の AWS カードにある識別子の例 |
|---|---|---|
| GPT-6.1 Sol、Runtime Responses/Chat | https://bedrock-runtime.{region}.amazonaws.com/openai/v1 |
us.openai.gpt-6.1-sol または global.openai.gpt-6.1-sol。対応する送信元リージョンが必要 |
| GPT-6.1 Sol、Mantle Responses/Chat | https://bedrock-mantle.us-east-1.api.aws/openai/v1 |
openai.gpt-6.1-sol。北バージニアのリージョン内接続 |
| Claude Sonnet 5、Runtime Messages | https://bedrock-runtime.{region}.amazonaws.com/anthropic |
us.anthropic.claude-sonnet-5、その他対応する地理単位プロファイル、または global.anthropic.claude-sonnet-5 |
| Claude Sonnet 5、Mantle Messages | https://bedrock-mantle.{region}.api.aws/anthropic |
anthropic.claude-sonnet-5。対応する Mantle リージョンを確認 |
これは文書にある識別子の例であり、アクセス可能性の証明ではありません。GPT-6.1 Sol と Claude Sonnet 5 は、Runtime での直接的なリージョン内呼び出しに対応しないため、対応するプロファイルを使います。地理単位と Global のルーティングでは、処理範囲が異なります。送信元エンドポイントを処理場所とみなさず、プロファイルの送信元と処理先リージョンを確認します。
Bedrock は非公開の GPT モデルと、オープンウェイトの gpt-oss モデルの両方に対応します。別のモデル系列であり、すべての設定を共用できるわけではありません。GPT OSS は Runtime の Chat Completions、Converse、Invoke に対応し、Responses は Mantle が必要です。Mantle のパス接頭辞も異なり、GPT-6.1 Sol は /openai/v1、一部モデルは /v1 を使います。個別カードの Programmatic Access を確認します。
2. アクセスと最小権限を準備する
AWS アカウント、対応リージョン、支払い・規約の前提、モデルの提供状況を確認します。一部の第三者モデルの有効化には AWS Marketplace 権限が必要です。管理者が一度有効化すれば、すべての実行者に購読権限を付ける必要はありません。有効化後もアカウントごとにアクセス条件が異なる場合があります。
Anthropic を Runtime で初めて使う場合は、用途フォームが必要です。現在のモデルアクセス文書では Mantle 経路はこの要件の対象外です。有効化に成功しても呼び出しが拒否される場合は、契約状態を確認します。未承認のアカウントやリージョンへの切り替えで解決しないでください。
認証と認可は別です。Runtime 推論には bedrock:InvokeModel、ストリームには bedrock:InvokeModelWithResponseStream が必要です。Runtime Responses はアカウントの既定 Project も認可対象とし、保存済み応答の取得、キャンセル、削除には別のアクションがあります。Mantle 推論は bedrock-mantle:CreateInference を使います。ポリシーを実際の対象に限定し、推論プロファイルの処理先権限と組織ポリシーも確認します。
本番では、対応する AWS 認証チェーンによる署名や短期 Bedrock bearer 認証情報を使います。Bedrock API キーは OpenAI や Anthropic の直接サービス用キーではありません。短期キーは IAM 権限を継承し、有効期限があります。長期キーは検証用途向けで、リージョンに紐付きます。生成した token は表示しません。以下の例は、すでに認可済みのサーバー環境を前提とします。
3. OpenAI SDK で最小の GPT リクエストを送る
アプリケーション環境に OpenAI SDK を導入します。承認された設定手順で BEDROCK_BASE_URL、BEDROCK_MODEL_ID、AWS_BEARER_TOKEN_BEDROCK を設定します。BEDROCK_MODEL_ID は Runtime では確認済みプロファイル、Mantle では確認済み基盤モデル ID です。任意の OpenAI 直接サービス用 ID は使えません。
import os
from openai import OpenAI
# Replace environment placeholders after checking the console/model card.
client = OpenAI(
base_url=os.environ["BEDROCK_BASE_URL"],
api_key=os.environ["AWS_BEARER_TOKEN_BEDROCK"],
)
response = client.responses.create(
model=os.environ["BEDROCK_MODEL_ID"],
input="Explain the difference between input and output tokens.",
max_output_tokens=512,
store=False,
)
print(response.output_text)
対応する HTTP 契約は POST <BEDROCK_BASE_URL>/responses です。Content-Type: application/json と Authorization: Bearer <BEDROCK_API_KEY> を指定します。JSON 本文には model、input、max_output_tokens、store を含めます。例は次のとおりです。
# Replace the model placeholder; BASE_URL/key must already be configured securely.
curl --fail-with-body "$BEDROCK_BASE_URL/responses" \
-H "Authorization: Bearer $AWS_BEARER_TOKEN_BEDROCK" \
-H "Content-Type: application/json" \
--data '{"model":"<VERIFIED_MODEL_OR_PROFILE_ID>","input":"Say hello.","max_output_tokens":512,"store":false}'
Chat Completions では /chat/completions と messages 配列を使い、choices[].message を読み取ります。Responses の input 本文を Chat Completions に送信しません。GPT-6.1 Sol のツール利用は、同じ Chat 契約と考えず、現在の Responses 対応に合わせて設計します。
4. ストリーミングはイベントのプロトコル
GPT Responses では stream=True を指定します。テキストは response.output_text.delta で届き、response.completed が完了を示します。エラー、失敗、未完了、予期しない切断を処理します。最初の token を受信しただけでは、業務完了ではありません。
# Uses the same verified client and model configuration as the previous example.
completed = False
for event in client.responses.create(
model=os.environ["BEDROCK_MODEL_ID"],
input="Explain token budgeting briefly.",
max_output_tokens=512, store=False, stream=True,
):
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
elif event.type == "response.completed":
completed = True
elif event.type in {"error", "response.failed", "response.incomplete"}:
raise RuntimeError("Generation did not complete")
if not completed:
raise RuntimeError("Stream ended without completion")
Chat Completions は Responses のイベントではなく、choices[].delta のチャンクを使います。Claude Messages はコンテンツブロックのイベント、AWS ConverseStream は別の AWS イベント構造を使います。パーサーは各 API に対応させます。HTTP で直接ストリームを受ける場合は "stream":true と SSE 対応クライアントを使います。curl -N は表示バッファを無効にするだけで、エラー回復は実装しません。
5. Claude:ネイティブ Messages または Bedrock Invoke/Converse
Anthropic SDK は末尾が /anthropic のベース URL を使い、/v1/messages を追加します。対応する Claude モデルでは、Runtime と Mantle の両方がこの経路を提供できます。
import os
from anthropic import Anthropic
# BASE_URL ends in /anthropic; MODEL_ID is verified for this endpoint/Region.
claude = Anthropic(
base_url=os.environ["BEDROCK_ANTHROPIC_BASE_URL"],
api_key=os.environ["AWS_BEARER_TOKEN_BEDROCK"],
)
with claude.messages.stream(
model=os.environ["BEDROCK_CLAUDE_MODEL_ID"],
max_tokens=512,
messages=[{"role":"user", "content":"Explain token budgeting briefly."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final_message = stream.get_final_message()
ネイティブ HTTP は POST <.../anthropic>/v1/messages です。x-api-key: <BEDROCK_API_KEY>、anthropic-version: 2023-06-01 を指定し、本文に model、messages、max_tokens、必要に応じて stream を含めます。
boto3 の invoke_model を使う場合、モデル・プロファイルは modelId 引数です。JSON 本文には "anthropic_version":"bedrock-2023-05-31" が必要です。このフィールドは、ネイティブ Messages HTTP のバージョンヘッダーとは異なります。Converse も別形式で、messages[].content[].text を使います。これらのペイロードを混用しません。
import json, os, boto3
# The approved AWS credential chain supplies signing credentials; no embedded keys.
runtime = boto3.client("bedrock-runtime", region_name=os.environ["AWS_REGION"])
result = runtime.invoke_model(
modelId=os.environ["BEDROCK_CLAUDE_MODEL_ID"],
contentType="application/json", accept="application/json",
body=json.dumps({
"anthropic_version":"bedrock-2023-05-31",
"max_tokens":512,
"messages":[{"role":"user", "content":"Say hello."}],
}),
)
body = json.loads(result["body"].read())
print(body["content"])
6. エラーを層ごとに調べる
| 症状 | 最初の確認 | 対応 |
|---|---|---|
| 400、非対応の経路・モデル | パス接頭辞、API 本文、プロファイル、機能対応 | 再試行前に設定を修正 |
| 403 / AccessDenied | IAM、Project、Marketplace・契約、FTU、アカウント接続 | 管理者と不足する権限・有効化を解決 |
| 無効・期限切れ認証、リージョン範囲のエラー | 認証期限、認証リージョン、署名コンテキスト | 承認済みの識別経路で更新 |
| 429 / throttling | アカウント・モデルのクォータ、同時実行、合計 token 需要 | 負荷を減らし、ジッター付きの上限ある待機 |
| 503 / 529 overload | 提供容量、応答ヘッダー、サービス状態 | 上限ある待機、返された Retry-After を尊重 |
| タイムアウト、ストリームの早期終了 | クライアント・プロキシ期限、ネットワークのアイドル期限、終了イベント | 未完了を記録し、再試行前に結果を確認 |
要求 ID、時刻、エンドポイント、モデル・プロファイル、状態、機密情報を除いた使用量を記録します。認証情報や機密プロンプト全文を既定でログに残しません。再試行回数と総経過時間を制限します。応答を失っても token 未消費とは証明できません。ツールによる業務書き込みには、独自の操作 ID と重複防止が必要です。
7. 費用とデータ処理を確認する
正確なモデル、ルーティング、サービス階層に対応する AWS 料金を使います。課金入力、出力、キャッシュ読み取り、書き込みを分けて計算し、検索、埋め込み、保存、ネットワーク、ツールなどの費用を加えます。総量に含まれるキャッシュ区分を重複計算しません。GPT-6.1 Sol には長文脈の閾値、キャッシュ単価、Standard/Ultrafast 料金があります。条件を調べずに OpenAI 直接料金を AWS の見積もりへ転用しません。
Responses は既定で store:true となり、会話の入出力を30日間保存します。ここでは store:false のため、previous_response_id で継続できません。アプリケーションログと呼び出しログは別に審査します。Runtime のクロスリージョン推論では、保存応答は処理を行ったリージョンに置かれ、送信元と異なる場合があります。
Runtime Responses は毎回 model が必要で、既定 Project のみに対応し、background:true は拒否します。アプリケーション推論プロファイルには非対応です。Runtime は OpenAI 互換 GET /models を提供しないため、Bedrock のコントロールプレーンの検出機能とモデルカードを使います。Mantle は機能や保存動作が異なります。
モデル固有の制限を、広い互換性の想定より優先します。GPT-6.1 Sol カードは Responses の統合 Guardrails を非対応とし、ほかにも非対応機能を列挙しています。Claude の構造化出力も API・エンドポイントで異なります。SDK 互換の要求だからといって、Bedrock のすべての制御が自動適用されるとは言えません。
本番前には、認可済み要求、無権限要求、非対応構成、完了するストリーム、依存先障害の模擬試験を行います。機密情報を除いた証拠、使用量の観測、復旧用構成を引き渡します。このガイドは文書に基づくもので、実アカウントやクラウド全体の受入試験に合格したという主張ではありません。