From claude-skills
Use Amazon S3 Vectors for cost-effective semantic search and RAG workloads. Use when: (1) building AI memory systems, knowledge bases, or Zettelkasten, (2) need vector search but Aurora/OpenSearch seems expensive, (3) evaluating AWS options for embeddings storage, (4) building Claude Code plugins with semantic search. S3 Vectors is 90% cheaper than specialized vector DBs, serverless, and integrates with Bedrock.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-skills:aws-s3-vectors-for-semantic-searchThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
When building AI applications requiring semantic search (RAG, knowledge bases, memory systems), developers often default
When building AI applications requiring semantic search (RAG, knowledge bases, memory systems), developers often default to:
S3 Vectors (GA December 2025) is often the better choice but less known.
Use S3 Vectors when:
| Feature | Value |
|---|---|
| GA Date | December 2025 |
| Max vectors/index | 2 billion |
| Max vectors/bucket | 20 trillion |
| Metadata keys | 50 per vector |
| Latency (frequent) | ~100ms |
| Latency (cold) | <1 second |
| Cost reduction | ~90% vs specialized vector DBs |
flowchart LR
subgraph App[Application]
CC[Claude Code / Lambda]
end
subgraph S3[S3 Bucket]
files["/content/*.md"]
vectors[S3 Vectors Index]
end
subgraph Bedrock
embed[Embeddings API]
end
CC -->|store content| files
CC -->|embed| Bedrock
Bedrock -->|vectors| vectors
CC -->|semantic query| vectors
# Vector with metadata (up to 50 keys)
{
"id": "note-123",
"embedding": [...], # 1536 floats for Titan, 1024 for multilingual-e5-large
"metadata": {
"title": "My Note Title",
"type": "permanent-note",
"topic": "machine-learning",
"tags": "embeddings,search", # comma-separated string
"relevance": 8,
"parent_id": "note-100",
"created_at": "2026-01-27",
"s3_key": "content/note-123.md"
}
}
| Component | Usage | Monthly |
|---|---|---|
| PUT (upload) | 10MB | $0.05 |
| Storage | 100MB | $0.02 |
| Queries | 3,000 | $1.50 |
| S3 (content) | 1GB | $0.02 |
| Bedrock embeddings | 1,000 | $0.10 |
| Total | $2-5 |
S3 Vectors lacks relational queries. Add Aurora if you need:
# 1. Create vector bucket
aws s3vectors create-vector-bucket --vector-bucket-name my-zettelkasten
# 2. Create index (cosine similarity, 1024 dims for multilingual-e5-large)
aws s3vectors create-index \
--vector-bucket-name my-zettelkasten \
--index-name notes-index \
--data-type float32 \
--dimension 1024 \
--distance-metric cosine
# 3. Insert vectors with metadata
aws s3vectors put-vectors \
--vector-bucket-name my-zettelkasten \
--index-name notes-index \
--vectors '[
{
"key": "learn-1",
"data": {"float32": [0.9, 0.1, ...]},
"metadata": {
"title": "ML Basics",
"type": "permanent-note",
"topic": "ml",
"tags": "ml,basics"
}
}
]'
# 4. Semantic search
aws s3vectors query-vectors \
--vector-bucket-name my-zettelkasten \
--index-name notes-index \
--top-k 5 \
--query-vector '{"float32": [0.88, 0.12, ...]}' \
--filter '{"type": {"$eq": "permanent-note"}}' \
--return-metadata \
--return-distance
# Returns ranked results with metadata and distance scores
import boto3
s3v = boto3.client('s3vectors')
# Query with metadata filter
response = s3v.query_vectors(
vectorBucketName='my-zettelkasten',
indexName='notes-index',
topK=5,
queryVector={'float32': embedding},
filter={'topic': {'$eq': 'ml'}},
returnMetadata=True,
returnDistance=True
)
for vec in response['vectors']:
print(f"{vec['key']}: {vec['metadata']['title']} (distance: {vec['distance']})")
{"field": {"$eq": "value"}} - supports $eq, $in, $gte, $lteaws s3vectors <command> (not aws s3 vectors)npx claudepluginhub cajias/claude-skills --plugin cc-plugin-authoringGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.