※記載の料金は2026年2月時点のものです。最新情報は公式ページをご確認ください。
Amazon S3 Vectors とは、2025年7月にプレビュー、2025年12月にGA(一般提供)となったS3の新機能で、ベクトルデータのストレージとクエリをネイティブにサポートするものです。
これを Amazon Bedrock Knowledge Base のベクトルストアとして利用することで、従来の選択肢と比べて大幅にコストを抑えたRAG(検索拡張生成)環境を構築できます。
本記事では、従来のベクトルストアが抱えていた課題と、S3 Vectorsがそれをどう解決するのかについて書いていきます。
Bedrock Knowledge Baseでは、ベクトルストアとしていくつかの選択肢がありました。 代表的なものとして OpenSearch Serverless と Aurora Serverless(pgvector) がありますが、どちらにも悩ましい問題がありました。
OpenSearch Serverlessは、Bedrock Knowledge Baseのクイック作成で自動的に選択されるベクトルストアです。
名前を一見するとサーバーレスなので使った分だけ課金されるように思えますが、実際にはOCU(OpenSearch Compute Unit)が常時確保されるため、使っていなくても常時コストが発生し、東京リージョンでは最低でも月額$240程度かかります。
検証環境やPoC段階でこのコストは正直つらいです。 Knowledge Baseをクイック作成して放置していたら思わぬ請求が来た...という話も割と聞きます。
コストを抑えるためにAurora Serverless v2を使い、最小キャパシティを0に設定する方法もあります。 pgvector拡張を使えばベクトル検索が可能で、使っていない時間帯はスケールダウンしてくれます。
ただし、最小キャパシティを0にするとコールドスタートが発生します。
コールドスタートとは、しばらくアクセスがない状態からの最初のクエリに時間がかかる現象のことです。
これはユーザー体験を損なう可能性があります。
コスト最適化とレスポンス速度のトレードオフに悩まされる構成でした。
S3 Vectorsは、S3のストレージエンジンにベクトル検索機能をネイティブに統合したものです。
主な特徴は以下のとおりです。(公式発表より)
| 項目 | 内容 |
|---|---|
| ストレージ | ベクトルバケットという専用のバケットタイプ |
| スケール | 1インデックスあたり最大20億ベクトル、1バケットあたり最大10,000ベクトルインデックス |
| クエリ性能 | コールドクエリで1秒未満、ウォームクエリで約100ms |
| コスト削減 | 従来のベクトルDBと比較して最大90%削減 |
| リージョン | 東京を含む14リージョンで利用可能 |
従来のベクトルDBはインデックスをメモリに保持するためのプロビジョニングコストが24時間発生していましたが、S3 Vectorsではストレージとコンピュートが分離されているため、このコストがかかりません。
使った分だけ課金される、本当の意味でのサーバーレスなベクトルストアです。
Bedrock Knowledge Baseとの統合は非常にシンプルです。
Bedrockコンソールからナレッジベースを作成します。
ベクトルストアとして「S3ベクトルバケット」を選択します。 「新しいベクトルストアをクイック作成」を選べば、以下が自動的に設定されます。
ソースドキュメントが格納されているS3バケットを指定します。 そして、ソースファイルをこのバケットにアップロードします。
今回は、過去の弊社の会社案内のPDFをアップロードしてみました。
同期を実行すると、Bedrockが以下を自動で処理します。
基本的にはベクトルストアにOpenSearch Serverless等を選んでいた部分をS3 Vectorsに変えるだけなので、既にBedrock Knowledge Baseを使ったことがある方ならすぐに移行できると思います。
Bedrockコンソールから直接クエリをテストできます。 Retrieve APIやRetrieveAndGenerate APIを使ってプログラムからアクセスすることも可能です。
コードのイメージは以下のとおりです。
import boto3
# リージョン設定
REGION = "ap-northeast-1"
# Bedrock Agent Runtimeクライアントを作成
bedrock_agent_runtime = boto3.client("bedrock-agent-runtime", region_name=REGION)
# ナレッジベースID(ARNから抽出するか、Webコンソールで確認)
KNOWLEDGE_BASE_ID = "****"
# クエリテキスト
query_text = "アジアクエストとはどんな会社ですか?"
print(f"クエリ: {query_text}")
# ナレッジベースをクエリ
response = bedrock_agent_runtime.retrieve(
knowledgeBaseId=KNOWLEDGE_BASE_ID,
retrievalQuery={
"text": query_text
},
retrievalConfiguration={
"vectorSearchConfiguration": {
"numberOfResults": 5
}
}
)
# 結果を表示
print("検索結果:")
for i, result in enumerate(response.get("retrievalResults", []), 1):
print(f"\n--- 結果 {i} ---")
content = result.get("content", {}).get("text", "")
print(f"内容: {content[:500]}..." if len(content) > 500 else f"内容: {content}")
location = result.get("location", {})
if location:
print(f"ソース: {location}")
score = result.get("score")
if score:
print(f"スコア: {score}")
実行するとこんな感じで検索結果が返ってきました。
$python query.py
クエリ: アジアクエストとはどんな会社ですか?
--------------------------------------------------
検索結果:
--- 結果 1 ---
内容: サイト アプリ アジアクエスト株式会社は お客様のデジタルトランスフォーメーションを支援するデジタルインテグレーターです UI/UX デジタルトランスフォーメーショsiaQuest会社名 アジアクエスト株式会社 代表者名 桃井 純 設立 2012 年 4 月 東京本社 東京都千代田区飯田橋 3-11-13 飯田橋 i-MARK ANNEX 6F 福岡オフィス 福岡県福岡市中央区天神 2-8-30 天神西通りビジネスセンター 5F 別府オフィス
ソース: {'s3Location': {'uri': 's3://myhome-knowledgebase-vectors/companybrochure0422.pdf'}, 'type': 'S3'}
スコア: 0.5874110850610859
...以下省略...
東京リージョンでの概算です。
OCU(OpenSearch Compute Unit)は東京リージョンで1時間あたり$0.334で課金されます。
| 項目 | コスト |
|---|---|
| 本番構成(2 OCU、冗長性あり) | $0.334 × 2 OCU × 24h × 30日 = 約$481/月 |
| Dev/Test構成(1 OCU、冗長性なし) | $0.334 × 1 OCU × 24h × 30日 = 約$240/月 |
| 備考 | 使用していなくても常時課金 |
※ 初回コレクション作成時にデフォルトで4 OCUがインスタンス化されます。冗長性ありの場合はスケールダウンしても最小2 OCU、冗長性なし(Dev/Test)の場合は最小1 OCU(0.5 OCU × 2)まで下がります。(公式ドキュメント)
ACU(Aurora Capacity Unit)は東京リージョンで1時間あたり$0.15(Aurora Standard)で課金されます。
| 項目 | コスト |
|---|---|
| 最小構成(0.5 ACU) | $0.15 × 0.5 ACU × 24h × 30日 = 約$54/月 |
| 0 ACU(アイドル時停止) | アイドル時は$0だがコールドスタートが発生 |
| 備考 | 0 ACU設定ならアイドル時の課金はなし、ただし復帰に時間がかかる |
※ 最小ACUを0に設定すればアイドル時のコストは抑えられますが、アクセス再開時にコールドスタートが発生します。(公式ブログ)
| 項目 | コスト |
|---|---|
| ストレージ | $0.06/GB/月 |
| 書き込み(PUT) | $0.20/GB |
| クエリ | $2.50/100万クエリ + クエリ処理量に応じた課金 |
例えば1,000万ベクトル(1024次元、メタデータ0.5KB、キー0.1KB想定)を格納した場合、1ベクトルあたり約4.7KBの論理ストレージとなり、S3 Vectorsのストレージコストは$0.06 × 約47GB = 月額約$3程度です。 OpenSearch ServerlessのDev/Test構成(約$240/月)と比較してもストレージだけで数十分の1のコストで運用できます。
PoCや社内向けチャットボットなど、常時大量のクエリが発生しないユースケースでは特にコストメリットが大きいです。
S3 Vectorsは万能ではなく、いくつかの制限があります。
| 制限項目 | 詳細 |
|---|---|
| 検索タイプ | セマンティック検索のみ(ハイブリッド検索は非対応) |
| レイテンシー | コールドクエリで1秒未満(OpenSearchの20〜300msと比較すると遅め) |
| メタデータ | フィルタ可能メタデータは最大2KB、総メタデータは最大40KB/ベクトル |
| メタデータキー | 最大50個(うちフィルタ不可能キーは最大10個) |
| ベクトル型 | 浮動小数点ベクトルのみ(バイナリベクトル非対応) |
| 次元数 | 最大4,096次元 |
※ Bedrock Knowledge Base経由で利用する場合、メタデータに関してはさらに制約がある場合があります。(公式制限事項)
リアルタイムでの低レイテンシが厳しく要求されるユースケースや、 ハイブリッド検索(キーワード検索+セマンティック検索の組み合わせ)が必要な場合はOpenSearchの方が適している場合もあります。 (OpenSearchだと20ms~300msくらいでの応答が目安になる)
用途に応じて選択するのが良いと思います。
ベクトル検索には弱点があり精度を高めるためには、ハイブリッド検索やチューニングの工夫が必要になるケースも多いです。
S3 VectorsにはOpenSearch Serverlessへのエクスポート機能があり、ワンクリックでS3ベクトルインデックスをOpenSearch Serverlessのコレクションにエクスポートできます。 そのため、まずはS3 Vectorsで低コストに始めて、将来的に高性能な検索が必要になった段階でOpenSearchに切り替えるという段階的なアプローチも可能です。
S3 Vectorsの登場によって、RAGのベクトルストアにおけるコスト面のハードルがかなり下がりました。
特にPoCや検証段階で「ベクトルストアのコストが地味に痛い」と感じていた方には嬉しい選択肢だと思います。
OpenSearch Serverlessの常時課金やAurora Serverlessのコールドスタートに悩んでいた方は、一度S3 Vectorsを試してみてはいかがでしょうか。
弊社では生成AIを活用したソリューションの導入支援を行っておりますので、ご興味のある方はぜひお問い合わせください。