- S3 VectorsはAWSネイティブのベクトル検索機能。S3バケット上で直接ベクトルのCRUD・検索が可能
- Pineconeと比較して最大95%のコスト削減。既存のS3エコシステムとシームレスに統合
- Amazon Bedrock + S3 VectorsでRAGアプリケーションを最も低コストに構築できる
RAG(Retrieval-Augmented Generation)アプリケーションの構築には、ベクトルデータベースが不可欠です。しかしこれまで、PineconeやQdrantなどの専用ベクトルDBは追加のインフラ管理とコストが必要でした。
2026年、AWSがこの課題を根本から解決しました。S3 Vectorsは、世界で最も使われているオブジェクトストレージであるS3にネイティブなベクトル検索機能を追加するサービスです。本記事では、S3 Vectorsの仕組みからRAGアプリケーションの構築手順まで、SESエンジニア向けに実践的に解説します。
- S3 Vectorsのアーキテクチャと従来のベクトルDBとの違い
- セットアップからPythonでのCRUD操作の実装手順
- Amazon Bedrock × S3 VectorsによるRAGアプリケーション構築
S3 Vectorsとは?従来のベクトルDBとの違い
S3ネイティブでベクトル検索が可能になった背景
S3 Vectorsは、AWS公式ブログで発表されたS3の新機能で、ベクトルデータの書き込み・更新・削除・検索をS3上で直接行うことができます。
従来、ベクトル検索を実現するには以下のような選択肢がありました。
- 専用ベクトルDB: Pinecone、Qdrant、Weaviate(別途インフラ管理が必要)
- DBの拡張機能: pgvector(PostgreSQL)、OpenSearch(Elasticsearchベース)
- マネージドサービス: Amazon OpenSearch Serverless(コストが高い)
S3 Vectorsの登場により、S3バケットにベクトルインデックスを作成するだけでベクトル検索が利用可能になりました。追加のインフラ管理は不要です。
OpenSearch / Pinecone / pgvector との比較
| 項目 | S3 Vectors | Pinecone | OpenSearch Serverless | pgvector |
|---|---|---|---|---|
| 管理負荷 | ほぼゼロ | 低い | 中程度 | 高い |
| スケーラビリティ | 無制限(S3ベース) | 高い | 高い | 制限あり |
| 月額コスト(100万ベクトル) | 約$5〜15 | 約$70〜200 | 約$200〜500 | EC2コスト依存 |
| レイテンシ | 50〜200ms | 10〜50ms | 20〜100ms | 5〜30ms |
| AWS統合 | ネイティブ | APIのみ | ネイティブ | EC2上で運用 |
| メタデータフィルタ | ✅ | ✅ | ✅ | ✅ |
S3 Vectorsの最大の強みは圧倒的なコスト効率です。Pineconeと比較して最大95%のコスト削減が可能です。一方、レイテンシは専用ベクトルDBに劣るため、リアルタイム性が最重要でない用途(RAG、ドキュメント検索、レコメンデーション等)に最適です。

