10月13日、AWSが「Accessing OpenAI GPT models on Amazon Bedrock with global cross-Region inference in Thailand, Malaysia, Singapore, Indonesia, and Taiwan」と題した記事を公開した。OpenAIモデルをAWS基盤から呼び出せるだけでなく、既存のOpenAIクライアントコードはベースURLとAPIキーを差し替えるだけで動作するという移行の容易さが注目点だ。タイ・マレーシア・シンガポール・インドネシア・台湾の5リージョンを対象に、グローバルクロスリージョン推論経由でGPTモデルを利用する方法を詳細に解説している。
OpenAI GPT-6モデルがAmazon BedrockのアジアパシフィックリージョンからAPI呼び出し可能に
Amazon Bedrockでは現在、GPT-6 Sol・GPT-6 Luna・GPT-6 Astraの3モデルを「グローバルクロスリージョン推論(global cross-Region inference)」経由で提供している。なお、元記事URLのパスにはgpt-modelsと記載されており、バージョン表記(GPT-6)は元記事本文のモデル名・プロファイルID(global.openai.gpt-6-sol等)に基づいている。これら3モデルはいずれもOpenAIとAWSの連携により新たにBedrockに追加された世代のモデル群であり、一般ユーザーにはまだ馴染みが薄い可能性がある点は留意されたい。
シングルリージョン推論はローカルキャパシティを超えた需要でスロットリングが発生するが、グローバルクロスリージョン推論はその問題を回避する仕組みだ。利用可能なソースリージョンとプロファイルIDは以下の通りだ。
| プロファイルID | ソースリージョン |
|---|---|
global.openai.gpt-6-sol / global.openai.gpt-6-luna |
シンガポール (ap-southeast-1)、ジャカルタ (ap-southeast-3)、マレーシア (ap-southeast-5)、タイ (ap-southeast-7)、台北 (ap-east-2) |
global.openai.gpt-6-astra |
シンガポール (ap-southeast-1) のみ |
デスティネーションリージョン(実際の処理が走るリージョン)はAmazon Bedrockが自動選択する。請求・クォータトラッキング・CloudTrail・CloudWatchはすべてソースリージョンに留まるため、データの所在について混乱が生じにくい設計になっている。
各モデルの特性と主なユースケースは以下の通りだ。
| モデル | 特性 | 向いているユースケース |
|---|---|---|
| GPT-6 Sol | 高度な推論・コーディング能力 | 複雑なロジック生成、技術的な問い合わせへの回答 |
| GPT-6 Luna | 反復処理に強い高スループット設計 | 大量ドキュメントの分類・要約、バッチ処理 |
| GPT-6 Astra | 複雑な推論・コーディング・長文書処理 | 長大なコードベース解析、長文レポート生成 |
3モデルともテキストと画像入力、クライアントサイドのツール使用、プロンプトキャッシングをサポートする。推論エフォートレベル(none / low / medium / high / xhigh / max)を指定できるが、GPT-6 Astraはnoneを受け付けない点に注意が必要だ。
3つのアクセスパスと実装コード
各モデルへのアクセスパスはConverse API・OpenAI Chat Completions API・OpenAI Responses APIの3種類。いずれもbedrock-runtimeエンドポイントを使い、model IDの代わりにグローバルクロスリージョン推論プロファイルIDを渡すだけでよい。
Converse APIでの呼び出し
import logging
import os
import boto3
REGION = os.environ.get("AWS_REGION", "ap-southeast-1")
PROFILE_ID = os.environ.get("BEDROCK_PROFILE_ID", "global.openai.gpt-6-sol")
PROMPT = (
"In three bullet points, explain when a workload should use "
"cross-Region inference instead of calling a model in a single Region."
)
logging.basicConfig(format="%(levelname)s %(message)s")
log = logging.getLogger("bedrock-cris")
log.setLevel(logging.INFO)
client = boto3.client("bedrock-runtime", region_name=REGION)
response = client.converse(
modelId=PROFILE_ID,
messages=[{"role": "user", "content": [{"text": PROMPT}]}],
inferenceConfig={"maxTokens": 1024},
# GPT-6 Sol/Lunaはnone〜maxを受け付ける。GPT-6 AstraはnoneをReject
additionalModelRequestFields={"reasoning": {"effort": "low"}},
)
text = "".join(b["text"] for b in response["output"]["message"]["content"] if "text" in b)
log.info("Response:\n%s", text)
AccessDeniedExceptionが出た場合はIAMポリシー、ValidationExceptionはモデルIDがグローバルクロスリージョン推論プロファイルでないことを示す。
OpenAI Chat Completions APIでの呼び出し
既存のOpenAIクライアントをそのまま流用する場合は、base_urlをBedrockのリージョナルエンドポイントに向け、api_keyをAWSの一時トークンに差し替えるだけでよい。
from aws_bedrock_token_generator import provide_token
from openai import OpenAI
REGION = os.environ.get("AWS_REGION", "ap-southeast-1")
PROFILE_ID = os.environ.get("BEDROCK_PROFILE_ID", "global.openai.gpt-6-sol")
# provide_tokenはAWS認証情報から最大12時間有効な短期トークンを生成する
client = OpenAI(
base_url=f"https://bedrock-runtime.{REGION}.amazonaws.com/openai/v1",
api_key=provide_token(region=REGION),
)
response = client.chat.completions.create(
model=PROFILE_ID,
messages=[{"role": "user", "content": "List three uses for a message queue."}],
max_completion_tokens=256,
)
ここで使用しているaws-bedrock-token-generatorは、AWS公式ブログのサンプルコードで参照されているパッケージだ。pip install boto3 openai aws-bedrock-token-generatorでインストールできる。なお、PyPI上のパッケージ詳細や最新バージョンはPyPI: aws-bedrock-token-generatorで確認されたい。
既存OpenAIクライアントから移行する際の注意点は3つ。
- 前回レスポンスを参照するリクエストを含め、全リクエストに
modelパラメータを明示的に設定する - 使用できるツールタイプは
function・mcp・custom・namespace・tool_searchに限定される - モデルIDはクライアントに直接設定し、
/modelsエンドポイントへのクエリで取得しようとしない
Codex CLIからの利用
~/.codex/config.tomlに以下を記述することで、Codex CLIからBedrockのGPT-6 Astraを呼び出せる。なおCodex CLI 0.148以降が必要だ。この設定はCodex CLI専用であり、ChatGPTデスクトップアプリ自体の設定とは独立している点に注意されたい。
model = "global.openai.gpt-6-astra"
model_provider = "amazon-bedrock-runtime"
[model_providers.amazon-bedrock-runtime.aws]
region = "ap-southeast-1"
SigV4署名を使うため、ローテーションすべきキーが存在しない点もメリットだ。
IAM設定とSCPの落とし穴
グローバルクロスリージョン推論を呼び出すIAMポリシーには4つのステートメントが必要だ。
- ソースリージョンの推論プロファイルとプロジェクトリソースへのアクセス
- ソースリージョンのファンデーションモデルへのアクセス(推論プロファイルスコープ付き)
- リージョン非依存ARN(
arn:aws:bedrock:::foundation-model/openai.gpt-6-sol)への許可(aws:RequestedRegionをunspecifiedに設定) - APIキー認証のための
bedrock:CallWithBearerToken
特に**SCP(サービスコントロールポリシー)との組み合わせ**は注意が必要だ。グローバルクロスリージョン推論リクエストにはリージョン名が付かず、AWSはaws:RequestedRegionをunspecifiedに設定する。そのため、SCPでリージョン許可リストを設定している企業アカウントでは最初の呼び出しが失敗するケースが多い。エラーメッセージにはポリシータイプしか表示されず、どのポリシーが原因かわからないため、デバッグに手間取りやすい。
解決策は許可リストを単純に広げるのではなく、bedrock:InferenceProfileArn条件キーでarn:aws:bedrock:*:*:inference-profile/global.*にマッチするリクエストだけを例外として許可するSCPを構成することだ。
クォータ管理とモニタリング
ジャカルタ・マレーシア・タイ・台北はオプトインリージョンのため、利用前にAWSアカウントでリージョンの有効化が必要だ(シンガポールはデフォルトで有効)。クォータ・CloudTrail・CloudWatchはすべてソースリージョンで管理されるため、モニタリングの設定変更は最小限で済む。