S3 Vectorsのアーキテクチャと仕組み
ベクトルインデックスの構造
S3 Vectorsは、S3バケット内にベクトルインデックスを作成する形で動作します。
s3://my-bucket/
├── documents/ # 通常のS3オブジェクト
│ ├── doc1.pdf
│ └── doc2.pdf
└── .vectors/ # ベクトルインデックス(自動管理)
└── my-index/
├── index.hnsw # HNSWインデックス
└── metadata/ # メタデータストア
ベクトルインデックスは**HNSW(Hierarchical Navigable Small World)**アルゴリズムを採用しており、高次元ベクトルの近似最近傍探索を効率的に実行します。
書き込み・検索のAPI概要
S3 VectorsのAPIは、AWS SDK(boto3)から利用できます。主要なオペレーションは以下の通りです。
| オペレーション | 説明 | API |
|---|---|---|
| CreateVectorIndex | ベクトルインデックスの作成 | create_vector_index() |
| PutVector | ベクトルの書き込み・更新 | put_vector() |
| GetVector | IDによるベクトル取得 | get_vector() |
| DeleteVector | ベクトルの削除 | delete_vector() |
| QueryVectors | 類似ベクトル検索 | query_vectors() |
料金体系とコスト試算
S3 Vectorsの料金は以下の構成です。
- ストレージ: $0.023/GB/月(S3 Standardと同じ)
- 書き込みリクエスト: $0.005/1,000リクエスト
- 検索リクエスト: $0.01/1,000リクエスト
- インデックス維持: $0.10/100万ベクトル/月
コスト試算例(100万ベクトル、1日1,000検索の場合):
| コスト項目 | 月額 |
|---|---|
| ストレージ(約5GB) | $0.12 |
| 書き込み(初回のみ) | $5.00 |
| 検索(30,000回/月) | $0.30 |
| インデックス維持 | $0.10 |
| 合計 | 約$5.52/月 |
同等の構成をPineconeで構築した場合の月額$70〜200と比較すると、劇的なコスト削減が実現できます。
S3 Vectorsのセットアップ手順
バケット作成とベクトルインデックス設定
import boto3
s3_vectors = boto3.client('s3vectors')
# ベクトルインデックスの作成
response = s3_vectors.create_vector_index(
Bucket='my-rag-bucket',
IndexName='document-embeddings',
Dimension=1536, # Embeddingモデルの次元数
Metric='cosine', # 類似度メトリクス
Config={
'HnswConfig': {
'M': 16, # HNSWの接続数
'EfConstruction': 200 # 構築時の探索幅
}
},
MetadataSchema={
'Fields': [
{'Name': 'title', 'Type': 'string'},
{'Name': 'category', 'Type': 'string'},
{'Name': 'created_at', 'Type': 'datetime'}
]
}
)
print(f"Index created: {response['IndexArn']}")
Embeddingモデルの選定(Amazon Titan / OpenAI / Cohere)
ベクトル検索の精度はEmbeddingモデルの選定に大きく依存します。
| モデル | 次元数 | 日本語対応 | コスト | おすすめ用途 |
|---|---|---|---|---|
| Amazon Titan Embeddings V2 | 1024 | ◎ | $0.00002/1K tokens | AWSネイティブ環境 |
| OpenAI text-embedding-3-large | 3072 | ○ | $0.00013/1K tokens | 最高精度が必要な場合 |
| Cohere embed-multilingual-v4 | 1024 | ◎ | $0.00010/1K tokens | 多言語対応 |
| Amazon Titan Embeddings V2(256次元) | 256 | ◎ | $0.00002/1K tokens | コスト最優先 |
AWS環境でのおすすめは Amazon Titan Embeddings V2です。Bedrockから直接呼び出せるため追加の認証設定が不要で、コストも最安クラスです。
PythonからのCRUD操作実装
import boto3
import json
s3_vectors = boto3.client('s3vectors')
bedrock = boto3.client('bedrock-runtime')
def get_embedding(text: str) -> list[float]:
"""Amazon Titan Embeddings V2でテキストをベクトル化"""
response = bedrock.invoke_model(
modelId='amazon.titan-embed-text-v2:0',
body=json.dumps({
'inputText': text,
'dimensions': 1024
})
)
return json.loads(response['body'].read())['embedding']
# ベクトルの書き込み
def put_document(doc_id: str, text: str, metadata: dict):
embedding = get_embedding(text)
s3_vectors.put_vector(
Bucket='my-rag-bucket',
IndexName='document-embeddings',
VectorId=doc_id,
Vector=embedding,
Metadata=metadata
)
# 類似検索
def search_similar(query: str, top_k: int = 5):
query_embedding = get_embedding(query)
response = s3_vectors.query_vectors(
Bucket='my-rag-bucket',
IndexName='document-embeddings',
QueryVector=query_embedding,
TopK=top_k,
IncludeMetadata=True
)
return response['Results']
# 使用例
put_document(
doc_id='doc-001',
text='SESエンジニアがAWS資格を取得するメリットと勉強法',
metadata={
'title': 'AWS資格取得ガイド',
'category': 'キャリア',
'created_at': '2026-03-30T00:00:00Z'
}
)
results = search_similar('AWSの資格を取りたい')
for result in results:
print(f"Score: {result['Score']:.4f} - {result['Metadata']['title']}")
実践:RAGアプリケーションをS3 Vectorsで構築
Amazon Bedrock × S3 Vectors の連携パターン
Amazon BedrockのKnowledge Basesは、S3 Vectorsをネイティブでサポートしています。Bedrockの管理コンソールからワンクリックでS3 Vectorsベースのナレッジベースを構築できます。
bedrock_agent = boto3.client('bedrock-agent')
# Knowledge Baseの作成(S3 Vectors連携)
response = bedrock_agent.create_knowledge_base(
name='company-docs-kb',
description='社内ドキュメントのナレッジベース',
knowledgeBaseConfiguration={
'type': 'VECTOR',
'vectorKnowledgeBaseConfiguration': {
'embeddingModelArn': 'arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-embed-text-v2:0'
}
},
storageConfiguration={
'type': 'S3_VECTORS',
's3VectorsConfiguration': {
'bucketName': 'my-rag-bucket',
'indexName': 'document-embeddings'
}
}
)
ドキュメント取り込みパイプラインの実装
RAGの品質はチャンキング(文書分割)戦略に大きく左右されます。
from langchain.text_splitter import RecursiveCharacterTextSplitter
def ingest_documents(s3_bucket: str, prefix: str):
"""S3上のドキュメントをベクトル化して取り込み"""
# チャンキング設定
splitter = RecursiveCharacterTextSplitter(
chunk_size=512, # チャンクサイズ
chunk_overlap=50, # オーバーラップ
separators=["\n\n", "\n", "。", "、", " "]
)
s3 = boto3.client('s3')
objects = s3.list_objects_v2(Bucket=s3_bucket, Prefix=prefix)
for obj in objects.get('Contents', []):
# ドキュメントの読み込み
response = s3.get_object(Bucket=s3_bucket, Key=obj['Key'])
text = response['Body'].read().decode('utf-8')
# チャンキング
chunks = splitter.split_text(text)
# 各チャンクをベクトル化して保存
for i, chunk in enumerate(chunks):
doc_id = f"{obj['Key']}-chunk-{i}"
put_document(
doc_id=doc_id,
text=chunk,
metadata={
'source': obj['Key'],
'chunk_index': str(i),
'category': 'document'
}
)
print(f"Ingested {len(objects.get('Contents', []))} documents")
セマンティック検索の精度チューニング
ベクトル検索の精度を向上させるためのチューニングポイントです。
1. チャンクサイズの最適化:
- 短すぎる(128トークン以下): 文脈が失われる
- 長すぎる(1024トークン以上): ノイズが増える
- 推奨: 256〜512トークン、オーバーラップ10〜20%
2. メタデータフィルタの活用:
# カテゴリでフィルタしてから検索
results = s3_vectors.query_vectors(
Bucket='my-rag-bucket',
IndexName='document-embeddings',
QueryVector=query_embedding,
TopK=10,
Filter={
'category': {'eq': 'technical-docs'}
}
)
3. ハイブリッド検索の実装: ベクトル検索(セマンティック)と全文検索(キーワード)を組み合わせることで、検索精度を大幅に向上させることができます。
SESエンジニアとしてS3 Vectors案件を獲るには
求められるスキルセット
S3 Vectors関連の案件で求められるスキルを優先度順に整理します。
必須:
- Python(boto3でのAWS SDK操作)
- S3の基本操作(バケット管理、IAMポリシー設計)
- Embeddingの基本概念(ベクトル化、類似度計算)
推奨:
- Amazon Bedrockの利用経験
- LangChain / LlamaIndexの利用経験
- RAGアーキテクチャの設計・実装経験
差別化:
- ベクトルDBの比較・選定経験(Pinecone、pgvector等からの移行)
- 大規模データの前処理・チャンキング最適化
- MLOps(モデルのバージョン管理、A/Bテスト)
案件獲得のアピールポイント
面談では以下のポイントをアピールすると効果的です。
- コスト意識: 「Pineconeからの移行で月額コストを90%削減した」等の具体的数字
- 実装経験: GitHubにRAGアプリケーションのサンプルコードを公開
- AWS資格: Machine Learning SpecialtyまたはData Engineer Associate
- ビジネス理解: RAGの活用シーンを業務課題と紐づけて説明できる
まとめ:S3 VectorsがAIアプリ開発の標準になる理由
S3 Vectorsは、ベクトル検索のコストとインフラ管理のハードルを劇的に下げるサービスです。すでにS3を利用しているプロジェクトであれば、追加のインフラなしでRAGアプリケーションを構築できます。
- S3ネイティブのベクトル検索で追加インフラ管理が不要
- Pinecone比で最大95%のコスト削減
- Amazon BedrockとのネイティブS3 Vectors連携でRAG構築が容易
- SESエンジニアにとって新しい高付加価値スキルの獲得チャンス
**SES BASEでは、AWS・AI関連の案件を多数掲載しています。**S3 VectorsやRAG構築のスキルを活かせる案件をチェックしてみてください。
関連記事: